|
|
1.1 root 1: #include <ctype.h>
2: #include <dos.h>
3: #include "ssedefs.h"
4:
5:
6:
7:
8: /*** addline - allocates and puts lines into segments
9: *
10: * addline adds a line to a segment and if nessessary
11: * allocates a new segment.
12: *
13: * addline (linenum, linelength, line)
14: *
15: * ENTRY linenum - the line number of 'line' in the file
16: * linelength - the line length of 'line'
17: * line - the 'line' to place in the segment
18: *
19: * EXIT rc - return code for allocating a segment
20: *
21: * addline places the current line the in the segment
22: * containing the previous line if possible to
23: * reduce scattering, otherwise it scans other
24: * segments for first fit and if this fail allocates
25: * a new segment.
26: *
27: * WARNING: do not modify the value of 'i' it is the
28: * result of the segment searches.
29: *
30: * EFFECTS: LineTable - by adding new lines
31: * SegTable - by using free space for the line
32: * and via 'allocseg'
33: * TotalSegs - via 'allocseg'
34: * memory - by allocating segments via 'allocseg'
35: */
36:
37: short addline(linenum, linelength, line)
38: unsigned short linenum;
39: unsigned char linelength;
40: unsigned char line[];
41: {
42: register unsigned short i, j;
43: unsigned char bytesneeded;
44: unsigned short selector;
45: short rc; /* return code of allocseg */
46:
47: bytesneeded = (HEADERSIZE + linelength);
48: rc = 0;
49:
50: /* use segment of previous line to reduce scattering */
51: if (linenum == 0)
52: selector = FP_SEG(LineTable[linenum]);
53: else
54: selector = FP_SEG(LineTable[linenum -1]);
55:
56: /* find segment contianing line number -1 */
57: for(i = 0; (selector != SegTable[i].segment) && (i < TotalSegs); i++);
58:
59: /* scan for first fit if not enough space in segment containing line -1 */
60: if (SegTable[i].free < bytesneeded) {
61: for(i = 0; (SegTable[i].free < bytesneeded) && (i < TotalSegs); i++);
62: /* allocate a segment if not eough space is found */
63: if (i >= TotalSegs)
64: rc = allocseg();
65: }
66:
67: if (rc == 0) { /* no error allocating a segment */
68: /* point line table at segment */
69: FP_SEG(LineTable[linenum]) = SegTable[i].segment;
70: FP_OFF(LineTable[linenum]) = SEGSIZE - SegTable[i].free;
71:
72: /* place line in segment */
73: SegTable[i].free -= bytesneeded;
74: LineTable[linenum]->linelength = linelength;
75: for(j = 0; j < linelength; j++)
76: LineTable[linenum]->firstchar[j] = line[j];
77: }
78: return(rc);
79: }
80:
81:
82:
83:
84: /*** deleteline - marks lines as deleted
85: *
86: * deleteline marks a line as deteted in the segment
87: * it is contained in and marks the setment containing
88: * the line as needing compacting.
89: *
90: * deleteline (linenum)
91: *
92: * Entry linenum - line number of line to mark as deleted
93: *
94: * EFFECTS: SegTable - by marking the segment containing the line
95: * as needing compacting.
96: * by marking the line in the segment as deleted.
97: */
98:
99: void deleteline(linenum)
100: unsigned short linenum;
101: {
102: register unsigned short i;
103: unsigned short selector;
104:
105: LineTable[linenum]->deleted = TRUE;
106: selector = FP_SEG(LineTable[linenum]);
107:
108: for(i = 0; (selector != SegTable[i].segment) && (i < TotalSegs); i++);
109:
110: SegTable[i].flags = TRUE;
111:
112: }
113:
114:
115:
116:
117: /*** flushline - flushes editbuffer to segment
118: *
119: * flushline rewrites the contents of a line to a segment
120: * by using deleteline and addline.
121: *
122: * flushline (linenum, line)
123: *
124: * ENTRY linenum - linenumber of line to rewrite.
125: * line - line to be rewriten.
126: *
127: * flushline checks if the current line is beyond the end of
128: * file, if so it adds the line to the file using addline,
129: * else it replaces it by deleting the the old copy of the
130: * line using deleteline and then adding the line back using
131: * addline. flushline will EXIT the program by calling error25
132: * if it is unable to add a line to the file or the number of
133: * lines in the file becomes greater than MAXLINES.
134: *
135: * EFFECTS: TotalLines - by incrementing it
136: * SegTable - by marking the segment containing the line
137: * as needing compacting, via 'deleteline'
138: * by marking the line in the segment as deleted.
139: * via 'deleteline'
140: * LineTable - by adding new lines via 'addline'
141: * SegTable - by using free space for the line via 'addline'
142: * and via 'allocseg'
143: * TotalSegs - via 'allocseg'
144: * memory - by allocating segments via 'allocseg'
145: */
146:
147: flushline(linenum, line)
148: unsigned short linenum;
149: unsigned char line[];
150: {
151: register unsigned char i;
152:
153: /* delete the line if it's not beyond the end of the file */
154: if ( !(linenum == TotalLines))
155: deleteline(linenum);
156: else
157: ++TotalLines;
158:
159: for (i = (LINESIZE -1); !isgraph(line[i]) && inline(i, 0); i--);
160:
161: if ( (addline(linenum, i +1, line) != 0) || !(TotalLines < MAXLINES) )
162: error25(7); /* call error message and quit */;
163: }
164:
165:
166:
167:
168: /*** getline - fills line from segment
169: *
170: * getline copies a 'line' from a segment to the
171: * address given by line.
172: *
173: * getline (linenum, line)
174: *
175: * ENTRY linenum - the line number of 'line' in the file
176: * line - address of where to copy 'line'
177: *
178: * getline fills the line out to LINESIZE with spaces and
179: * returns a line of spaces if the linenum is not a valid
180: * line number.
181: *
182: * WARNING getline does not check if the address given by line is
183: * valid.
184: *
185: * EFFECTS memory - by copying the line to the address given by line.
186: */
187:
188: void getline(linenum, line)
189: unsigned short linenum;
190: unsigned char *line;
191: {
192: register unsigned short i;
193:
194: i = 0;
195:
196: /* copy 'line' to address given by line */
197: if (linenum < TotalLines) /* a valid line number */
198: for ( ; i < (LineTable[linenum]->linelength); i++)
199: line[i] = LineTable[linenum]->firstchar[i];
200:
201: /* pad line with spaces out to LINESIZE */
202: for ( ; i < LINESIZE; i++)
203: line[i] = ' ';
204:
205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.