/* NUMB1.C: Utility to number the lines in a file, using the C low-level file functions. Copyright (c) 1989 Ziff Communications Co. PC Magazine * Ray Duncan */ #include #include #include #include #include #include unsigned ifile; /* handle for input file */ unsigned ofile; /* handle for output file */ char fbuff[256]; /* file I/O buffer */ char iname[80]; /* name of input file */ char oname[80]; /* name of output file */ char newline[] = "\x0d\x0a"; /* MS-DOS logical new-line */ main(int argc, char *argv[]) { char *p, q[10]; /* scratch pointer, buffer */ int line = 1, length; /* line number, length */ if(argc < 2) /* make sure filename present */ { fprintf(stderr,"\nnumb1: missing filename\n"); exit(1); } strcpy(iname, argv[1]); /* get input filename */ strcpy(oname, argv[1]); /* build output filename */ if(! (p = strchr(oname, '.'))) /* point to extension */ p = strchr(oname, '\0'); strcpy(p, ".$$$"); /* temp. name for new file */ /* open input file */ ifile = open(iname, O_RDONLY | O_BINARY); /* create output file */ ofile = open(oname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWRITE); if((ifile == -1) || (ofile == -1)) { fprintf(stderr,"\nnumb1: open or create error\n"); exit(1); } while(length = rline()) /* read line from input file */ { /* until end of file reached */ sprintf(q,"%04d\t",line++); /* format line number */ write(ofile,q,strlen(q)); /* write line number */ write(ofile,fbuff,length); /* write line text */ } close(ifile); /* close input file */ close(ofile); /* close output file */ strcpy(p, ".bak"); /* build .BAK filename */ unlink(oname); /* delete previous .BAK file */ rename(iname, oname); /* make original file .BAK */ strcpy(p, ".$$$"); /* give new file same name */ rename(oname, iname); /* as original file */ } /* Read line from input file and return its length including the new-line delimiter character(s), leaving the line's text in 'fbuff'. Returns 0 if end of file or new-line delimiter not found. */ int rline(void) { char *p; /* pointer to delimiter */ int i, j; /* scratch variables */ /* read chunk of input file */ i = read(ifile, fbuff, sizeof(fbuff)-1); if(i == 0) return(0); /* exit if end of file */ else fbuff[i] = 0; /* otherwise store null byte */ p = strstr(fbuff, newline); /* search for delimiter */ if(p == NULL) return(0); /* none found, indicate EOF */ j = p-fbuff+strlen(newline); /* calculate line length */ /* back up file pointer */ lseek(ifile, (long) (j-i), SEEK_CUR); return(j); /* return length of line */ }