home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d128
/
mrbackup
/
unixwild.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-01-02
|
2KB
|
122 lines
/* unixwild.c
* Unix (tm) wildcard support routines.
* Created on 08/07/87
*/
/* Text a filename for wildcard content.
* Called with:
* name: pathname
* Returns:
* 0 => no wild characters
* 1 => 1 or more wild characters
*/
int
iswild(name)
char *name;
{
register char c, *s;
for (s = name; c = *s++; )
if (c == '*' || c == '?') return 1;
return 0;
}
/*
* Compare a wild card name with a normal name.
* Called with:
* wild: name with "wild" content
* name: "normal" name
* Returns:
* 0 => names don't match
* 1 => names match
*
* This source was lifted from Steve Drew's version of Matt Dillon's
* shell, version 2.06m.
*
*/
#define MAXB 8
int
wildcmp(wild,name)
char *wild,*name;
{
register char *w = wild;
register char *n = name;
char *back[MAXB][2];
register char s1,s2;
int bi = 0;
while (*n || *w){
switch (*w){
case '*':
if (bi == MAXB){
#ifdef DEBUG
printf("Too many levels of '*'\n");
#endif
return (0);
}
back[bi][0]= w;
back[bi][1]= n;
++bi;
++w;
continue;
goback:
--bi;
while (bi >= 0 && *back[bi][1]== '\0')
--bi;
if (bi < 0)
return (0);
w = back[bi][0]+ 1;
n = ++back[bi][1];
++bi;
continue;
case '?':
if (!*n){
if (bi)
goto goback;
return (0);
}
break;
default:
s1 = (*n >= 'A' && *n <= 'Z')?*n - 'A' + 'a' :*n;
s2 = (*w >= 'A' && *w <= 'Z')?*w - 'A' + 'a' :*w;
if (s1 != s2){
if (bi)
goto goback;
return (0);
}
break;
}
if (*n)
++n;
if (*w)
++w;
}
return (1);
}
#ifdef DEBUG
char normal[81], wild[81];
main()
{
puts("Terminate this program by entering 'quit'");
for (;;) {
puts("Enter the non-wild pathname:");
gets(normal);
if (!strcmp(normal,"quit")) break;
if (iswild(normal)) {
puts("No, idiot! Enter a non-wild filename!");
continue;
}
puts("Enter a wild pathname:");
gets(wild);
if (wildcmp(wild,normal))
puts("Yup, they match.");
else
puts("No match here.");
}
}
#endif