Path: utzoo!utgpu!water!watmath!clyde!att!osu-cis!tut.cis.ohio-state.edu!mailrus!cornell!rochester!rutgers!apple!voder!pyramid!leadsv!oetl!alan From: alan@oetl.UUCP (Alan Strassberg) Newsgroups: comp.sources.d Subject: Re: PD version of "gmatch"? Message-ID: <398@oetl1.oetl.UUCP> Date: 17 Oct 88 19:13:38 GMT References: <3286@ttidca.TTI.COM> Reply-To: alan@oetl.UUCP (Alan Strassberg) Organization: Lockheed Missiles & Space Co., Santa Cruz, CA. Lines: 90 In article <3286@ttidca.TTI.COM> alter@ttidca.tti.com (Steve Alter) writes: > >Can someone point me to a public-domain (or at least legally copyable) >version of the "gmatch" routine? [ from the posting in comp.os.minix of sh ] /* -------- gmatch.c -------- */ /* * int gmatch(string, pattern) * char *string, *pattern; * * Match a pattern as in sh(1). */ #define NULL 0 #define CMASK 0377 #define QUOTE 0200 #define QMASK (CMASK&~QUOTE) #define NOT '!' /* might use ^ */ static char *cclass(); int gmatch(s, p) register char *s, *p; { register int sc, pc; if (s == NULL || p == NULL) return(0); while ((pc = *p++ & CMASK) != '\0') { sc = *s++ & QMASK; switch (pc) { case '[': if ((p = cclass(p, sc)) == NULL) return(0); break; case '?': if (sc == 0) return(0); break; case '*': s--; do { if (*p == '\0' || gmatch(s, p)) return(1); } while (*s++ != '\0'); return(0); default: if (sc != (pc&~QUOTE)) return(0); } } return(*s == 0); } static char * cclass(p, sub) register char *p; register int sub; { register int c, d, not, found; if ((not = *p == NOT) != 0) p++; found = not; do { if (*p == '\0') return(NULL); c = *p & CMASK; if (p[1] == '-' && p[2] != ']') { d = p[2] & CMASK; p++; } else d = c; if (c == sub || c <= sub && sub <= d) found = !not; } while (*++p != ']'); return(found? p+1: NULL); } -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Alan Strassberg UUCP: ..!{pyramid,leadsv}!oetl!alan work (408) 425-6126 alan@oetl (alan@leadsv) =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-