home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 329_01 / vis.c < prev    next >
C/C++ Source or Header  |  1988-12-16  |  3KB  |  146 lines

  1. /*-
  2.  * vis - visual display of files
  3.  *
  4.  * Usage: vis [-et] [file...]
  5.  *
  6.  * Flags:
  7.  * -e    show the ends of lines as '$'
  8.  * -t    show tabs as '^I'
  9.  *
  10.  * Contents of argument files are written to standard output.
  11.  * If there are no arguments, or if a file named "-" is encountered,
  12.  * standard input is written to standard output.
  13.  * Exit status is number of files that couldn't be opened or had read errors.
  14.  *
  15.  * This program is in the public domain.
  16.  * David MacKenzie
  17.  * 6522 Elgin Lane
  18.  * Bethesda, MD 20817
  19.  *
  20.  * Latest revision: 05/08/88
  21. **
  22. **    Roberto Artigas Jr
  23. **    P.O. Box 281415
  24. **    Memphis, TN 38168-1415
  25. **    work: 901-762-6092
  26. **    home: 901-373-4738
  27. **
  28. **    1988.12.14 - Get to run under OS/2.
  29. **        Used C/2 version 1.10 under OS/2 E 1.1
  30. **        cl -c -AL vis.c
  31. **        link vis,/noi,vis,llibce+os2, ;
  32. **+
  33. */
  34. #define    CPM    0
  35. #define    DOS    0
  36. #define    OS2    1
  37.  
  38. #include    <stdio.h>
  39.  
  40. #if    CPM
  41. extern int errno;
  42. #endif
  43.  
  44. #if    DOS || OS2
  45. #define    agetc    getc
  46. #include    <ctype.h>
  47. #include    <stdlib.h>
  48. #include    <string.h>
  49. #endif
  50.  
  51. /*
  52.  * Function prototypes 
  53.  */
  54. int vis();
  55.  
  56. main(argc, argv)
  57. int argc;
  58. char **argv;
  59. {
  60.     int showtabs = 0;               /* show tabs as ^I? */
  61.     int showend = 0;               /* show eol as $? */
  62.     int optind;                   /* loop index */
  63.     int errs = 0;               /* # of files with read errors */
  64.  
  65.     for (optind = 1; optind < argc && *argv[optind] == '-'; ++optind)
  66.     while (*++argv[optind])
  67.         switch (*argv[optind])
  68.         {
  69.         case 'e':
  70.         showend = 1;
  71.         break;
  72.         case 't':
  73.         showtabs = 1;
  74.         break;
  75.         default:
  76.         fprintf(stderr, "Usage: vis [-et] [file...]\n");;
  77.         exit(1);
  78.         break;
  79.         }
  80.  
  81.     if (optind == argc)
  82.     errs += vis("-", showtabs, showend);
  83.     else
  84.     for (; optind < argc; ++optind)
  85.         errs += vis(argv[optind], showtabs, showend);
  86.  
  87.     return (errs);
  88.     exit(errs);
  89. }
  90. /*
  91.  * Visually display file on standard output with newline and ^Z conversions.
  92.  * If file is "-", use standard input. Return 0 if ok, 1 if error. 
  93.  */
  94.  
  95. vis(file, showtabs, showend)
  96. char *file;
  97. int showtabs,
  98.  showend;
  99. {
  100.     FILE *fp = stdin;               /* input file pointer */
  101.     int c;                   /* one byte of input */
  102.  
  103. #if    DOS || OS2
  104.     if (strcmp(file, "-") && (fp = fopen(file, "rb")) == NULL)
  105.     {
  106. #else
  107.     if (strcmp(file, "-") && (fp = fopen(file, "r")) == NULL)
  108.     {
  109. #endif
  110.     perror(file);
  111.     return 1;
  112.     }
  113.     while ((c = agetc(fp)) != EOF)
  114.     {
  115.     if (c > 127)
  116.     {
  117.         /* Meta-characters. */
  118.         putchar('M');
  119.         putchar('-');
  120.         c &= 127;
  121.     }
  122.     if (c == '\n' && showend)
  123.     {
  124.         putchar('$');
  125.         putchar('\n');
  126.     } else
  127.     if (c < ' ' && (c != '\t' || showtabs) && c != '\n')
  128.     {
  129.         putchar('^');
  130.         putchar(c + 'A' - 1);
  131.     } else
  132.     if (c == 127)
  133.     {
  134.         putchar('^');
  135.         putchar('?');
  136.     } else
  137.         putchar(c);
  138.     }
  139.     if (fp != stdin && fclose(fp) == EOF)
  140.     {
  141.     fprintf(stderr, "%s: Read error\n", file);
  142.     return 1;
  143.     }
  144.     return 0;
  145. }
  146.