home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume24 / mkid2 / part01 / fid.c < prev    next >
C/C++ Source or Header  |  1991-10-09  |  2KB  |  131 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.     if ((idFile = LookUp(idFile)) == NULL) {
  59.         filerr("open", idFile);
  60.         exit(1);
  61.     }
  62.     if ((IdFILE = initID(idFile, &Idh, &IdArgs)) == NULL) {
  63.         filerr("open", idFile);
  64.         exit(1);
  65.     }
  66.  
  67.     if (argc < 1 || argc > 2)
  68.         usage();
  69.  
  70.     fileId(argc, argv);
  71.     exit(0);
  72. }
  73.  
  74. void
  75. fileId(argc, argv)
  76.     int        argc;
  77.     char        **argv;
  78. {
  79.     char        *buf;
  80.     int        want, got;
  81.     int        bitoff[2];
  82.     int        i, j;
  83.     int        argLength;
  84.     int        pathLength;
  85.     int        lengthDiff;
  86.     char        *pathVec;
  87.     register struct idarg    *idArgs;
  88.  
  89.     want = 0;
  90.     for (j = 0; j < argc; j++, argv++) {
  91.         want |= (1<<j);
  92.         argLength = strlen(*argv);
  93.         bitoff[j] = -1;
  94.         for (idArgs = IdArgs, i = 0; i < Idh.idh_pthc; i++, idArgs++) {
  95.             pathLength = strlen(idArgs->ida_arg);
  96.             if (argLength > pathLength)
  97.                 continue;
  98.             lengthDiff = pathLength - argLength;
  99.             if (strequ(&idArgs->ida_arg[lengthDiff], *argv)) {
  100.                 bitoff[j] = i;
  101.                 break;
  102.             }
  103.         }
  104.         if (bitoff[j] < 0) {
  105.             fprintf(stderr, "%s: not found\n", *argv);
  106.             exit(1);
  107.         }
  108.     }
  109.  
  110.     buf = malloc((int)Idh.idh_bsiz);
  111.     fseek(IdFILE, Idh.idh_namo, 0);
  112.  
  113.     for (i = 0; i < Idh.idh_namc; i++) {
  114.         pathVec = 1 + buf + fgets0(buf, Idh.idh_bsiz, IdFILE);
  115.         getsFF(pathVec, IdFILE);
  116.         got = 0;
  117.         while ((*pathVec & 0xff) != 0xff) {
  118.             j = strToInt(pathVec, Idh.idh_vecc);
  119.             if ((want & (1<<0)) && j == bitoff[0])
  120.                 got |= (1<<0);
  121.             if ((want & (1<<1)) && j == bitoff[1])
  122.                 got |= (1<<1);
  123.             if (got == want) {
  124.                 printf("%s\n", ID_STRING(buf));
  125.                 break;
  126.             }
  127.             pathVec += Idh.idh_vecc;
  128.         }
  129.     }
  130. }
  131.