Annotation of os2sdk/demos/apps/sse/sseline.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.