/* * globfile: routines to expand wildcards. * * contains: * glob() - expands a pattern into a collection of filenames. * basename() - returns the filename part of a pathname. */ #include #include #include #include "glob.h" /* * basename() returns the filename part of a pathname */ char * basename(s) register char *s; { register char *p = s; for (p = s+strlen(s); p > s; --p) if (p[-1] == '/' || p[-1] == '\\' || p[-1] == ':') return p; return s; } /* basename */ /* * glob() expands a wildcard, via calls to _dos_findfirst/_next() * and pathname retention. */ char * glob(path, dta) char *path; struct glob_t *dta; { static char path_bfr[256]; /* full pathname to return */ static char *file_part; /* points at file - for filling */ static char isdotpattern; /* looking for files starting with . */ static char isdotordotdot; /* special case . or .. */ static struct glob_t *dta_bfr; /* pointer to desired dta */ static struct find_t dird; /* DOS dta */ register st; /* status from _dos_findxxx */ if (path) { /* when we start searching, save the path part of the filename in * a safe place. */ strcpy(path_bfr, path); file_part = basename(path_bfr); /* set up initial parameters for DosFindFirst() */ dta_bfr = dta; if (isdotpattern = (*file_part == '.')) /* _dos_findfirst() magically expands . and .. into their * directory names. Admittedly, there are cases where * this can be useful, but this is not one of them. So, * if we find that we're matching . and .., we just * special-case ourselves into oblivion to get around * this particular bit of DOS silliness. */ isdotordotdot = (file_part[1] == 0 || file_part[1] == '.'); else isdotordotdot = 0; st = _dos_findfirst(path, 0x16, &dird); } else st = _dos_findnext(&dird); while (st == 0) { /* Unless the pattern has a leading ., don't include any file * that starts with . */ if (dird.name[0] == '.' && !isdotpattern) st = _dos_findnext(&dird); else { /* found a file - affix the path leading to it, then return * a pointer to the (static) buffer holding the path+the name. */ strlwr(dird.name); /* DOS & OS/2 are case-insensitive */ if (dta_bfr) { dta_bfr->wr_time = dird.wr_time; dta_bfr->wr_date = dird.wr_date; if (isdotordotdot) strcpy(dta_bfr->name, file_part); else { strncpy(dta_bfr->name, dird.name, sizeof(dta_bfr->name)-1); dta_bfr->name[sizeof(dta_bfr->name)-1] = 0; } dta_bfr->size = dird.size; dta_bfr->attrib = dird.attrib; } if (!isdotordotdot) strcpy(file_part, dird.name); return path_bfr; } } /* nothing matched */ if (path && isdotordotdot) { /* must be at root, so statting dot will most likely fail. Fake a * dta. */ if (dta_bfr) { memset(dta_bfr, 0, sizeof *dta_bfr); dta_bfr->attrib = 0x10; dta_bfr->name[0] = '.'; } return path_bfr; } return (char*)0; } /* glob */