home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume17 / pps / prc.c < prev    next >
C/C++ Source or Header  |  1989-02-06  |  2KB  |  143 lines

  1. #include <stdio.h>
  2.  
  3. char    *wd = "prc";
  4. struct prc {
  5.     int page;
  6.     int row;
  7.     int col;
  8. };
  9.  
  10. struct prc zero, max;
  11. int tab = 8;
  12.  
  13. main(argc, argv)
  14. char **argv;
  15. {
  16.     int i;
  17.     register FILE *fp;
  18.  
  19.     while (argc > 1 && *argv[1] == '-') {
  20.         switch (argv[1][1]) {
  21.         case 'p':
  22.         case 'r':
  23.         case 'c': 
  24.             wd = argv[1]+1;
  25.             break;
  26.         case 't':
  27.             if (tab = atoi(&argv[1][2]))
  28.                 break;
  29.             argc--;
  30.             argv++;
  31.             tab = atoi(argv[1]);
  32.             break;
  33.         default:
  34.             fprintf(stderr,
  35.                 "Usage: prc [-prc] [-t tab] [files]\n");
  36.             exit(1);
  37.         }
  38.         argc--;
  39.         argv++;
  40.     }
  41.  
  42.     i = 1;
  43.     fp = stdin;
  44.  
  45.     do {
  46.         if (argc > 1 && (fp = fopen(argv[i], "r")) == NULL) {
  47.             perror(argv[i]);
  48.             continue;
  49.         }
  50.         prc1(fp);
  51.         if (argc > 2)
  52.             printf(" %s", argv[i]);
  53.         putchar('\n');
  54.         fclose(fp);
  55.     } while(++i < argc);
  56.  
  57.     if (argc > 2) {
  58.         prprc(&max);
  59.         printf(" maximum\n");
  60.     }
  61.     exit(0);
  62. }
  63.  
  64. #define MAX(A, B)    ((A) > (B) ? (A) : (B))
  65. #define ROUND(A, B)    ((A + B) / (B) * (B))
  66.  
  67. prprc(prcp)
  68. struct prc *prcp;
  69. {
  70.     register char *wdp = wd;
  71.  
  72.     while (*wdp) switch (*wdp++) {
  73.     case 'p':
  74.         ipr(prcp->page);
  75.         break;
  76.  
  77.     case 'r':
  78.         ipr(prcp->row);
  79.         break;
  80.  
  81.     case 'c':
  82.         ipr(prcp->col);
  83.         break;
  84.  
  85.     }
  86. }
  87.  
  88. ipr(num)
  89. int num;
  90. {
  91.     printf(" %7d", num);
  92. }
  93.  
  94. prc1(fp)
  95. FILE *fp;
  96. {
  97.     register int c;
  98.     struct prc cur;
  99.     struct prc fil;
  100.  
  101.     cur = zero;
  102.     fil = zero;
  103.     if ((c = getc(fp)) == EOF) {
  104.         prprc(&fil);
  105.         return;
  106.     }
  107.     ungetc(c, fp);
  108.  
  109.     while ((c = getc(fp)) != EOF) {
  110.         switch (c) {
  111.             case '\b':
  112.                 if (cur.col > 0)
  113.                     cur.col--;
  114.                 break;
  115.             case '\f':
  116.                 cur.page++;
  117.                 fil.row = MAX(cur.row, fil.row);
  118.                 cur.row = -1;
  119.             case '\n':
  120.                 cur.row++;
  121.                 fil.col = MAX(cur.col, fil.col);
  122.                 cur.col = 0;
  123.                 break;
  124.             case '\t':
  125.                 cur.col = ROUND(cur.col, tab);
  126.                 break;
  127.             default:
  128.                 cur.col++;
  129.                 break;
  130.         };
  131.     }
  132.  
  133.     fil.col = MAX(cur.col, fil.col);
  134.     fil.row = MAX(cur.row, fil.row);
  135.     fil.page = cur.page + 1;
  136.  
  137.     prprc(&fil);
  138.  
  139.     max.page = MAX(fil.page, max.page);
  140.     max.row = MAX(fil.row, max.row);
  141.     max.col = MAX(fil.col, max.col);
  142. }
  143.