home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 December / VPR9712A.ISO / OLS / OS2 / LHA2P205 / LHA2P205.LZH / lha2-2.05pre / source.lzh / src / match.c < prev    next >
C/C++ Source or Header  |  1996-02-25  |  4KB  |  215 lines

  1. /*
  2.  * match.c --- match filenames
  3.  *   Copyright (C) 1988-1992, Haruyasu YOSHIZAKI
  4.  *   Copyright (C) 1991-1995, Satoshi HIRAMATSU (OS/2 HPFS version)
  5.  *
  6.  * $Log$
  7.  */
  8.  
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include "port2.h"
  15. #include "typedef.h"
  16. #include "lh.h"
  17. #include "errmes.h"
  18.  
  19.  
  20. struct pat *pbuf;
  21. static struct pat *pnxt, *plst;
  22.  
  23.  
  24. /* initialize pattern pointers */
  25. void
  26. initpat(void)
  27. {
  28.   pbuf = plst = e_malloc(sizeof(struct pat *));
  29.   pbuf -> nxt = NULL;
  30. }
  31.  
  32.  
  33. /* regist file matching pattern */
  34. void
  35. regpat(char *pattern, char *bdir)
  36. {
  37.   char *p;
  38.  
  39.   p = getfilename(pattern);
  40.   pnxt = e_malloc(strlen(pattern) + sizeof(struct pat));
  41.   pnxt -> nxt = NULL;
  42.   pnxt -> bdir = bdir;
  43.   pnxt -> cnt = 0;
  44.   strcpy(pnxt -> pname, pattern);
  45.   pnxt -> fname = pnxt -> pname + (p - pattern);
  46.   plst = plst -> nxt = pnxt;
  47. }
  48.  
  49.  
  50. /*
  51.  * regist base directory
  52.  *
  53.  * bdir   : base directory
  54.  * return : saved address
  55.  */
  56. char *
  57. regbdir(char *bdir)
  58. {
  59.   char *p;
  60.  
  61.   p = e_malloc(strlen(bdir) + 1);
  62.   strcpy(p, bdir);
  63.   return p;
  64. }
  65.  
  66.  
  67. /*
  68.  * match filename to pattern including wild cards
  69.  *
  70.  * pname : filename in the pattern
  71.  * fname : filename given
  72.  */
  73. char *
  74. matchfname(char *pname, char *fname)
  75. {
  76.   static char dummy[] = " ";
  77.  
  78.   for(; *pname; pname++)
  79.     {
  80.       switch(*pname)
  81.     {
  82. #ifndef __SUPPORT_HPFS__
  83.     case '+':        /* We can use '+' for filename on OS/2 HPFS. */
  84. #else
  85.     case '\xff':        /* special case */
  86. #endif
  87.       while((uchar)*fname != DELIM && *fname)
  88.         fname++;
  89.       break;
  90.  
  91.     case '*':
  92.       while(*fname != '.' && (uchar)*fname != DELIM && *fname)
  93.         fname++;
  94.       break;
  95.  
  96.     case '?':
  97.       if(*fname != '.' && (uchar)*fname != DELIM && *fname)
  98.         fname++;
  99.       break;
  100.  
  101.     case '.':
  102.       if((uchar)*fname == DELIM || *fname == '\0')
  103.         break;
  104.  
  105.     default:
  106.       if(iskanji(*pname))
  107.         {
  108.           if(*pname != *fname)
  109.         return dummy;
  110.           if(*++pname != *++fname)
  111.         return dummy;
  112.         }
  113.       else if((*pname != *fname) &&
  114.          (flg_i == 1 || toupper(*pname) != toupper(*fname)))
  115.         return dummy;    /* not NULL */
  116.       fname++;
  117.     }
  118.     }
  119.  
  120.   return fname;
  121. }
  122.  
  123.  
  124. /*
  125.  * match pathname to pattern
  126.  *
  127.  * path   : pathname
  128.  * return : it's base directory
  129.  */
  130. char *
  131. matchpat(char *path)
  132. {
  133.   struct pat *pt;
  134.   char *p, *r;
  135.   char *file, *q;
  136.   char c;
  137.  
  138.   file = getfilename(path);
  139.   for(pt = pbuf -> nxt; pt != NULL; pt = pt -> nxt)
  140.     {
  141.       p = pt -> pname;
  142.       switch(flg_r)
  143.     {
  144.     case 0:
  145.       if(pt -> fname == p && flg_p == 0)
  146.         q = matchfname(p, file);
  147.       else
  148.         q = matchfname(p, path);
  149.       if(*q)
  150.         q = NULL;
  151.       break;
  152.  
  153.     case 1:
  154.       c = *(r = pt -> fname);
  155.       *r = '\0';
  156.       q = matchfname(p, path);
  157.       *r = c;
  158.       if(q)
  159.         {
  160.           q = matchfname(pt -> fname, file);
  161.           if(*q)
  162.         q = NULL;
  163.         }
  164.       break;
  165.  
  166.     case 2:
  167.       q = matchfname(p, path);
  168.       if(*q && (uchar)*q != DELIM)
  169.         q = NULL;
  170.       break;
  171.     }
  172.  
  173.       if(q)
  174.     {
  175.       (pt -> cnt)++;
  176.       return (pt -> bdir);
  177.     }
  178.     }
  179.  
  180.   return NULL;
  181. }
  182.  
  183.  
  184. /*
  185.  * whether pattern was used or not
  186.  *
  187.  * return 0 : all pattern was used
  188.  *        1 : some pattern not used
  189.  */
  190. int
  191. tstpat(void)
  192. {
  193.   int cnt;
  194.   struct pat *pt;
  195.  
  196.   cnt = 0;
  197.   for(pt = pbuf -> nxt; pt != NULL; pt = pt -> nxt)
  198.     cnt += pt -> cnt;
  199.   if(cnt == 0)            /* no file matched */
  200.     error(NOFILEERR, NULL);
  201.   cnt = 0;
  202.   for(pt = pbuf -> nxt; pt != NULL; pt = pt -> nxt)
  203.     if(pt -> cnt == 0)    /* if any work name was not used */
  204.       {
  205.     strcpy(work, pt -> pname);
  206.     if(cnt == 0)
  207.       eprintf("\n");
  208.     cnt++;
  209.     eprintf("%s : '%s'\n", NOMATCHERR, work);
  210.     errorlevel = 1;    /* display warning */
  211.       }
  212.  
  213.   return errorlevel;
  214. }
  215.