Re^2: Wildcard Expansion
chris mcdonald
chris at wacsvax.OZ
Sun Feb 4 16:29:19 AEST 1990
karl at haddock.ima.isc.com (Karl Heuer) writes:
>In article <9460 at ttidca.TTI.COM> paulb at ttidca.TTI.COM (Paul Blumstein) writes:
>>In article <8466 at pogo.WV.TEK.COM> bluneski at pogo.WV.TEK.COM (Bob Luneski) writes:
>>>Does anyone have a general wildcard expansion code...
>>See if your system has re_comp & re_exec...
>Wildcard globbing is not the same thing as regexp matching. You could do it
>that way, but you'd have to translate the wildcard pattern to a regexp first.
No, they are not the same, but you can easily convert a filename wildcard
into a regexp if you do not have true globbing code.
Just to show its easy, here's some code that runs under BSD but can be
easily modified for other Unix flavours. Note that this code does not
descend into directories. I can send you some other code if that's what
you want.
Good luck,
Chris McDonald.
Department of Computer Science, ACSnet: chris at wacsvax.oz
University of Western Australia, ARPA: chris%wacsvax.oz at uunet.uu.net
Mounts Bay Road, UUCP: ..!uunet!murtoa!wacsvax!chris
Crawley, Western Australia, 6009. SDI: (31.97 +/-10% S, 115.81 +/-10% E)
PHONE: ((+61) 09) 380 2533 FAX: ((+61) 09) 382 1688
--------------------------------------------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/dir.h>
main(argc,argv) int argc; char *argv[];
{
DIR *opendir(), *dir;
struct direct *readdir(), *dp;
char *getenv(), *re_comp(), *s, *t, buf[BUFSIZ];
int dot = 0, nfound = 0;
if(argc == 2)
argv[2] = getenv("HOME");
else if(argc != 3) {
(void) fprintf(stderr,"Usage : %s pattern [directory]\n",argv[0]);
exit(1);
}
if((dir = opendir(argv[2])) == NULL) {
(void) fprintf(stderr,"%s : cannot open '%s'\n",argv[0],argv[2]);
exit(1);
}
if(*argv[1] == '.') dot++;
s = argv[1];
t = buf;
*t++ = '^';
while(*s)
switch (*s) {
case '.' :
case '\\':
case '$' : *t++ = '\\'; *t++ = *s++; break;
case '*' : *t++ = '.'; *t++ = *s++; break;
case '?' : *t++ = '.'; s++; break;
default : *t++ = *s++;
}
*t++ = '$';
*t = '\0';
(void) printf("%s -> %s\n",argv[1],buf);
if((s = re_comp(buf)) != NULL) {
(void) fprintf(stderr,"%s : %s\n",argv[0],s);
exit(2);
}
while((dp = readdir(dir)) != NULL)
if(dp->d_namlen != 0)
if((dot && *dp->d_name == '.') || *dp->d_name != '.')
{
if(re_exec(dp->d_name) == 1) {
(void) printf("%s\n",dp->d_name);
++nfound;
}
}
(void) printf("\n%d files\n",nfound);
(void) closedir(dir);
exit(0);
}
More information about the Comp.lang.c
mailing list