Annotation of os2sdk/demos/apps/sse/ssefile.c, revision 1.1

1.1     ! root        1: #include <ctype.h>
        !             2: #include <doscalls.h>
        !             3: #include <dos.h>
        !             4: #include <stdlib.h>
        !             5: #include "ssedefs.h"
        !             6: 
        !             7: 
        !             8: 
        !             9: 
        !            10: /***  readfile - reads file into filebuffer
        !            11:  *
        !            12:  *    readfile reads a file using DOSREAD into a file buffer
        !            13:  *      and then parses out lines and places them into segments
        !            14:  *      via 'addline'.
        !            15:  *
        !            16:  *    readfile (fhandle)
        !            17:  *
        !            18:  *    ENTRY    fhandle - handle to file being read
        !            19:  *
        !            20:  *    EXIT     rc      - return code of readfile and addline
        !            21:  *
        !            22:  *    readfile uses line-feeds('\n') as seperators between lines.
        !            23:  *      Lines longer than LINESIZE are cut at LINESIZE and continued
        !            24:  *      on the next line. All non printable characters execpt TABS are
        !            25:  *      ignored in buildling the line.
        !            26:  *
        !            27:  *    EFFECTS  fbuffer    - by reading the file into fbuffer
        !            28:  *             bytesread  - by setting it to the number of bytes read
        !            29:  *             TotalLines - by incrementing it for every line
        !            30:  *             LineTable  - by adding new lines via 'addline'
        !            31:  *             SegTable   - by using free space via 'addline'
        !            32:  *                          and by allocating segments via 'alloseg'
        !            33:  *             TotalSegs  - by incrementing it via 'alloseg'
        !            34:  *             memory     - by allocating segments via 'alloseg'
        !            35:  */
        !            36: 
        !            37: short readfile(fhandle)
        !            38: unsigned short fhandle;
        !            39: {
        !            40:     register unsigned short  i, j;
        !            41:     unsigned char  line[LINESIZE +1];  /* temp buffer for building line */
        !            42:     short          rc;                 /* return code of DOS */
        !            43: 
        !            44: 
        !            45:     for (bytesread = 1, j = 0, rc = 0; (bytesread != 0) && (!rc); ) {
        !            46: 
        !            47:         rc = DOSREAD(fhandle, (char far *)fbuffer,
        !            48:                       FBUFFSIZE, (unsigned far *)&bytesread);
        !            49: 
        !            50:         if (rc == 0)  {
        !            51: /*      scan buffer for complete lines */
        !            52:             for(i =0; (i < bytesread) && (!rc); i++) {
        !            53:                 line[j] = fbuffer[i];
        !            54: 
        !            55:                 if (isprint(line[j])) {
        !            56:                     if (j < (LINESIZE)) {
        !            57: /*                  continued building line */
        !            58:                         j++;
        !            59:                     }
        !            60:                     else {
        !            61: /*                  line length greater than line size */
        !            62:                         rc = (addline(TotalLines, j, line) || !(TotalLines < MAXLINES));
        !            63:                         ++TotalLines;
        !            64:                         line[0] = line[j];
        !            65:                         j = 1;
        !            66:                     }
        !            67:                 }
        !            68:                 else if (line[j] == '\t') {
        !            69: /*              fill with spaces to next tab */
        !            70:                     if ((j/TABSIZE +1) > MAXTABS) {
        !            71: /*                      TAB makes line greater than LINSIZE */
        !            72:                         for ( ; j < LINESIZE; j++)
        !            73:                             line[j] = ' ';
        !            74:                         rc = (addline(TotalLines, j, line) || !(TotalLines < MAXLINES));
        !            75:                         ++TotalLines;
        !            76:                         j = 0;
        !            77:                     }
        !            78:                     do {
        !            79:                         line[j] = ' ';
        !            80:                         ++j;
        !            81:                     } while ((j % TABSIZE) != 0);
        !            82:                 }
        !            83:                 else if (line[j] == '\n') {
        !            84: /*              a complete line */
        !            85:                     rc = (addline(TotalLines, j, line) || !(TotalLines < MAXLINES));
        !            86:                     ++TotalLines;
        !            87:                     j = 0;
        !            88:                 }
        !            89:             }
        !            90:             if ( (bytesread < FBUFFSIZE) && (j >0) && (!rc) ) {
        !            91: /*          line left in buffer */
        !            92:                 rc = (addline(TotalLines, j, line) || !(TotalLines < MAXLINES));
        !            93:                 ++TotalLines;
        !            94:                 j = 0;
        !            95:             }
        !            96:         }
        !            97:     }
        !            98:     return(rc);
        !            99: }
        !           100: 
        !           101: 
        !           102: 
        !           103: 
        !           104: /*** savefile - saves file to disk
        !           105:  *
        !           106:  *   savefile attempts to write the file to disk.
        !           107:  *
        !           108:  *   savefile (fhandle)
        !           109:  *
        !           110:  *   ENTRY    fhandle - handle of file to be written.
        !           111:  *
        !           112:  *   EXIT     rc      - return code of DOSWRITE and
        !           113:  *                      (byteswritten != bytes in buffer to write)
        !           114:  *
        !           115:  *   savefile fills a buffer with complete lines until the buffer
        !           116:  *     can not accept anoter complete line, then savefile calls
        !           117:  *     DOSWRITE with the number of bytes in the buffer. If an
        !           118:  *     error occurs durning the write or the number bytes in the
        !           119:  *     buffer does not match the number of bytes written out then
        !           120:  *     savefile aborts and returns an error code via rc.
        !           121:  *
        !           122:  *   EFFECTS  fbuffer  - by filling it with 'lines' from the file
        !           123:  *            the file - by writing out any changes made to it
        !           124:  */
        !           125: 
        !           126: short savefile(fhandle)
        !           127: unsigned short fhandle;
        !           128: {
        !           129:     unsigned short byteswritten; /* number written to file - returned by DOS */
        !           130:     unsigned long  npl;          /* file pointer - not used */
        !           131:     unsigned short i, j, k;      /* indexes */
        !           132:     unsigned long  totalbytes;   /* total bytes written to file */
        !           133:     short          rc;           /* return code of DOS call */
        !           134: 
        !           135:     DOSCHGFILEPTR(fhandle, 0l, 0, &npl); /* move file ptr to start of file */
        !           136: 
        !           137:     totalbytes = rc = 0;
        !           138: 
        !           139: /*  place lines in fbuffer */
        !           140:     for (i = 0, j = 0; (i < TotalLines) && (!rc); i++) {
        !           141:         if ((LineTable[i]->linelength) < (FBUFFSIZE - j)) {
        !           142:             for (k = 0; k < LineTable[i]->linelength; k++, j++)
        !           143:                 fbuffer[j] = LineTable[i]->firstchar[k];
        !           144:             fbuffer[j] = '\r';
        !           145:             j++;
        !           146:             fbuffer[j] = '\n';
        !           147:             j++;
        !           148:         }
        !           149:         else {
        !           150: /*          fbuffer is full - write to file */
        !           151:             rc = DOSWRITE(fhandle, (char far *)fbuffer, j,
        !           152:                      (unsigned far *)&byteswritten);
        !           153:             rc = ( !(j == byteswritten) || rc);
        !           154:             totalbytes += (byteswritten);
        !           155:             j = 0;
        !           156:         }
        !           157:     }
        !           158:     if ((j > 0) && (!rc)) {
        !           159: /*      lines left in fbuffer - write out to file */
        !           160:         rc = DOSWRITE(fhandle, (char far *)fbuffer, j,
        !           161:                  (unsigned far *)&byteswritten);
        !           162:         rc = ( !(j == byteswritten) || rc);
        !           163:         totalbytes += (byteswritten);
        !           164:     }
        !           165: 
        !           166:     if (!rc)   /* no problems writing to the file */
        !           167: /*         change file size to current file size */
        !           168:            DOSNEWSIZE(fhandle, totalbytes);
        !           169:     return(rc);
        !           170: }
        !           171: 
        !           172: 
        !           173: 
        !           174: 
        !           175: /***  backupfile - make of the file
        !           176:  *
        !           177:  *    backupfile creates a backup file for the file being edited
        !           178:  *      by sse.
        !           179:  *
        !           180:  *    backupfile (fname, fhandle)
        !           181:  *
        !           182:  *    ENTRY      fhandle  - handle to file to backup
        !           183:  *               fname    - path name of file to backup
        !           184:  *
        !           185:  *    EXIT       rc       - return code of backup
        !           186:  *
        !           187:  *    backupfile creates a backup file by replacing the current
        !           188:  *      extension with .BAK or adding the extension.BAK if none is
        !           189:  *      given. If the file being edited has the extension .BAK then
        !           190:  *      backupfile will not create a backup.
        !           191:  *
        !           192:  *    EFFECTS    backup file - by creating it
        !           193:  */
        !           194: 
        !           195: short  backupfile(fname, fhandle)
        !           196:     char           *fname;
        !           197:     unsigned short fhandle;
        !           198: {
        !           199:     unsigned short bfhandle;    /* handle to backup file */
        !           200:     unsigned short bytesread;   /* number of bytes read from file fname */
        !           201:     unsigned short byteswriten; /* number of bytes written to file bfname */
        !           202:     unsigned char  i, j;        /* indexs */
        !           203:     unsigned long  npl;         /* file pointer - not used */
        !           204:     short          rc;          /* return code of backupfile */
        !           205:     char           bfname[65];  /* pathname of the backup file */
        !           206: 
        !           207: /*  build back up file name - bfname, from fname */
        !           208:     for (i = 0; ((bfname[i] = fname[i]) != '\0');  i++);
        !           209:     for (j = 1;
        !           210:         (bfname[i - j] != '\\') && (bfname[i - j] != '.')
        !           211:                                 && (j < 4) && (j < i);
        !           212:          j++);
        !           213:     if ((bfname[i - j] == '.') && ((i - j) != 0))
        !           214:         i -= j;
        !           215:     if (bfname[i] != '.')
        !           216:         bfname[i] = '.';
        !           217:     bfname[++i] = 'B';
        !           218:     bfname[++i] = 'A';
        !           219:     bfname[++i] = 'K';
        !           220:     bfname[++i] = '\0';
        !           221: 
        !           222: 
        !           223: /*  create backup file */
        !           224:     rc = openfile(bfname, &bfhandle, WCFLAG);
        !           225:     if (!rc) {
        !           226:         DOSCHGFILEPTR(fhandle, 0l, 0, &npl); /* file ptr to beginning of fname */
        !           227:         for (bytesread = 1, byteswriten = 1;
        !           228:             (bytesread != 0) && !(rc = (bytesread != byteswriten));  )  {
        !           229: /*         copy fname to bfname */
        !           230:            DOSREAD(fhandle, (char far *)fbuffer, FBUFFSIZE,
        !           231:                    (unsigned far *)&bytesread);
        !           232:            DOSWRITE(bfhandle, (char far *)fbuffer, bytesread,
        !           233:                     (unsigned far *)&byteswriten);
        !           234:         }
        !           235:         closefile(bfhandle);
        !           236:         if (rc)
        !           237: /*          delete backup file if there was an error creating it */
        !           238:             DOSDELETE( (char far *)bfname, 0l);
        !           239:     }
        !           240:     return(rc);
        !           241: }
        !           242: 
        !           243: 
        !           244: 
        !           245: 
        !           246: /***  openfile - opens file to be read
        !           247:  *
        !           248:  *    openfile uses DOSOPEN to open or create a file and
        !           249:  *      return a handle to it.
        !           250:  *
        !           251:  *    openfile (fname, fhandle, openflag)
        !           252:  *
        !           253:  *    ENTRY    fname    - name of the file
        !           254:                openflag - is the value of openflag for DOSOPEN
        !           255:  *
        !           256:  *    EXIT     fhandle  - file handle
        !           257:  *             rc       - return code of openfile
        !           258:  *
        !           259:  *    openfile has the openmode for DOSOPEN set so it may run as
        !           260:  *      a bound application. The openflag controls the action
        !           261:  *      of the open, example: if the file exist then open it
        !           262:  *      or replace it, or if the file does not exist create it
        !           263:  *      or fail.
        !           264:  *
        !           265:  *    EFFECTS  fhandle - by returning a handle to the file
        !           266:  *             memory  - by opening a file
        !           267:  */
        !           268: 
        !           269: short openfile(fname, fhandle, openflag)
        !           270: char           *fname;
        !           271: unsigned short *fhandle;
        !           272: unsigned short openflag;
        !           273: {
        !           274:     unsigned short actiontaken = 0;    /* value return by DOS */
        !           275:     unsigned long  fsize = 0l;         /* set to not change file size (0) */
        !           276:     unsigned short fattrib  = 0;       /* set to not change file attrib (0) */
        !           277:     struct flags {
        !           278:       unsigned access     :3 ;   /* set to read & write access (2) */
        !           279:       unsigned reserved1  :1 ;   /* must be zero */
        !           280:       unsigned sharing    :3 ;   /* set to deny write access (2) */
        !           281:       unsigned inheritance:1 ;   /* set to private (1) */
        !           282:       unsigned reserved5  :5 ;   /* must be zero */
        !           283:       unsigned failerrors :1 ;   /* needes to be zero for API */
        !           284:       unsigned write      :1 ;   /* needes to be zero for API */
        !           285:       unsigned dasdopen   :1 ;   /* needes to be zero for API */
        !           286:     };
        !           287:     static union {
        !           288:       struct flags   modeflags;
        !           289:       unsigned short mode;
        !           290:     } openmode = { { 2,0,2,1,0,0,0,0 } };
        !           291:     short          rc;         /* return code from DOS call */
        !           292: 
        !           293: 
        !           294: /*  Open the file */
        !           295:     rc = DOSOPEN( (char far *)fname, (unsigned far *)fhandle,
        !           296:                   (unsigned far *)&actiontaken,
        !           297:                    fsize, fattrib, openflag,
        !           298:                    openmode.mode, 0l);
        !           299:     return(rc);
        !           300: }
        !           301: 
        !           302: 
        !           303: 
        !           304: 
        !           305: /***  closefile - closes file
        !           306:  *
        !           307:  *    closefile uses DOSCLOSE to close the file given by
        !           308:  *       fhandle.
        !           309:  *
        !           310:  *    closefile (fhandle).
        !           311:  *
        !           312:  *    ENTRY     fhandle - handle of file to be closed
        !           313:  *
        !           314:  *    closefile does not return an error code if one occurs.
        !           315:  *
        !           316:  *    EFFECTS   memory   - by closing a file
        !           317:  *              the file - by closing it
        !           318:  */
        !           319: 
        !           320: void closefile(fhandle)
        !           321: unsigned short fhandle;
        !           322:   {
        !           323:     short rc;   /* return code of DOS call */
        !           324: 
        !           325: /*  Close the file */
        !           326:     rc = DOSCLOSE(fhandle);
        !           327: }

unix.superglobalmegacorp.com

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