home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / dirs / mkid_448.lzh / Mkid / src / fid.c < prev    next >
C/C++ Source or Header  |  1991-02-01  |  2KB  |  128 lines

  1. static char copyright[] = "@(#)Copyright (c) 1986, Greg McGary";
  2. static char sccsid[] = "@(#)fid.c    1.2 86/10/17";
  3.  
  4. #include    "bool.h"
  5. #include    <stdio.h>
  6. #include    "string.h"
  7. #include    <ctype.h>
  8. #include    "radix.h"
  9. #include    "id.h"
  10. #include    "bitops.h"
  11. #include    "extern.h"
  12.  
  13. void fileId();
  14.  
  15. FILE        *IdFILE;
  16. struct idhead    Idh;
  17. struct idarg    *IdArgs;
  18.  
  19. char *MyName;
  20. static void
  21. usage()
  22. {
  23.     fprintf(stderr, "Usage: %s [-f<file>] file1 file2\n", MyName);
  24.     exit(1);
  25. }
  26. main(argc, argv)
  27.     int        argc;
  28.     char        **argv;
  29. {
  30.     char        *idFile = IDFILE;
  31.     char        *arg;
  32.     float        occurPercent = 0.0;
  33.     int        occurNumber = 0;
  34.     int        op;
  35.  
  36.     MyName = basename(GETARG(argc, argv));
  37.  
  38.     while (argc) {
  39.         arg = GETARG(argc, argv);
  40.         switch (op = *arg++)
  41.         {
  42.         case '-':
  43.         case '+':
  44.             break;
  45.         default:
  46.             UNGETARG(argc, argv);
  47.             goto argsdone;
  48.         }
  49.         while (*arg) switch (*arg++)
  50.         {
  51.         case 'f': idFile = arg; goto nextarg;
  52.         default: usage();
  53.         }
  54.     nextarg:;
  55.     }
  56. argsdone:
  57.  
  58.     idFile = spanPath(getDirToName(idFile), idFile);
  59.     if ((IdFILE = initID(idFile, &Idh, &IdArgs)) == NULL) {
  60.         filerr("open", idFile);
  61.         exit(1);
  62.     }
  63.  
  64.     if (argc < 1 || argc > 2)
  65.         usage();
  66.  
  67.     fileId(argc, argv);
  68.     exit(0);
  69. }
  70.  
  71. void
  72. fileId(argc, argv)
  73.     int        argc;
  74.     char        **argv;
  75. {
  76.     char        *buf;
  77.     int        want, got;
  78.     int        bitoff[2];
  79.     int        i, j;
  80.     int        argLength;
  81.     int        pathLength;
  82.     int        lengthDiff;
  83.     char        *pathVec;
  84.     register struct idarg    *idArgs;
  85.  
  86.     want = 0;
  87.     for (j = 0; j < argc; j++, argv++) {
  88.         want |= (1<<j);
  89.         argLength = strlen(*argv);
  90.         bitoff[j] = -1;
  91.         for (idArgs = IdArgs, i = 0; i < Idh.idh_pthc; i++, idArgs++) {
  92.             pathLength = strlen(idArgs->ida_arg);
  93.             if (argLength > pathLength)
  94.                 continue;
  95.             lengthDiff = pathLength - argLength;
  96.             if (strequ(&idArgs->ida_arg[lengthDiff], *argv)) {
  97.                 bitoff[j] = i;
  98.                 break;
  99.             }
  100.         }
  101.         if (bitoff[j] < 0) {
  102.             fprintf(stderr, "%s: not found\n", *argv);
  103.             exit(1);
  104.         }
  105.     }
  106.  
  107.     buf = malloc((int)Idh.idh_bsiz);
  108.     fseek(IdFILE, Idh.idh_namo, 0);
  109.  
  110.     for (i = 0; i < Idh.idh_namc; i++) {
  111.         pathVec = 1 + buf + fgets0(buf, Idh.idh_bsiz, IdFILE);
  112.         getsFF(pathVec, IdFILE);
  113.         got = 0;
  114.         while ((*pathVec & 0xff) != 0xff) {
  115.             j = strToInt(pathVec, Idh.idh_vecc);
  116.             if ((want & (1<<0)) && j == bitoff[0])
  117.                 got |= (1<<0);
  118.             if ((want & (1<<1)) && j == bitoff[1])
  119.                 got |= (1<<1);
  120.             if (got == want) {
  121.                 printf("%s\n", ID_STRING(buf));
  122.                 break;
  123.             }
  124.             pathVec += Idh.idh_vecc;
  125.         }
  126.     }
  127. }
  128.