|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.