home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / cowen_tools.lzh / l.c < prev    next >
C/C++ Source or Header  |  1992-03-06  |  5KB  |  216 lines

  1. /*
  2. ** l
  3. **  lists one or more files with wordwrap
  4. **
  5. **
  6. **  copyright 1991 by Cowen Software Ltd
  7. **  23 Bristol Ave, Levenshulme, Manchester,
  8. **  GB-M19 3NU, England, UK
  9. **  released to the public domain for non-commercial use
  10. */
  11.  
  12.  
  13. #include <stdio.h>
  14. #include <modes.h>
  15. #include <ctype.h>
  16.  
  17. #define TRUE  1
  18. #define FALSE 0
  19. #define trace FALSE
  20. #define maxwidth  256
  21. #define defwidth   79
  22. #define deftab      4
  23. #define zlen       80
  24.  
  25. extern int errno;
  26.  
  27. char  fflag = FALSE;                           /* file specified */
  28. char  lflag = FALSE;                           /* line feed      */
  29. char  pflag = FALSE;                           /* form feed      */
  30. char  zflag = FALSE;                           /* read filelist  */
  31.  
  32. int   tval = 0;
  33. int   zpath;
  34.  
  35. int   width = 0;
  36. int   i, j;
  37. char  fline[maxwidth+2];
  38. char zbuff[zlen];
  39.  
  40. main(argc,argv)
  41.  int   argc;
  42. char  **argv;
  43.    {
  44.    char *p;
  45.    FILE  *fp;
  46.    int zread;
  47.    
  48.    getflags(argc,argv);
  49.  
  50.    if (width == 0) width = defwidth;
  51.    if (width > maxwidth) error ("width too great",0);
  52.  
  53.    if ( fflag )
  54.       {
  55.       while (--argc) 
  56.          if (*(p = *++argv) != '-')
  57.             {
  58.             if ( (fp = fopen(p,"r") ) == NULL)
  59.                printf("\n File %s not accessable, error: %d\n ",p,errno);
  60.             else { printf("\n\n   List of File %s\n\n",p);
  61.                    dolist(fp);
  62.                  }
  63.             }
  64.       }
  65.             
  66.    if ( zflag )
  67.       {
  68.       while ( (zread = readln(zpath,zbuff,zlen) ) > 0) 
  69.             {
  70.             if (zread < 2) continue; 
  71.             if ( (fp = fopen(zbuff,"r") ) == NULL)
  72.                printf("\n File %s not accessable, error: %d\n ",p,errno);
  73.             else { printf("\n\n   List of File %s\n\n",zbuff);
  74.                    dolist(fp);
  75.                  }
  76.             }
  77.       if (zread < 0) error("error on input z-file",0);
  78.       }
  79.          
  80.    if (!fflag & !zflag) 
  81.       dolist(stdin);
  82.    }   
  83.  
  84.  
  85.  
  86. getflags(carg,varg)
  87.  int   carg;
  88. char  **varg;
  89.    {
  90.    char  *p, c;
  91.    while ( (--carg) )
  92.       {
  93.       if (*(p = *++varg) == '-')
  94.          {
  95.          while (c = *++p)
  96.             {
  97.             if (isdigit(c)) { width = atoi(p);   break;};
  98.             if (c == 'f')     {pflag = TRUE;     continue;};
  99.             if (c == 'l')     {lflag = TRUE;     continue;};
  100.             if (c == 't')     {
  101.                               if (*++p == '=') tval = atoi(++p);
  102.                               else             tval = deftab;      
  103.                               break;
  104.                               };
  105.             if (c == 'z')     {
  106.                               zflag = TRUE;
  107.                               if (*++p != '=') {zpath = 0; break;};
  108.                               zpath = open(++p,S_IREAD);
  109.                               if (zpath == -1)
  110.                                     error ("Can't open file ",zbuff);
  111.                               break;
  112.                               };
  113.             if (c == '?')     {help();         break;};
  114.             error("bad option",p);
  115.             }
  116.          }
  117.       else
  118.          fflag = TRUE;
  119.  
  120.       }
  121.    }   
  122.  
  123.   
  124.  
  125. dolist(fp)
  126. FILE    *fp;
  127. /*    This procedure is called for each file to be printed
  128. */
  129.       
  130.    {
  131.    int f, tf;
  132.    char pline[maxwidth+2];
  133.  
  134.    i = j = 0;
  135.    do   { f = fgetc(fp);
  136.           if (f == EOF) break;
  137.           if (f == '\n') {printlast(); continue;}
  138.           if ((f == '\l') & lflag) {printlast(); continue;}
  139.           if ((f == '\t') & (tval > 0))
  140.               {
  141.               tf = ( tval - (i % tval) -1);
  142.               while (tf-- > 0)  fline[i++] = ' ';
  143.              }
  144.                
  145.           if (f <  ' ')  {f = ' ';}
  146.           if (isspace(f) )   { if (i == 0)     continue;
  147.                                if (i >= width) continue;
  148.                                j = i;
  149.                              }
  150.           fline[i++] = f;
  151.           if (i >= width)
  152.           {    if (j == 0) j = width;
  153.             else j = j + 1;
  154.               strncpy (pline, fline,j);
  155.               pline[j] = 0;
  156.             printf("%s\n",pline);
  157.               strcpy(&fline[0], &fline[j]);
  158.               i = i - j;
  159.               j = 0;
  160.           }
  161.         }    while (f > 0);
  162.    if (i > 0) printlast();
  163.    if (pflag) printf("\f\n");
  164.    }
  165.    
  166.  printlast()
  167.  { 
  168.    fline[i] = 0;
  169.    printf("%s\n",fline);
  170.    i = j = 0;
  171.  }
  172.  
  173.  
  174.  
  175.  
  176.  
  177. error(s1, s2)
  178. char  *s1, *s2;
  179.  
  180. /*
  181. ** write the two strings passed and then a <cr>
  182. */
  183.  
  184.    {
  185.  
  186.    if (s1)
  187.          fprintf(stderr, "%s", s1 );
  188.    if (s2)
  189.          fprintf(stderr, "%s", s2 );
  190.    fprintf(stderr, "\n");
  191.    fflush(stderr);
  192.    exit (1);
  193.    }
  194.  
  195.  
  196.  
  197. help()
  198.  
  199. /*
  200. ** provide usage info for this command
  201. */
  202.  
  203.    {
  204.    fprintf(stderr, "Usage: l [-options] [file] [file] [-options]\n" );
  205.    fprintf(stderr, "    -no  = width (default 79, max 256) \n" );
  206.    fprintf(stderr, "    file = list of files to be listed\n" );
  207.    fprintf(stderr, "    -f   = form feed after each file \n" );
  208.    fprintf(stderr, "    -l   = end line at line feed \n" );
  209.    fprintf(stderr, "    -t=n = tab-stop every 'n' characters (default = 4)\n" );
  210.    fprintf(stderr, "    -z=xx= read filenames from xx (default = stdin)\n" );
  211.    fprintf(stderr, "    -?   = report help \n" );
  212.    fprintf(stderr, "\n");
  213.    fflush(stderr);
  214.    exit (0);
  215.    }
  216.