Annotation of os2sdk/demos/apps/sse/sseline.c, revision 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.