diff options
Diffstat (limited to 'usr/src/lib/libast/common/tm/tmword.c')
-rw-r--r-- | usr/src/lib/libast/common/tm/tmword.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/tm/tmword.c b/usr/src/lib/libast/common/tm/tmword.c new file mode 100644 index 0000000000..8333322856 --- /dev/null +++ b/usr/src/lib/libast/common/tm/tmword.c @@ -0,0 +1,89 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#pragma prototyped +/* + * Glenn Fowler + * AT&T Bell Laboratories + * + * time conversion support + */ + +#include <ast.h> +#include <tm.h> +#include <ctype.h> + +/* + * match s against t ignoring case and .'s + * + * suf is an n element table of suffixes that may trail s + * if all isalpha() chars in s match then 1 is returned + * and if e is non-null it will point to the first unmatched + * char in s, otherwise 0 is returned + */ + +int +tmword(register const char* s, char** e, register const char* t, char** suf, int n) +{ + register int c; + const char* b; + + if (*s && *t) + { + b = s; + while (c = *s++) + { + if (c != '.') + { + if (!isalpha(c) || c != *t && (islower(c) ? toupper(c) : tolower(c)) != *t) + break; + t++; + } + } + s--; + if (!isalpha(c)) + { + if (c == '_') + s++; + if (e) + *e = (char*)s; + return s > b; + } + if (!*t && s > (b + 1)) + { + b = s; + while (n-- && (t = *suf++)) + { + s = b; + while (isalpha(c = *s++) && (c == *t || (islower(c) ? toupper(c) : tolower(c)) == *t)) t++; + if (!*t && !isalpha(c)) + { + if (c != '_') + s--; + if (e) + *e = (char*)s; + return 1; + } + } + } + } + return 0; +} |