1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman 
24*b30d1939SAndy Fiddaman #include <ast.h>
25*b30d1939SAndy Fiddaman #include <ctype.h>
26*b30d1939SAndy Fiddaman 
27*b30d1939SAndy Fiddaman static char**		ids;
28*b30d1939SAndy Fiddaman 
29*b30d1939SAndy Fiddaman static const char*	dflt[] = { "ast", "standard", 0 };
30*b30d1939SAndy Fiddaman 
31*b30d1939SAndy Fiddaman /*
32*b30d1939SAndy Fiddaman  * initialize the conformance() id list
33*b30d1939SAndy Fiddaman  */
34*b30d1939SAndy Fiddaman 
35*b30d1939SAndy Fiddaman static char**
initconformance(void)36*b30d1939SAndy Fiddaman initconformance(void)
37*b30d1939SAndy Fiddaman {
38*b30d1939SAndy Fiddaman 	char*			m;
39*b30d1939SAndy Fiddaman 	char**			p;
40*b30d1939SAndy Fiddaman 	char*			t;
41*b30d1939SAndy Fiddaman 	int			h;
42*b30d1939SAndy Fiddaman 	int			i;
43*b30d1939SAndy Fiddaman 	int			j;
44*b30d1939SAndy Fiddaman 	int			c;
45*b30d1939SAndy Fiddaman 	Sfio_t*			sp;
46*b30d1939SAndy Fiddaman 
47*b30d1939SAndy Fiddaman 	static const char*	conf[] = { "CONFORMANCE", "HOSTTYPE", "UNIVERSE" };
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman 	p = 0;
50*b30d1939SAndy Fiddaman 	if (sp = sfstropen())
51*b30d1939SAndy Fiddaman 	{
52*b30d1939SAndy Fiddaman 		for (i = h = 0, j = 1; i < elementsof(conf); i++)
53*b30d1939SAndy Fiddaman 			if (*(m = astconf(conf[i], NiL, NiL)) && (h |= (1<<i)) || !i && (m = "ast"))
54*b30d1939SAndy Fiddaman 			{
55*b30d1939SAndy Fiddaman 				t = m;
56*b30d1939SAndy Fiddaman 				while ((c = *m++) && c != '.')
57*b30d1939SAndy Fiddaman 				{
58*b30d1939SAndy Fiddaman 					if (isupper(c))
59*b30d1939SAndy Fiddaman 						c = tolower(c);
60*b30d1939SAndy Fiddaman 					sfputc(sp, c);
61*b30d1939SAndy Fiddaman 				}
62*b30d1939SAndy Fiddaman 				sfputc(sp, 0);
63*b30d1939SAndy Fiddaman 				j++;
64*b30d1939SAndy Fiddaman 				if ((c = (m - t)) == 6 && strneq(t, "linux", 5))
65*b30d1939SAndy Fiddaman 				{
66*b30d1939SAndy Fiddaman 					sfputr(sp, "gnu", 0);
67*b30d1939SAndy Fiddaman 					j++;
68*b30d1939SAndy Fiddaman 				}
69*b30d1939SAndy Fiddaman 				else if (c > 3 && strneq(t, "bsd", 3) || c == 7 && strneq(t, "debian", 7))
70*b30d1939SAndy Fiddaman 				{
71*b30d1939SAndy Fiddaman 					sfputr(sp, "bsd", 0);
72*b30d1939SAndy Fiddaman 					j++;
73*b30d1939SAndy Fiddaman 				}
74*b30d1939SAndy Fiddaman 				if (h & 1)
75*b30d1939SAndy Fiddaman 					break;
76*b30d1939SAndy Fiddaman 			}
77*b30d1939SAndy Fiddaman 		i = sfstrtell(sp);
78*b30d1939SAndy Fiddaman 		sfstrseek(sp, 0, SEEK_SET);
79*b30d1939SAndy Fiddaman 		if (p = newof(0, char*, j, i))
80*b30d1939SAndy Fiddaman 		{
81*b30d1939SAndy Fiddaman 			m = (char*)(p + j--);
82*b30d1939SAndy Fiddaman 			memcpy(m, sfstrbase(sp), i);
83*b30d1939SAndy Fiddaman 			i = 0;
84*b30d1939SAndy Fiddaman 			p[i++] = m;
85*b30d1939SAndy Fiddaman 			while (i < j)
86*b30d1939SAndy Fiddaman 			{
87*b30d1939SAndy Fiddaman 				while (*m++);
88*b30d1939SAndy Fiddaman 				p[i++] = m;
89*b30d1939SAndy Fiddaman 			}
90*b30d1939SAndy Fiddaman 			p[i] = 0;
91*b30d1939SAndy Fiddaman 		}
92*b30d1939SAndy Fiddaman 		sfstrclose(sp);
93*b30d1939SAndy Fiddaman 	}
94*b30d1939SAndy Fiddaman 	if (!p)
95*b30d1939SAndy Fiddaman 		p = (char**)dflt;
96*b30d1939SAndy Fiddaman 	return ids = p;
97*b30d1939SAndy Fiddaman }
98*b30d1939SAndy Fiddaman 
99*b30d1939SAndy Fiddaman /*
100*b30d1939SAndy Fiddaman  * return conformance id if s size n is in conformance
101*b30d1939SAndy Fiddaman  * prefix match of s on the conformance id table
102*b30d1939SAndy Fiddaman  * s==0 => "standard"
103*b30d1939SAndy Fiddaman  */
104*b30d1939SAndy Fiddaman 
105*b30d1939SAndy Fiddaman char*
conformance(const char * s,size_t n)106*b30d1939SAndy Fiddaman conformance(const char* s, size_t n)
107*b30d1939SAndy Fiddaman {
108*b30d1939SAndy Fiddaman 	char**		p;
109*b30d1939SAndy Fiddaman 	char**		q;
110*b30d1939SAndy Fiddaman 	char*		m;
111*b30d1939SAndy Fiddaman 	const char*	e;
112*b30d1939SAndy Fiddaman 	const char*	t;
113*b30d1939SAndy Fiddaman 
114*b30d1939SAndy Fiddaman 	static uint32_t	serial = ~(uint32_t)0;
115*b30d1939SAndy Fiddaman 
116*b30d1939SAndy Fiddaman 	if (!(p = ids) || serial != ast.env_serial)
117*b30d1939SAndy Fiddaman 	{
118*b30d1939SAndy Fiddaman 		serial = ast.env_serial;
119*b30d1939SAndy Fiddaman 		if (ids)
120*b30d1939SAndy Fiddaman 		{
121*b30d1939SAndy Fiddaman 			if (ids != (char**)dflt)
122*b30d1939SAndy Fiddaman 				free(ids);
123*b30d1939SAndy Fiddaman 			ids = 0;
124*b30d1939SAndy Fiddaman 		}
125*b30d1939SAndy Fiddaman 		p = initconformance();
126*b30d1939SAndy Fiddaman 	}
127*b30d1939SAndy Fiddaman 	if (!s)
128*b30d1939SAndy Fiddaman 		s = dflt[1];
129*b30d1939SAndy Fiddaman 	if (!n)
130*b30d1939SAndy Fiddaman 		n = strlen(s);
131*b30d1939SAndy Fiddaman 	e = s + n;
132*b30d1939SAndy Fiddaman 	if (*s == '(')
133*b30d1939SAndy Fiddaman 		s++;
134*b30d1939SAndy Fiddaman 	do
135*b30d1939SAndy Fiddaman 	{
136*b30d1939SAndy Fiddaman 		while (s < e && (isspace(*s) || *s == ',' || *s == '|'))
137*b30d1939SAndy Fiddaman 			s++;
138*b30d1939SAndy Fiddaman 		if (*s == ')')
139*b30d1939SAndy Fiddaman 			break;
140*b30d1939SAndy Fiddaman 		for (t = s; s < e && !isspace(*s) && *s != ',' && *s != '|' && *s != ')'; s++);
141*b30d1939SAndy Fiddaman 		if (s == t)
142*b30d1939SAndy Fiddaman 			break;
143*b30d1939SAndy Fiddaman 		q = p;
144*b30d1939SAndy Fiddaman 		while (m = *q++)
145*b30d1939SAndy Fiddaman 			if (strneq(t, m, s - t))
146*b30d1939SAndy Fiddaman 				return m;
147*b30d1939SAndy Fiddaman 		if (s < e)
148*b30d1939SAndy Fiddaman 			s++;
149*b30d1939SAndy Fiddaman 	} while (s < e);
150*b30d1939SAndy Fiddaman 	return 0;
151*b30d1939SAndy Fiddaman }
152