home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / cpgms.zip / LIST.C < prev    next >
C/C++ Source or Header  |  1985-11-17  |  5KB  |  270 lines

  1.  
  2. #include "stdio.h"
  3.  
  4.  
  5.  
  6. char    *documentation[] = {
  7. "list prints a set of files with headings.",
  8. "   list [flags] file_list [>file]",
  9. "",
  10. "Flags are single characters preceeded by '-':",
  11. "   -w      Wrap long lines (default is to truncate)",
  12. "   -h      Print headings switch.  Normally, on.",
  13. "   -v      Verbose. Show file stats on stderr.",
  14. "   -n      Each line is preceeded by its line number",
  15. "   -lnnn   Line length (default 80).",
  16. "   -pnnn   Page length (default 55)."
  17. "   -tnnn   Tab stop every nnn columns (default 4).",
  18. "The file_list is a list of files (wildcards are acceptable).",
  19. "",
  20. "Output is to stdout.  To print add >PRN: to your command.",
  21. 0 };
  22.  
  23.  
  24. #define DeSmet 1
  25. #define MSDOS 1
  26. #define LMAX  256
  27.  
  28. #ifndef stdin
  29. #define stdin STDIN
  30. #define stdout STDOUT
  31. #define stderr STDERR
  32. #endif
  33.  
  34.  
  35. int    wflag;
  36. int    nflag;
  37. int    hflag;
  38. int    vflag;
  39. int    nfile;
  40.  
  41. int    pflag = 55;
  42. int    tflag = 4;
  43. int    lflag = 80;
  44.  
  45. char lbuf[LMAX];
  46.  
  47. int    debug    =    0;       /* Set for debug code      */
  48.  
  49. char    *pp;
  50.  
  51. /*******************************************************/
  52.  
  53. main(argc, argv)
  54. char *argv[];
  55. {
  56.    register char   *p;
  57.    register int    c, i;
  58.    char  *fexpnd();
  59.  
  60.    FILE        *f;
  61.  
  62.    if (argc <= 1)
  63.       usage("No arguments");
  64.    if (argc == 2 && argv[1][0] == '?' && argv[1][1] == 0) {
  65.       help(documentation);
  66.       return;
  67.       }
  68.    nfile = argc-1;
  69.    for (i=1; i < argc; ++i) {
  70.       p = argv[i];
  71.       if (*p == '-') {
  72.      ++p;
  73.      while (c = *p++) {
  74.         switch(tolower(c)) {
  75.  
  76.         case '?':
  77.            help(documentation);
  78.            break;
  79.  
  80.         case 'W':
  81.         case 'w':
  82.            ++wflag;
  83.            break;
  84.  
  85.         case 'D':
  86.         case 'd':
  87.            ++debug;
  88.            break;
  89.  
  90.         case 'N':
  91.         case 'n':
  92.            ++nflag;
  93.            break;
  94.  
  95.         case 'H':
  96.         case 'h':
  97.            ++hflag;
  98.            break;
  99.  
  100.         case 'V':
  101.         case 'v':
  102.            ++vflag;
  103.            break;
  104.  
  105.         case 'L':
  106.         case 'l':
  107.            lflag=atoi(p);
  108.            if (lflag > 132 | lflag < 9)
  109.           error("Line size must be 9 - 132\n","");
  110.            while (*p != '\0')               /* skip value */
  111.             p++;
  112.            break;
  113.  
  114.         case 'P':
  115.         case 'p':
  116.            pflag=atoi(p)-4;      /* -4 to allow for heading */
  117.            if (pflag < 1)
  118.           error("Page size must be > 4","");
  119.            while (*p != '\0')               /* skip value */
  120.             p++;
  121.            break;
  122.  
  123.         case 'T':
  124.         case 't':
  125.            tflag=atoi(p);
  126.            while (*p != '\0')               /* skip value */
  127.             p++;
  128.            break;
  129.  
  130.         default:
  131.            usage("Unknown flag");
  132.         }
  133.      }
  134.      argv[i] = 0;
  135.      --nfile;
  136.       }
  137.    }
  138.  
  139.    if (hflag)
  140.       pflag += 4;     /* give back lines for headings if not necessary */
  141.  
  142.    if (nfile == 0)
  143.       list(stdin, 0);
  144.    else {
  145.       for (i=1; i < argc; ++i) {
  146. #if MSDOS
  147.      if (argv[i])
  148.      while (p = fexpnd(argv[i])) {
  149. #else
  150.      if (p = argv[i]) {
  151. #endif
  152.         if ((f=fopen(p, "r")) == NULL)
  153.            cant(p);
  154.         else {
  155.            list(f, p);
  156.            fclose(f);
  157.         }
  158.      }
  159.       }
  160.    }
  161. }
  162.  
  163. /*******************************************************/
  164.  
  165. usage(s)
  166. char    *s;
  167. {
  168.    puts("?LIST-E-");
  169.    puts(s);
  170.    puts("\n");
  171.    puts("Usage: list [-whnv] [-lnnn] [-pnnn] [-tnnn] [file ...].  \n");
  172.    exit(1);
  173. }
  174.  
  175.  
  176.  
  177. /*******************************************************/
  178.  
  179. list(fp, fn)
  180. FILE       *fp;       /* File to process        */
  181. char       *fn;       /* File name (for -f option)  */
  182. /*
  183.  * List the file with headings, etc.
  184.  */
  185. {
  186.     register int lno, count;
  187.     int pageno, llen, rlen, i;
  188.     char date[9], time[9], sbuf[LMAX];
  189.  
  190.     dates(date);                /* get date and time from operating system */
  191.     times(time);
  192.     pageno = 0;
  193.     count = 0;
  194.  
  195.     lno = pflag + 1;
  196.     while (fgets(lbuf, LMAX, fp)) {
  197.         if (lno >= pflag)  {
  198.             lno = 0;
  199.             if (!hflag) {
  200.                 printf("\f %-12s ",fn);
  201.                 for (i=1; i < lflag - 50; i++)
  202.                     printf(" ");
  203.                 printf("%s %s    Page %d\n\n\n",date,time,++pageno);
  204.             }
  205.             else
  206.                 printf("\f");
  207.         }
  208.         ++count;
  209.         if (nflag) {
  210.            printf("%5d   ", count);
  211.            llen = lflag - 8;   /* -8 for the line number  */
  212.         }
  213.         else
  214.            llen = lflag;
  215.  
  216.         detabs(sbuf,lbuf,tflag,LMAX);        /* expand tabs, if necessary  */
  217.  
  218.         if (wflag)
  219.             rlen = strlen(sbuf);
  220.         else
  221.             rlen = llen;
  222.  
  223.         for (;rlen > 0;rlen-=llen) {
  224.             ++lno;
  225.             strncpy(lbuf,sbuf,llen);  /* limit output line length */
  226.             if (lbuf[llen-1] != '\0') {
  227.                 lbuf[llen] = '\n';                /* in case len(sbuf) > llen */
  228.                 lbuf[llen+1] = '\0';
  229.             }
  230.  
  231.             printf("%s", lbuf);
  232.  
  233.             if (rlen > llen) {
  234.                 strncpy(sbuf,sbuf+llen,rlen);    /* discard part printed */
  235.                 printf("        ");
  236.                 llen = lflag - 8;
  237.             }
  238.         }
  239.    }
  240.     if (vflag)
  241.       fprintf(stderr," %s: lines=%d, pages=%d\n", fn,count,pageno);
  242. }
  243.  
  244.  
  245.  
  246. /*******************************************************/
  247.  
  248. detabs(bufo,bufi,tabsize,omax)    /* remove tabs from input string */
  249. char bufi[], bufo[];
  250. int tabsize, omax;
  251. {
  252.     char c;
  253.     int ii, io;
  254.  
  255.     ii = io = 0;
  256.     while ((c = bufi[ii++]) && io < omax)        /* till end of string */
  257.         if (c == '\t') {
  258.             bufo[io++] = ' ';
  259.             while ((io % tabsize) && io < omax)    /* space to next tab */
  260.                 bufo[io++] = ' ';
  261.         }
  262.         else if (c != '\f')
  263.             bufo[io++] = c;
  264.  
  265.     bufo[io] = '\0';
  266.  
  267.  
  268. }
  269.  
  270.