home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / squsq / fls.c < prev    next >
C/C++ Source or Header  |  1983-09-09  |  4KB  |  142 lines

  1. /*
  2.  * The purpose of this program is to build parameter lists
  3.  * for programs such as the SQ and USQ file compression
  4.  * utilities. This and those programs use the directed io
  5.  * package to allow redirection of console input and/or output.
  6.  * They are coded to accept parameters from the console input or
  7.  * from the command line. Each parameter is on a seperate line.
  8.  *
  9.  * Names beginning with '-' are passed through as options.
  10.  * Drive names (with ':') alone are also passed through.
  11.  *
  12.  * Other parameters are treated as ambiguous file names with
  13.  * optional drive specification. The disk directory is searched
  14.  * and every specific file name which matches the pattern is
  15.  * sent to the output list (with the optional drive specifier).
  16.  * If there are no matches a comment is sent to the console.
  17.  *
  18.  * Example test run (output to console):
  19.  *    A>fls *.c c:*.com b: *.h
  20.  * Example to build list in "file":
  21.  *    A>fls *.c c:*.com b: *.h >file
  22.  * Example to build list in file and send to console too:
  23.  *    A>fls *.c c:*.com b: *.h +file
  24.  * Example to build list and run program SQ.COM with list
  25.  * substituting for keyboard input:
  26.  *    A>fls b: *.c d:*.?Q? |sq
  27.  */
  28.  
  29. #define VERSION "1.1   06/16/81"
  30. #define STDERR    4    /* Error output stream (always console) */
  31.  
  32. #include <bdscio.h>
  33. #include <dio.h>
  34.  
  35. #define SRCH 17 /*bdos search for file pattern*/
  36. #define SRCHNXT 18
  37. #define SETDMA 26
  38. #define TBUFF (0x80+BASE)    /*default disk buffer*/
  39.  
  40. struct fcb {        /* File control block */
  41.     char xxx[36];    /* enough for CP/M 2 */
  42. };
  43.  
  44.  
  45. main(argc, argv)
  46. int argc;
  47. char *argv[];
  48. {
  49.     int i,c;
  50.     int getchar();        /* Directed io version */
  51.     int putchar();        /* Directed io version */
  52.     char inparg[16];    /* parameter from input */
  53.  
  54.     dioinit(&argc, argv);    /* obey directed to args */
  55.  
  56.     fprintf(STDERR, "Parameter list builder - Version %s by\n\tRichard Greenlaw\n\t251 Colony Ct.\n\tGahanna, Ohio 43230\n", VERSION);
  57.     fprintf(STDERR, "Accepts redirection and pipes.\nOmit other parameters for help and prompt\n\n");
  58.  
  59.     /* Process the parameters in order */
  60.     for(i = 1; i < argc; ++i)
  61.         obey(argv[i]);
  62.  
  63.     if(argc < 2) {
  64.         fprintf(STDERR, "\nParameters are from command line or (singly) from console input.\n");
  65.         fprintf(STDERR, "Drive names and -options are passed thru.\nAmbiguous file names are expanded. CR or EOF to stop.\n");
  66.         do {
  67.             fprintf(STDERR, "\n*");
  68.             for(i = 0; i < 16; ++i) {
  69.                 if((c = getchar()) == EOF)
  70.                     c = '\n';    /* fake empty (exit) command */
  71.                 if((inparg[i] = c) == '\n') {
  72.                     inparg[i] = '\0';
  73.                     break;
  74.                 }
  75.             }
  76.             if(inparg[0] != '\0')
  77.                 obey(inparg);
  78.         } while(inparg[0] != '\0');
  79.     }
  80.     dioflush();    /* clean up any directed io */
  81. }
  82.  
  83. /*
  84.  * Function to convert an input parameter to a list of
  85.  * output parameters. Drives (d:), options (-string) and
  86.  * specific file names (w/ optional drive) are passed through.
  87.  * Ambiguous file names are expanded (w/ optional drive)
  88.  * or, if not found, are ignored with comment.
  89.  *
  90.  * Any parameter beginning with a '-' and drive: alone
  91.  * are simply passed to the output.
  92.  *
  93.  * Results are sent to standard output (presumably redirected)
  94.  * with one output parameter per line.
  95.  */
  96.  
  97. obey(afnp)
  98. char *afnp;    /* possible ambiguous file name*/
  99. {
  100.     struct fcb sfcb;
  101.     char *p, *q, i, byteaddr;
  102.     int    n;
  103.     char ufn[15];    /* unambiguous file name */
  104.  
  105.     if(*afnp == '-' || (*(afnp + 1) == ':' && *(afnp + 2) == '\0'))
  106.         printf("%s\n", afnp);    /* pass through option or drive */
  107.     /* Try to build CP/M FCB */
  108.     else if(setfcb(&sfcb, afnp) == ERROR)
  109.         fprintf(STDERR, "%s is bad afn\n", afnp);
  110.     else {
  111.         /* Search disk directory for all ufns which match afn*/
  112.         for(n = 0; ; ++n) {
  113.             bdos(SETDMA, TBUFF);
  114.             byteaddr = n ? bdos(SRCHNXT,&sfcb) : bdos(SRCH,&sfcb);
  115.             if(byteaddr == 255)
  116.                 break;
  117.             p = ufn;
  118.             if(*(afnp+1) == ':') {
  119.                 /* Drive spec.*/
  120.                 *p++ = *afnp;
  121.                 *p++ = ':';
  122.             }
  123.  
  124.             /*Copy filename from directory*/
  125.             q = TBUFF + 32 * (byteaddr % 4);
  126.             for(i =8; i; --i)
  127.                 if((*p = 0x7F & *++q) != ' ') ++p;
  128.             *p++ = '.' ;
  129.  
  130.             /*Copy file extent*/
  131.             for(i = 3; i; --i)
  132.                 if((*p = 0x7F & *++q) != ' ') ++p;
  133.             *p = '\0' ;
  134.  
  135.             /* Output result */
  136.             printf("%s\n", ufn);
  137.         }
  138.         if(n == 0)
  139.             fprintf(STDERR, "%s not found - ignored\n", afnp);
  140.     }
  141. }