so far it's proven to be a drop in replacement for isname already in hander.c. the following file is intended as a pattern test. change <string.h> to which ever is compliant on your platform. notes, comments and critique via email. d. ---------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #define LOWER(c) (((c)>='A' && (c) <= 'Z') ? ((c)+('a'-'A')) : (c)) /* 12.15/95 dhall: attempt to incorporate "dot notation" */ int isname(textlist, namelist) char *textlist; char *namelist; { register char *cptr, *sptr; char *curname; short active, search, string; /* the active flag determines if we search for next element */ /* in textlist, or else seeking current element substring in */ /* namelist */ active = 0; /* for each element of text, we need to traverse the list */ /* curname is the placeholder for the current element in */ /* textlist, this is required since each attempted match */ /* with namelist requires a default string position */ for (curname = textlist; *curname; curname++) { /* status check */ if (active) { if (*curname == '.') active = 0; continue; } /* preceding periods will always match, skip these */ if (*curname == '.') continue; /* the search flag determines if we search for next element */ /* in namelist to compare against curname element */ search = 0; /* string is a boolean status flag for namelist, this was done */ /* since a string check at the start of the loop would not check */ /* against the curname element, therefore the last element would */ /* be truncated by 1 */ string = 1; /* saving curname as default */ cptr = curname; for (sptr = namelist; string; sptr++) { /* status check */ if (search) { if (*sptr == ' ') { /* reset element to default */ cptr = curname; search = 0; } /* need to stop search mode when hit NULL */ if (*sptr != '\0') continue; } /* active is used here as a "short circuit" variable, since if */ /* both textlist element and namelist element match then we want */ /* to break out with active true allowing the outer loop to seek */ /* its next element */ switch (*sptr) { case '\0': string = 0; case ' ': active = 1; break; default: /* set search flag true if nonmatch */ if (LOWER(*sptr) != LOWER(*cptr)) search = 1; break; } if (*cptr == '.' || *cptr == '\0') { /* only break if both conditions are true */ if (active) break; if (*cptr == '\0') active = 1; search = 0; } /* if active is true, the only one of two conditions was true */ /* meaning the substring did not match, but do not immediately */ /* return false, since this is only the interior loop */ if (active) { cptr = curname; active = 0; } else /* increment if traversing current namelist element */ cptr++; } /* since active "fell through" as false, then textlist element */ /* was not found in entire namelist, so we can return false */ if (!active) return (0); } /* return true since we passed all the checks */ return (1); } void main() { char *tlist = "red orange yellow green blue indigo violet"; char *tname[] = { "red", "RED", "ReD", "red.orange", "red.orang", "red.orangee", "..red", "red..", "..red..violet...", "red.orange.violet", "crimson", "crimson.red", NULL }; short i; printf ("$LIST = %s\n", tlist); for (i = 0; tname[i] != NULL; i++) printf ("$LIST ~= /%s/ : %d\n", tname[i], isname (tname[i], tlist)); }
This archive was generated by hypermail 2b30 : 12/07/00 PST