annotate 3rdparty/packages/uemacs/ueline1.c @ 995:48c646212b1c

'microEMACS' for OS-9. Posted to USENET net.micro.6809, 4-May-86. Picked up from Google groups
author roug
date Sun, 23 Feb 2003 21:26:32 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
995
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
1 /*
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
2 * The functions in this file are a general set of line management utilities.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
3 * They are the only routines that touch the text. They also touch the buffer
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
4 * and window structures, to make sure that the necessary updating gets done.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
5 * There are routines in this file that handle the kill buffer too. It isn't
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
6 * here for any good reason.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
7 *
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
8 * Note that this code only updates the dot and mark values in the window list.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
9 * Since all the code acts on the current window, the buffer that we are
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
10 * editing must be being displayed, which means that "b_nwnd" is non zero,
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
11 * which means that the dot and mark values in the buffer headers are nonsense.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
12 */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
13
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
14 #include <stdio.h>
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
15 #include "ueed.h"
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
16
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
17 #define NBLOCK 16 /* Line block chunk size */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
18 #define KBLOCK 256 /* Kill buffer block size */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
19
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
20 char *kbufp = NULL; /* Kill buffer data */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
21 int kused = 0; /* # of bytes used in KB */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
22 int ksize = 0; /* # of bytes allocated in KB */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
23
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
24 /*
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
25 * This routine allocates a block of memory large enough to hold a LINE
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
26 * containing "used" characters. The block is always rounded up a bit. Return
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
27 * a pointer to the new block, or NULL if there isn't any memory left. Print a
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
28 * message in the message line if no space.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
29 */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
30 LINE *lalloc(used)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
31 register int used;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
32 {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
33 register LINE *lp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
34 register int size;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
35
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
36 size = (used+NBLOCK-1) & ~(NBLOCK-1);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
37 if (size == 0) /* Assume that an empty */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
38 size = NBLOCK; /* line is for type-in. */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
39 if ((lp = (LINE *) malloc(sizeof(LINE)+size)) == NULL) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
40 mlwrite("Cannot allocate %d bytes", size);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
41 return (NULL);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
42 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
43 lp->l_size = size;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
44 lp->l_used = used;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
45 return (lp);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
46 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
47
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
48 /*
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
49 * Delete line "lp". Fix all of the links that might point at it (they are
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
50 * moved to offset 0 of the next line. Unlink the line from whatever buffer it
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
51 * might be in. Release the memory. The buffers are updated too; the magic
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
52 * conditions described in the above comments don't hold here.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
53 */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
54 lfree(lp)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
55 register LINE *lp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
56 {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
57 register BUFFER *bp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
58 register WINDOW *wp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
59
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
60 wp = wheadp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
61 while (wp != NULL) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
62 if (wp->w_linep == lp)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
63 wp->w_linep = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
64 if (wp->w_dotp == lp) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
65 wp->w_dotp = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
66 wp->w_doto = 0;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
67 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
68 if (wp->w_markp == lp) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
69 wp->w_markp = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
70 wp->w_marko = 0;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
71 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
72 wp = wp->w_wndp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
73 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
74 bp = bheadp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
75 while (bp != NULL) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
76 if (bp->b_nwnd == 0) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
77 if (bp->b_dotp == lp) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
78 bp->b_dotp = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
79 bp->b_doto = 0;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
80 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
81 if (bp->b_markp == lp) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
82 bp->b_markp = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
83 bp->b_marko = 0;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
84 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
85 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
86 bp = bp->b_bufp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
87 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
88 lp->l_bp->l_fp = lp->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
89 lp->l_fp->l_bp = lp->l_bp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
90 free((char *) lp);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
91 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
92
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
93 /*
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
94 * This routine gets called when a character is changed in place in the current
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
95 * buffer. It updates all of the required flags in the buffer and window
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
96 * system. The flag used is passed as an argument; if the buffer is being
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
97 * displayed in more than 1 window we change EDIT t HARD. Set MODE if the
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
98 * mode line needs to be updated (the "*" has to be set).
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
99 */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
100 lchange(flag)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
101 register int flag;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
102 {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
103 register WINDOW *wp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
104 if (curbp->b_nwnd != 1) /* Ensure hard. */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
105 flag = WFHARD;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
106 if ((curbp->b_flag&BFCHG) == 0) { /* First change, so */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
107 flag |= WFMODE; /* update mode lines. */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
108 curbp->b_flag |= BFCHG;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
109 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
110 wp = wheadp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
111 while (wp != NULL) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
112 if (wp->w_bufp == curbp)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
113 wp->w_flag |= flag;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
114 wp = wp->w_wndp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
115 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
116 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
117
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
118 /*
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
119 * Insert "n" copies of the character "c" at the current location of dot. In
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
120 * the easy case all that happens is the text is stored in the line. In the
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
121 * hard case, the line has to be reallocated. When the window list is updated,
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
122 * take special care; I screwed it up once. You always update dot in the
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
123 * current window. You update mark, and a dot in another window, if it is
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
124 * greater than the place where you did the insert. Return TRUE if all is
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
125 * well, and FALSE on errors.
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
126 */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
127 linsert(n, c)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
128 {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
129 register char *cp1;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
130 register char *cp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
131 register LINE *lp1;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
132 register LINE *lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
133 register LINE *lp3;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
134 register int doto;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
135 register int i;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
136 register WINDOW *wp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
137
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
138 lchange(WFEDIT);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
139 lp1 = curwp->w_dotp; /* Current line */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
140 if (lp1 == curbp->b_linep) { /* At the end: special */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
141 if (curwp->w_doto != 0) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
142 mlwrite("bug: linsert");
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
143 return (FALSE);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
144 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
145 if ((lp2=lalloc(n)) == NULL) /* Allocate new line */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
146 return (FALSE);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
147 lp3 = lp1->l_bp; /* Previous line */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
148 lp3->l_fp = lp2; /* Link in */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
149 lp2->l_fp = lp1;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
150 lp1->l_bp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
151 lp2->l_bp = lp3;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
152 for (i=0; i<n; ++i)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
153 lp2->l_text[i] = c;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
154 curwp->w_dotp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
155 curwp->w_doto = n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
156 return (TRUE);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
157 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
158 doto = curwp->w_doto; /* Save for later. */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
159 if (lp1->l_used+n > lp1->l_size) { /* Hard: reallocate */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
160 if ((lp2=lalloc(lp1->l_used+n)) == NULL)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
161 return (FALSE);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
162 cp1 = &lp1->l_text[0];
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
163 cp2 = &lp2->l_text[0];
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
164 while (cp1 != &lp1->l_text[doto])
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
165 *cp2++ = *cp1++;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
166 cp2 += n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
167 while (cp1 != &lp1->l_text[lp1->l_used])
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
168 *cp2++ = *cp1++;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
169 lp1->l_bp->l_fp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
170 lp2->l_fp = lp1->l_fp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
171 lp1->l_fp->l_bp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
172 lp2->l_bp = lp1->l_bp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
173 free((char *) lp1);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
174 } else { /* Easy: in place */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
175 lp2 = lp1; /* Pretend new line */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
176 lp2->l_used += n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
177 cp2 = &lp1->l_text[lp1->l_used];
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
178 cp1 = cp2-n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
179 while (cp1 != &lp1->l_text[doto])
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
180 *--cp2 = *--cp1;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
181 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
182 for (i=0; i<n; ++i) /* Add the characters */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
183 lp2->l_text[doto+i] = c;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
184 wp = wheadp; /* Update windows */
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
185 while (wp != NULL) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
186 if (wp->w_linep == lp1)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
187 wp->w_linep = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
188 if (wp->w_dotp == lp1) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
189 wp->w_dotp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
190 if (wp==curwp || wp->w_doto>doto)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
191 wp->w_doto += n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
192 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
193 if (wp->w_markp == lp1) {
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
194 wp->w_markp = lp2;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
195 if (wp->w_marko > doto)
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
196 wp->w_marko += n;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
197 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
198 wp = wp->w_wndp;
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
199 }
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
200 return (TRUE);
48c646212b1c 'microEMACS' for OS-9.
roug
parents:
diff changeset
201 }