home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1989 / 05 / numb1.c < prev    next >
C/C++ Source or Header  |  1988-12-12  |  3KB  |  93 lines

  1. /* NUMB1.C: Utility to number the lines in a file, using the C
  2.    low-level file functions.
  3.    Copyright (c) 1989 Ziff Communications Co.
  4.    PC Magazine * Ray Duncan
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <fcntl.h>
  10. #include <sys\types.h>
  11. #include <sys\stat.h>
  12. #include <io.h>
  13.  
  14. unsigned ifile;                     /* handle for input file */
  15. unsigned ofile;                     /* handle for output file */
  16.  
  17. char fbuff[256];                    /* file I/O buffer */
  18. char iname[80];                     /* name of input file */
  19. char oname[80];                     /* name of output file */
  20.  
  21. char newline[] = "\x0d\x0a";        /* MS-DOS logical new-line */
  22.  
  23. main(int argc, char *argv[])
  24. {
  25.     char *p, q[10];                 /* scratch pointer, buffer */
  26.     int line = 1, length;           /* line number, length */
  27.  
  28.     if(argc < 2)                    /* make sure filename present */
  29.     {
  30.         fprintf(stderr,"\nnumb1: missing filename\n");
  31.         exit(1);
  32.     }
  33.  
  34.     strcpy(iname, argv[1]);         /* get input filename */
  35.     strcpy(oname, argv[1]);         /* build output filename */
  36.     if(! (p = strchr(oname, '.')))  /* point to extension */
  37.         p = strchr(oname, '\0');
  38.     strcpy(p, ".$$$");              /* temp. name for new file */
  39.  
  40.                                     /* open input file */
  41.     ifile = open(iname, O_RDONLY | O_BINARY);
  42.  
  43.                                     /* create output file */
  44.     ofile = open(oname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWRITE);
  45.  
  46.     if((ifile == -1) || (ofile == -1))
  47.     {
  48.         fprintf(stderr,"\nnumb1: open or create error\n");
  49.         exit(1);
  50.     }
  51.  
  52.     while(length = rline())         /* read line from input file */
  53.     {                               /* until end of file reached */
  54.         sprintf(q,"%04d\t",line++); /* format line number */    
  55.         write(ofile,q,strlen(q));   /* write line number */
  56.         write(ofile,fbuff,length);  /* write line text */
  57.     }       
  58.  
  59.     close(ifile);                   /* close input file */
  60.     close(ofile);                   /* close output file */
  61.  
  62.     strcpy(p, ".bak");              /* build .BAK filename */
  63.     unlink(oname);                  /* delete previous .BAK file */
  64.     rename(iname, oname);           /* make original file .BAK */
  65.     strcpy(p, ".$$$");              /* give new file same name */
  66.     rename(oname, iname);           /* as original file */
  67. }
  68.  
  69. /*  Read line from input file and return its length including
  70.     the new-line delimiter character(s), leaving the line's
  71.     text in 'fbuff'.  Returns 0 if end of file or new-line
  72.     delimiter not found.
  73. */
  74.  
  75. int rline(void)
  76. {
  77.     char *p;                        /* pointer to delimiter */
  78.     int i, j;                       /* scratch variables */
  79.  
  80.                                     /* read chunk of input file */
  81.     i = read(ifile, fbuff, sizeof(fbuff)-1);
  82.     if(i == 0) return(0);           /* exit if end of file */
  83.     else fbuff[i] = 0;              /* otherwise store null byte */
  84.  
  85.     p = strstr(fbuff, newline);     /* search for delimiter */
  86.     if(p == NULL) return(0);        /* none found, indicate EOF */
  87.     j = p-fbuff+strlen(newline);    /* calculate line length */
  88.  
  89.                                     /* back up file pointer */
  90.     lseek(ifile, (long) (j-i), SEEK_CUR);
  91.     return(j);                      /* return length of line */     
  92. }
  93.