xref: /titanic_41/usr/src/lib/libast/common/tm/tmword.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2008 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
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