1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24 * Glenn Fowler
25 * AT&T Bell Laboratories
26 *
27 * time conversion support
28 */
29
30 #include <ast.h>
31 #include <tm.h>
32 #include <ctype.h>
33
34 /*
35 * match s against t ignoring case and .'s
36 *
37 * suf is an n element table of suffixes that may trail s
38 * if all isalpha() chars in s match then 1 is returned
39 * and if e is non-null it will point to the first unmatched
40 * char in s, otherwise 0 is returned
41 */
42
43 int
tmword(register const char * s,char ** e,register const char * t,char ** suf,int n)44 tmword(register const char* s, char** e, register const char* t, char** suf, int n)
45 {
46 register int c;
47 const char* b;
48
49 if (*s && *t)
50 {
51 b = s;
52 while (c = *s++)
53 {
54 if (c != '.')
55 {
56 if (!isalpha(c) || c != *t && (islower(c) ? toupper(c) : tolower(c)) != *t)
57 break;
58 t++;
59 }
60 }
61 s--;
62 if (!isalpha(c))
63 {
64 if (c == '_')
65 s++;
66 if (e)
67 *e = (char*)s;
68 return s > b;
69 }
70 if (!*t && s > (b + 1))
71 {
72 b = s;
73 while (n-- && (t = *suf++))
74 {
75 s = b;
76 while (isalpha(c = *s++) && (c == *t || (islower(c) ? toupper(c) : tolower(c)) == *t)) t++;
77 if (!*t && !isalpha(c))
78 {
79 if (c != '_')
80 s--;
81 if (e)
82 *e = (char*)s;
83 return 1;
84 }
85 }
86 }
87 }
88 return 0;
89 }
90