1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2011 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
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 * return the tab table index that matches s ignoring case and .'s
36 * tm_data.format checked if tminfo.format!=tm_data.format
37 *
38 * ntab and nsuf are the number of elements in tab and suf,
39 * -1 for 0 sentinel
40 *
41 * all isalpha() chars in str must match
42 * suf is a table of nsuf valid str suffixes
43 * if e is non-null then it will point to first unmatched char in str
44 * which will always be non-isalpha()
45 */
46
47 int
tmlex(register const char * s,char ** e,char ** tab,int ntab,char ** suf,int nsuf)48 tmlex(register const char* s, char** e, char** tab, int ntab, char** suf, int nsuf)
49 {
50 register char** p;
51 register char* x;
52 register int n;
53
54 for (p = tab, n = ntab; n-- && (x = *p); p++)
55 if (*x && *x != '%' && tmword(s, e, x, suf, nsuf))
56 return p - tab;
57 if (tm_info.format != tm_data.format && tab >= tm_info.format && tab < tm_info.format + TM_NFORM)
58 {
59 tab = tm_data.format + (tab - tm_info.format);
60 if (suf && tab >= tm_info.format && tab < tm_info.format + TM_NFORM)
61 suf = tm_data.format + (suf - tm_info.format);
62 for (p = tab, n = ntab; n-- && (x = *p); p++)
63 if (*x && *x != '%' && tmword(s, e, x, suf, nsuf))
64 return p - tab;
65 }
66 return -1;
67 }
68