home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / printer / lp / source.lha / source / ti.c < prev    next >
C/C++ Source or Header  |  1995-01-11  |  5KB  |  177 lines

  1. /*--------------------------------------------------------------------------*
  2.               __    __
  3.              / /   /_/                      $RCSfile: ti.c,v $
  4.             / /_  __                        $Release$
  5.            / __/ / /                        $Revision: 1.3 $
  6.           / /__ / /_                        $Date: 92/12/19 14:27:08 $
  7.          /____//___/                        $Author: tf $
  8.                                             $State: Exp $
  9.  
  10.            (c) Copyright 1992 Tobias Ferber, All Rights Reserved.
  11.  
  12.  *--------------------------------------------------------------------------*/
  13.  
  14. #include <exec/types.h>
  15. #include <stdio.h>
  16.  
  17. static char rcs_id[]= "$Id: ti.c,v 1.3 92/12/19 14:27:08 tf Exp $";
  18.  
  19. #define BANNER "(c)Copyright 1992 by Tobias Ferber, All Rights Reserved\n" \
  20.                "TI <textfile> [-w] [-t] [-q]"
  21.  
  22. #define crsr_on  "\233\40\160\r"
  23. #define crsr_off "\233\60\40\160\r"
  24.  
  25. /* word seperators */
  26.  
  27. #define isws(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
  28.  
  29. FILE *fp; /* global (for _abort) */
  30.  
  31. void _abort(void)
  32. { if(fp) fclose(fp);
  33.   printf("^C\n**BREAK\n\n%s",crsr_on);
  34.   exit(1);
  35. }
  36.  
  37. char *howtouse[] = {
  38.  
  39.  "CHECKWIDTH", "-w", "<width>", "inform about lines with more than <width> characters",
  40.  "TABSIZE",    "-t", "<size> ", "set tabsize to <size> (default: 8)",
  41.  "BRIEF",      "-b", "       ", "stop after the first line of output",
  42.  "FIND",       "-c", "<value>", "find characters with an ASCII value of <value>",
  43.  
  44.  NULL,NULL,NULL,NULL
  45. };
  46.  
  47. main(int argc, char *argv[])
  48. {
  49.   BOOL badopt= FALSE,  /* bad option ? */
  50.        verbose= TRUE;  /* display statistics */
  51.  
  52.   char *whoami= argv[0],     /* who am I */
  53.        *fname= (char *)NULL; /* filename */
  54.  
  55.   long ts=8,    /* tab size */
  56.        chw=0,   /* width to check */
  57.        asc=-1;  /* char to find */
  58.  
  59.   onbreak(_abort);
  60.  
  61.   if(argc>1)
  62.   { --argc;
  63.     ++argv;
  64.     while(argc>0 && !badopt)
  65.     { char *arg=argv[0];
  66.       if(isalpha(*arg)) /* convert options: AmigaDOS -> UNIX */
  67.       { char **aopt= &howtouse[0];
  68.         while(*aopt && strnicmp(arg,*aopt,strlen(*aopt)))
  69.           aopt= &aopt[4];
  70.         if(*aopt) arg= aopt[1];
  71.       }
  72.       if(*arg=='-')
  73.       { arg++;
  74.         switch(*arg)
  75.         { case 'w': case 'W': /* CHECKWIDTH */
  76.             if(arg[1]) chw= atol(&arg[1]);
  77.             else
  78.             { argv++;
  79.               argc--;
  80.               chw= atol(argv[0]);
  81.             }
  82.             break;
  83.           case 't': case 'T': /* TABSIZE */
  84.             if(arg[1]) ts= atol(&arg[1]);
  85.             else
  86.             { argv++;
  87.               argc--;
  88.               ts= atol(argv[0]);
  89.             }
  90.             break;
  91.           case 'c': case 'C': /* FIND */
  92.             if(arg[1]) asc= atol(&arg[1]);
  93.             else
  94.             { argv++;
  95.               argc--;
  96.               asc= atol(argv[0]);
  97.             }
  98.             break;
  99.           case 'b': case 'B': /* BRIEF */
  100.             verbose= FALSE;
  101.             break;
  102.           default:
  103.             printf("%s: Bad option: -%c.\n",whoami,*arg);
  104.             badopt=TRUE;
  105.             break;
  106.         }
  107.       }
  108.       else if(*arg=='?')
  109.       { char **s= &howtouse[0];
  110.         while(*s)
  111.         { printf("%-10s or %-2s %s  %s\n",s[0],s[1],s[2],s[3]);
  112.           s= &s[4];
  113.         }
  114.         exit(0);
  115.       }
  116.       else fname=arg;
  117.       --argc;
  118.       ++argv;
  119.     }
  120.     if(!badopt)
  121.     { if(!fname)
  122.       { printf("%s: Filename expected.\n",whoami);
  123.         exit(5);
  124.       }
  125.       if(!(fp= fopen(fname,"r")))
  126.       { printf("%s: No information for \"%s\": object not found\n",whoami,fname);
  127.         exit(5);
  128.       }
  129.       printf(crsr_off);
  130.  
  131.       long b=0,  /* byte counter */
  132.            l=0,  /* lines counter */
  133.            w=0,  /* words counter */
  134.            cl=0, /* chars per line counter */
  135.            cm=0; /* max #of chars per line */
  136.  
  137.       BOOL goon= TRUE; /* don't stop now */
  138.  
  139.       char c,d='\0';
  140.       for(;(c=fgetc(fp))!=EOF && !feof(fp) && goon;++b)
  141.       {
  142.         if(asc>=0 && c==(char)asc)
  143.         { printf("%s: Line %ld \"%s\" contains character 0x%02x\n",whoami,l,fname,c);
  144.           goon= verbose;
  145.         }
  146.         if(c=='\n'||c=='\f')
  147.         { ++l;
  148.           ++w;
  149.           if(cl>cm) cm=cl;
  150.           if(chw>0 && cl>chw)
  151.           { printf("%s: Line %ld \"%s\" width %d > %ld\n",whoami,l,fname,cl,chw);
  152.             goon= verbose;
  153.           }
  154.           cl=0L;
  155.         }
  156.         else
  157.         { if(isws(c) && !isws(d)) ++w;
  158.           if(c=='\t' && ts>1) cl= cl+ts-(cl%ts);
  159.           else ++cl;
  160.         }
  161.         d=c;
  162.       }
  163.       if(verbose)
  164.       { printf("file \"%s\" size: %ld bytes, %ld lines <= %ld chars, %ld words\n",
  165.           fname,b,l,cm,w);
  166.       }
  167.       printf(crsr_on);
  168.       if(fp) fclose(fp);
  169.     }
  170.   }
  171.   else /* no args */
  172.   { puts(rcs_id);
  173.     puts(BANNER);
  174.   }
  175.   exit(0);
  176. }
  177.