home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / PROGRAM / SNPD9404.ZIP / TAIL.C < prev    next >
C/C++ Source or Header  |  1994-04-03  |  4KB  |  159 lines

  1. .I 0 19
  2. /*
  3. **  TAIL.C
  4. **  ----------------------------------------------------------------------
  5. **  Display the last n lines of a file (20 lines by default).
  6. **
  7. **  Revision history
  8. **  ================
  9. **  Modified  19930604 by Ruurd Pels:
  10. **  - Increased default line numbers from 5 to 20
  11. **  - Made ANSI C conformant (I hope)
  12. **  - Added '-' support for commandline
  13. **  - Outputs header to stderr instead of stdout to leave it out when
  14. **    redirecting files
  15. **  - Fixed \r\r\n bug for MSDOS machines
  16. **
  17. **  Modified  19861005 by Joe Huffman:
  18. **  - Utilize prototyping, fixed a bug, added (a few) comments and help.
  19. **
  20. **  Written   19860204 by Joe Huffman.
  21. .D 1 5
  22. .I 7 2
  23. */
  24.  
  25. .D 8 2
  26. .I 11 9
  27.  
  28. char            head1[] = {"\n------- \""};
  29. char            head2[] = {" -------\n"};
  30. FILE *          fp;
  31. int             filenum;
  32. int             cc;
  33. unsigned int    linenum = 20;
  34. unsigned int    indx;
  35. long int *      tail;
  36. .D 12 47
  37. .I 64 1
  38. void getlinenum(int n, char * str[])
  39. .D 65 1
  40. .I 69 3
  41.             if ((**str == '/') || (**str == '-'))
  42.             {
  43.                   linenum = atoi(*(str) + 1);
  44. .D 70 3
  45. .I 73 5
  46.                         linenum = 20;
  47.             }
  48.       }
  49.  
  50.       /* Because we save a pointer to the end of the PREVIOUS line */
  51. .D 74 3
  52. .D 78 1
  53. .I 85 1
  54. void gettail(void)
  55. .D 86 1
  56. .D 89 1
  57. .I 91 1
  58.       tail = (long int *)malloc(sizeof(*tail) * linenum);
  59. .D 92 1
  60. .I 94 7
  61.             fputs("Insufficient memory.", stderr);
  62.             exit(1);
  63.       }
  64.       tail[0] = ftell(fp);
  65.       indx = 0;
  66.  
  67.       for (cc = getc(fp); cc != EOF; cc = getc(fp))
  68. .D 95 7
  69. .I 105 1
  70.                   cc = getc(fp);
  71. .D 106 1
  72. .I 107 1
  73.                         ungetc(cc, fp);
  74. .D 108 1
  75. .I 110 1
  76.                   tail[indx] = ftell(fp);
  77. .D 111 1
  78. .I 117 1
  79.                         cc = getc(fp);
  80. .D 118 1
  81. .I 119 1
  82.                               ungetc(cc, fp);
  83. .D 120 1
  84. .I 122 1
  85.                         tail[indx] = ftell(fp);
  86. .D 123 1
  87. .I 126 4
  88.       fputs("\" ", stderr);
  89.       ltoa(currline, outstr, 10);
  90.       fputs(outstr, stderr);
  91.       fputs(" lines", stderr);
  92. .D 127 4
  93. .I 137 6
  94.       if (fseek(fp, tail[indx], 0) == -1)
  95.       {
  96.             fputs("\nFile seek error.", stderr);
  97.             exit(1);
  98.       }
  99.       free(tail);
  100. .D 138 34
  101. .I 177 7
  102. void help(void)
  103. {
  104.       char *ptr;
  105.       static char help_str[] =  "Usage:\n\nTAIL <filename> [filename] "
  106.             "[/n]\n\n<filename>  - The name of a valid file, wildcards "
  107.             "accepted.\nn           - Number of lines to print out, 20 "
  108.             "by default.";
  109. .D 178 10
  110. .I 189 47
  111.             fputc(*ptr, stdout);
  112. }
  113.  
  114. int main(int argc, char **argv)
  115. {
  116.       if (argc <= 1)
  117.       {
  118.             help();
  119.             exit(1);
  120.       }
  121.  
  122.       getlinenum(argc, argv);
  123.  
  124.       for (filenum = 1; filenum < argc; ++filenum)
  125.       {
  126.             if (*argv[filenum] == '/')
  127.                   continue;
  128.             fp = fopen(argv[filenum], "rb");
  129.             if (!fp)
  130.             {
  131.                   fputs(head1, stderr);
  132.                   fputs(argv[filenum], stderr);
  133.                   fputs("\" not found.", stderr);
  134.                   fputs(head2, stderr);
  135.             }
  136.             else
  137.             {
  138.                   fputs(head1, stderr);
  139.                   fputs(argv[filenum], stderr);
  140.                   gettail();
  141.                   fputs(head2, stderr);
  142.                   for (cc = getc(fp); cc != EOF; cc = getc(fp))
  143.                   {
  144. #ifdef __MSDOS__
  145.                         if (cc != '\r')
  146.                         {
  147.                               fputc(cc, stdout);
  148.                         }
  149. #else
  150.                         fputc(cc, stdout);
  151. #endif
  152.                   }
  153.                   fclose(fp);
  154.             }
  155.       }
  156.       return EXIT_SUCCESS;
  157. }
  158. .D 190 2
  159.