|
|
1.1 root 1: #include <ctype.h>
2: #include <subcalls.h>
3: #include "ssedefs.h"
4:
5:
6:
7:
8: /*** creturn - handles carage return
9: *
10: * creturn breaks the line reference by linenum at the
11: * current cursor position and inserts the second half of
12: * the 'line' one line below.
13: *
14: * creturn()
15: *
16: * ENTRY - none
17: *
18: * creturn will EXIT the program by calling error25 if
19: * it is unable to add a line to the file or the number
20: * of lines in the file becomes greater than MAXLINES.
21: *
22: * EFFECTS TotalLines - by incrementing it once or twice
23: * EditBuffDirty - by clearing it if set
24: * LinesMarked - by clearing it if set
25: * CharsMarked - by clearing it if set
26: * MarkedChar - by clearing it if set
27: * MarkedLine - by clearing it if set
28: * LineTable - by insterting the second part of the line
29: * and via 'addline'
30: * CurRow - by incrementing it
31: * TopRow - by incrementing it
32: * CurCol - by setting it to zero
33: * EditBuff - by getting the second part of the line
34: * via 'getline'
35: * SegTable - by using free space for the both parts
36: * of the line via 'allocseg'
37: * by marking the segment containing the original
38: * line as needing compacting via 'deleteline'
39: * by marking the original line in the segment
40: * as being deleted. via 'deleteline'
41: * TotalSegs - via 'alloseg'
42: * memory - by allocating segments via 'allocseg'
43: * the screen - via 'drawscr'
44: */
45:
46:
47: void creturn()
48: {
49: register unsigned short i;
50: register unsigned short linenum;
51:
52: /* clear flags if set */
53: if (EditBuffDirty) { /* this call will change */
54: EditBuffDirty = 0; /* cursor line, so flush */
55: flushline((TopRow + CurRow), EditBuff); /* edit buffer if dirty */
56: }
57: /* clear flags if set */
58: if ( LinesMarked || CharsMarked ) {
59: LinesMarked = 0; /* if there's marked text */
60: CharsMarked = 0; /* around, clear it and */
61: for ( i = 0; i < MAXLINES; i++ ) /* redraw the screen */
62: MarkedLine[i] = 0;
63: for ( i = 0; i < LINESIZE; i++ )
64: MarkedChar[i] = 0;
65: }
66:
67: /* expand LineTable for second part of line */
68: linenum = TopRow + CurRow;
69: if ( !(linenum == TotalLines)) {
70: deleteline(linenum); /* mark orginal line as deleted */
71: for (i = TotalLines; i > (linenum +1); i--)
72: LineTable[i] = LineTable[i -1];
73: ++TotalLines;
74: }
75: else {
76: ++TotalLines;
77: ++TotalLines;
78: }
79:
80: /* find first non blank in first part of line to set new line length to it */
81: for (i = (CurCol -1); !isgraph(EditBuff[i]) && inline(i, 0); i--);
82: if ( (addline(linenum, (i +1), EditBuff) != 0) || !(TotalLines < MAXLINES))
83: error25(7);
84: /* call error mesage to save or quit */
85:
86: ++linenum;
87: /* find first non blank in second part of line to set new line length to it */
88: for (i = (LINESIZE -1); !(isgraph(EditBuff[i])) && inline(i, CurCol); i--);
89: if (addline(linenum, (i - CurCol +1), &EditBuff[CurCol]) != 0)
90: error25(7);
91: /* call error message to save or quit */
92:
93: /* move cursor to begining of the second part of the line */
94: if (CurRow < (PageSize - 1))
95: ++CurRow;
96: else
97: ++TopRow;
98: CurCol = 0;
99: VIOSETCURPOS(CurRow, CurCol, 0);
100: drawscr(TopRow);
101:
102: getline(linenum, EditBuff); /* set EditBuff to the current line */
103:
104: line25();
105: }
106:
107:
108:
109:
110: /*** ctrl_b - insert line below
111: *
112: * ctrl_b inserts a blank line below the current line
113: * and moves the cursor to the inserted line.
114: *
115: * ctrl_b ()
116: *
117: * ctrl_b expands LineTable to insert the new line below
118: * the current line and then inserts the new line via
119: * 'addline' with a length of zero. Also ctrl_b places
120: * the cursor on the insert line in the same column as
121: * the current line.
122: * ctrl_b will EXIT the program by calling error25 if
123: * it is unable to add a line to the file or the number
124: * of lines in the file becomes greater than MAXLINES.
125: *
126: * EFFECTS TotalLines - by incrementing it once or twice
127: * EditBuffDirty - by clearing it if set
128: * LinesMarked - by clearing it if set
129: * CharsMarked - by clearing it if set
130: * MarkedChar - by clearing it if set
131: * MarkedLine - by clearing it if set
132: * LineTable - by insterting the new line and via 'addline'
133: * CurRow - by incrementing it
134: * TopRow - by incrementing it
135: * EditBuff - by setting it to a line of blanks via 'getline'
136: * SegTable - by using free space for the new line
137: * via 'allocseg'
138: * by marking the current line in the segment
139: * as being deleted if it was changed. via
140: * 'fushline' via 'deleteline'
141: * TotalSegs - via 'alloseg'
142: * memory - by allocating segments via 'allocseg'
143: * the screen - via 'drawscr'
144: */
145:
146:
147: void ctrl_b()
148: {
149: register unsigned short i;
150:
151: if (EditBuffDirty) { /* this call will change */
152: EditBuffDirty = 0; /* cursor line, so flush */
153: flushline((TopRow + CurRow), EditBuff); /* edit buffer if dirty */
154: }
155:
156: if ( LinesMarked || CharsMarked ) {
157: LinesMarked = 0; /* if there's marked text */
158: CharsMarked = 0; /* around, clear it and */
159: for ( i = 0; i < MAXLINES; i++ ) /* redraw the screen */
160: MarkedLine[i] = 0;
161: for ( i = 0; i < LINESIZE; i++ )
162: MarkedChar[i] = 0;
163: }
164:
165: /* expand LineTable to insert the new line below */
166: for (i = TotalLines; i > (TopRow + CurRow +1); i--)
167: LineTable[i] = LineTable[i -1];
168: if ( (TopRow + CurRow) == TotalLines) {
169: ++TotalLines;
170: if ((addline(TopRow +CurRow, 0, 0) != 0) || !(TotalLines < MAXLINES))
171: error25(7);
172: /* call error message to save or quit */
173:
174: }
175: ++TotalLines;
176: if ((addline(TopRow + CurRow +1, 0, 0) != 0) || !(TotalLines < MAXLINES))
177: error25(7);
178: /* call error message to save or quit */
179:
180: /* place the cursor on the new line below */
181: if (CurRow < (PageSize - 1))
182: ++CurRow;
183: else
184: ++TopRow;
185:
186: /* redraw the screen with the new line below */
187: VIOSETCURPOS(CurRow, CurCol, 0);
188: drawscr(TopRow);
189:
190: getline( (TopRow + CurRow), &EditBuff[0] );
191:
192: line25();
193:
194: }
195:
196:
197:
198:
199: /*** ctrl_n - insert line above
200: *
201: * ctrl_n inserts a blank line above the current line
202: * and move the cursor to the inserted line.
203: *
204: * ctrl_n ()
205: *
206: * ctrl_n expands LineTable to insert the new line above
207: * the current line and then inserts the new line via
208: * 'addline' with a length of zero. Also ctrl_n places
209: * the cursor on the inserted line in the same column as
210: * the current line.
211: * ctrl_n will EXIT the program by calling error25 if
212: * it is unable to add a line to the file or the number
213: * of lines in the file becomes greater than MAXLINES.
214: *
215: * EFFECTS TotalLines - by incrementing it once or twice
216: * EditBuffDirty - by clearing it if set
217: * LinesMarked - by clearing it if set
218: * CharsMarked - by clearing it if set
219: * MarkedChar - by clearing it if set
220: * MarkedLine - by clearing it if set
221: * LineTable - by insterting the new line and via 'addline'
222: * CurRow - by decrementing it
223: * TopRow - by incrementing it
224: * EditBuff - by setting it to a line of blanks via 'getline'
225: * SegTable - by using free space for the new line
226: * via 'allocseg'
227: * by marking the current line in the segment
228: * as being deleted if it was changed. via
229: * 'fushline' via 'deleteline'
230: * TotalSegs - via 'alloseg'
231: * memory - by allocating segments via 'allocseg'
232: * the screen - via 'drawscr'
233: */
234:
235:
236: void ctrl_n()
237: {
238: register unsigned short i;
239:
240: if (EditBuffDirty) { /* this call will change */
241: EditBuffDirty = 0; /* cursor line, so flush */
242: flushline((TopRow + CurRow), EditBuff); /* edit buffer if dirty */
243: }
244:
245: if ( LinesMarked || CharsMarked ) {
246: LinesMarked = 0; /* if there's marked text */
247: CharsMarked = 0; /* around, clear it and */
248: for ( i = 0; i < MAXLINES; i++ ) /* redraw the screen */
249: MarkedLine[i] = 0;
250: for ( i = 0; i < LINESIZE; i++ )
251: MarkedChar[i] = 0;
252: }
253:
254: /* expand LineTable to insert the new line above */
255: for (i = TotalLines; i > (TopRow + CurRow); i--)
256: LineTable[i] = LineTable[i -1];
257: /* insert the new line above current line */
258: if ( (TopRow + CurRow) == TotalLines) {
259: ++TotalLines;
260: if ((addline(TopRow + CurRow + 1, 0, 0) != 0) || !(TotalLines < MAXLINES))
261: error25(7);
262: /* call error message to save or quit */
263: }
264: ++TotalLines;
265: if ((addline(TopRow + CurRow, 0, 0) != 0) || !(TotalLines < MAXLINES))
266: error25(7);
267: /* call error message to save or quit */
268:
269: /* redraw the screen with the cursor on the insert line above */
270: if (CurRow > 0) {
271: --CurRow;
272: ++TopRow;
273: VIOSETCURPOS(CurRow, CurCol, 0);
274: }
275: drawscr(TopRow);
276: getline( (TopRow + CurRow), &EditBuff[0] );
277: line25();
278: }
279:
280:
281:
282:
283: /*** ctrl_y - delete current line
284: *
285: * ctrl_y deletes the current line.
286: *
287: * ctrl_y ()
288: *
289: * ctrl_y marks the current line as deleted and
290: * compacts the LineTable.
291: *
292: *
293: * EFFECTS TotalLines - by decrementing it
294: * EditBuffDirty - by clearing it if set
295: * LinesMarked - by clearing it if set
296: * CharsMarked - by clearing it if set
297: * MarkedChar - by clearing it if set
298: * MarkedLine - by clearing it if set
299: * LineTable - by marking the current as deleted via
300: * 'deleteline'
301: * EditBuff - by replacing it with the line below the
302: * the current line via 'getline'
303: * SegTable - by marking the current line in the segment
304: * as being deleted via 'deleteline'
305: * by marking the segment containing the
306: * line as needing compacting via 'deleteline'
307: * the screen - via 'drawscr'
308: */
309:
310:
311: void ctrl_y()
312: {
313: register unsigned short i;
314:
315: if (EditBuffDirty) { /* this call will change */
316: EditBuffDirty = 0; /* cursor line, so flush */
317: flushline((TopRow + CurRow), EditBuff); /* edit buffer if dirty */
318: }
319:
320: if ( LinesMarked || CharsMarked ) {
321: LinesMarked = 0; /* if there's marked text */
322: CharsMarked = 0; /* around, clear it and */
323: for ( i = 0; i < MAXLINES; i++ ) /* redraw the screen */
324: MarkedLine[i] = 0;
325: for ( i = 0; i < LINESIZE; i++ )
326: MarkedChar[i] = 0;
327: }
328:
329: /* compact LineTable */
330: if( !((TopRow + CurRow) == TotalLines)) {
331: deleteline(TopRow + CurRow);
332: for(i = (TopRow + CurRow); i < TotalLines; i++)
333: LineTable[i] = LineTable[i + 1];
334: --TotalLines;
335: }
336:
337: /* redraw the screen */
338: drawscr(TopRow);
339: getline( (TopRow + CurRow), &EditBuff[0] );
340: line25();
341: }
342:
343:
344:
345:
346: /*** tab - moves cursor to next tab
347: *
348: * tab insert spaces up to the next tab if it will
349: * not cause the line to grow greater than line size.
350: *
351: * tab()
352: *
353: * ENTRY - none
354: *
355: * EXIT - none
356: *
357: * EFFECTS LinesMarked - by clearing it if set
358: * CharsMarked - by clearing it if set
359: * MarkedChar - by clearing it if set
360: * MarkedLine - by clearing it if set
361: * EditBuffDirty - by setting if the tab is inserted
362: * EditBuff - by inserting the tab
363: * CurCol - by incrementing it by
364: */
365:
366:
367: void tab()
368: {
369: unsigned short ensp = FALSE; /* enough space to add the tab */
370: unsigned short tabshift; /* number of spaces to the next tab */
371: unsigned short i, j; /* indexes */
372:
373:
374: if ( LinesMarked || CharsMarked ) {
375: LinesMarked = 0; /* if there's marked text */
376: CharsMarked = 0; /* around, clear it and */
377: for ( i = 0; i < MAXLINES; i++ ) /* redraw the screen */
378: MarkedLine[i] = 0;
379: for ( i = 0; i < LINESIZE; i++ )
380: MarkedChar[i] = 0;
381: }
382:
383: tabshift = (TABSIZE - (CurCol % TABSIZE)); /* number of spaces to next tab */
384:
385: /* is there enough space to insert the tab */
386: if ((CurCol + tabshift) < LINESIZE) {
387: for (i = (LINESIZE - tabshift);
388: (i < LINESIZE) && (ensp = !isgraph(EditBuff[i])); i++);
389:
390: if (ensp) {
391: /* enough space was found for the tab - now insert it */
392: for (i = (LINESIZE - tabshift -1), j = (LINESIZE - 1);
393: inline(i, CurCol); i--, j--) {
394: EditBuff[j] = EditBuff[i];
395: EditBuff[i] = ' ';
396: }
397: /* redraw the line with the tab */
398: drawline();
399: CurCol += tabshift;
400: VIOSETCURPOS(CurRow, CurCol, 0);
401: EditBuffDirty = TRUE;
402: }
403: else badkey();
404: }
405: else badkey();
406: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.