xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/port/astlicense.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2012 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 /*
25*b30d1939SAndy Fiddaman  * Glenn Fowler
26*b30d1939SAndy Fiddaman  * AT&T Research
27*b30d1939SAndy Fiddaman  *
28*b30d1939SAndy Fiddaman  * generate a license comment -- see proto(1)
29*b30d1939SAndy Fiddaman  *
30*b30d1939SAndy Fiddaman  * NOTE: coded for minimal library dependence
31*b30d1939SAndy Fiddaman  *	 not so for the legal department
32*b30d1939SAndy Fiddaman  */
33*b30d1939SAndy Fiddaman 
34*b30d1939SAndy Fiddaman #ifndef	_PPLIB_H
35*b30d1939SAndy Fiddaman #include <ast.h>
36*b30d1939SAndy Fiddaman #include <time.h>
37*b30d1939SAndy Fiddaman #endif
38*b30d1939SAndy Fiddaman 
39*b30d1939SAndy Fiddaman #ifndef O_cloexec
40*b30d1939SAndy Fiddaman #ifdef	O_CLOEXEC
41*b30d1939SAndy Fiddaman #define O_cloexec		0
42*b30d1939SAndy Fiddaman #else
43*b30d1939SAndy Fiddaman #define O_cloexec		0
44*b30d1939SAndy Fiddaman #endif
45*b30d1939SAndy Fiddaman #endif
46*b30d1939SAndy Fiddaman 
47*b30d1939SAndy Fiddaman #undef	copy
48*b30d1939SAndy Fiddaman #undef	BSD			/* guess who defines this */
49*b30d1939SAndy Fiddaman #undef	END
50*b30d1939SAndy Fiddaman #undef	INLINE
51*b30d1939SAndy Fiddaman #undef	TEST
52*b30d1939SAndy Fiddaman #undef	VERBOSE
53*b30d1939SAndy Fiddaman 
54*b30d1939SAndy Fiddaman #define NONE			0
55*b30d1939SAndy Fiddaman #define INLINE			1
56*b30d1939SAndy Fiddaman #define TEST			2
57*b30d1939SAndy Fiddaman #define VERBOSE			3
58*b30d1939SAndy Fiddaman #define USAGE			4
59*b30d1939SAndy Fiddaman #define OPEN			5
60*b30d1939SAndy Fiddaman #define CPL			6
61*b30d1939SAndy Fiddaman #define EPL			7
62*b30d1939SAndy Fiddaman #define BSD			8
63*b30d1939SAndy Fiddaman #define ZLIB			9
64*b30d1939SAndy Fiddaman #define MIT			10
65*b30d1939SAndy Fiddaman #define GPL			11
66*b30d1939SAndy Fiddaman #define SPECIAL			12
67*b30d1939SAndy Fiddaman #define NONEXCLUSIVE		13
68*b30d1939SAndy Fiddaman #define NONCOMMERCIAL		14
69*b30d1939SAndy Fiddaman #define PROPRIETARY		15
70*b30d1939SAndy Fiddaman 
71*b30d1939SAndy Fiddaman #define AUTHOR			0
72*b30d1939SAndy Fiddaman #define CLASS			1
73*b30d1939SAndy Fiddaman #define COMPANY			2
74*b30d1939SAndy Fiddaman #define COMPONENT		3
75*b30d1939SAndy Fiddaman #define CONTRIBUTOR		4
76*b30d1939SAndy Fiddaman #define CORPORATION		5
77*b30d1939SAndy Fiddaman #define DOMAIN			6
78*b30d1939SAndy Fiddaman #define ID			7
79*b30d1939SAndy Fiddaman #define INCORPORATION		8
80*b30d1939SAndy Fiddaman #define LICENSE			9
81*b30d1939SAndy Fiddaman #define LOCATION		10
82*b30d1939SAndy Fiddaman #define NAME			11
83*b30d1939SAndy Fiddaman #define NOTICE			12
84*b30d1939SAndy Fiddaman #define ORGANIZATION		13
85*b30d1939SAndy Fiddaman #define PACKAGE			14
86*b30d1939SAndy Fiddaman #define PARENT			15
87*b30d1939SAndy Fiddaman #define QUERY			16
88*b30d1939SAndy Fiddaman #define SINCE			17
89*b30d1939SAndy Fiddaman #define SOURCE			18
90*b30d1939SAndy Fiddaman #define START			19
91*b30d1939SAndy Fiddaman #define STYLE			20
92*b30d1939SAndy Fiddaman #define URL			21
93*b30d1939SAndy Fiddaman #define URLMD5			22
94*b30d1939SAndy Fiddaman #define VERSION			23
95*b30d1939SAndy Fiddaman 
96*b30d1939SAndy Fiddaman #define IDS			64
97*b30d1939SAndy Fiddaman 
98*b30d1939SAndy Fiddaman #define COMDATA			70
99*b30d1939SAndy Fiddaman #define COMLINE			(COMDATA+4)
100*b30d1939SAndy Fiddaman #define COMLONG			(COMDATA-32)
101*b30d1939SAndy Fiddaman #define COMMENT(x,b,s,u)	comment(x,b,s,sizeof(s)-1,u)
102*b30d1939SAndy Fiddaman 
103*b30d1939SAndy Fiddaman #define PUT(b,c)		(((b)->nxt<(b)->end)?(*(b)->nxt++=(c)):((c),(-1)))
104*b30d1939SAndy Fiddaman #define BUF(b)			((b)->buf)
105*b30d1939SAndy Fiddaman #define USE(b)			((b)->siz=(b)->nxt-(b)->buf,(b)->nxt=(b)->buf,(b)->siz)
106*b30d1939SAndy Fiddaman #define SIZ(b)			((b)->nxt-(b)->buf)
107*b30d1939SAndy Fiddaman #define END(b)			(*((b)->nxt>=(b)->end?((b)->nxt=(b)->end-1):(b)->nxt)=0,(b)->nxt-(b)->buf)
108*b30d1939SAndy Fiddaman 
109*b30d1939SAndy Fiddaman #ifndef NiL
110*b30d1939SAndy Fiddaman #define NiL			((char*)0)
111*b30d1939SAndy Fiddaman #endif
112*b30d1939SAndy Fiddaman 
113*b30d1939SAndy Fiddaman typedef struct Buffer_s
114*b30d1939SAndy Fiddaman {
115*b30d1939SAndy Fiddaman 	char*		buf;
116*b30d1939SAndy Fiddaman 	char*		nxt;
117*b30d1939SAndy Fiddaman 	char*		end;
118*b30d1939SAndy Fiddaman 	int		siz;
119*b30d1939SAndy Fiddaman } Buffer_t;
120*b30d1939SAndy Fiddaman 
121*b30d1939SAndy Fiddaman typedef struct Item_s
122*b30d1939SAndy Fiddaman {
123*b30d1939SAndy Fiddaman 	char*		data;
124*b30d1939SAndy Fiddaman 	int		size;
125*b30d1939SAndy Fiddaman 	int		quote;
126*b30d1939SAndy Fiddaman } Item_t;
127*b30d1939SAndy Fiddaman 
128*b30d1939SAndy Fiddaman typedef struct Id_s
129*b30d1939SAndy Fiddaman {
130*b30d1939SAndy Fiddaman 	Item_t		name;
131*b30d1939SAndy Fiddaman 	Item_t		value;
132*b30d1939SAndy Fiddaman } Id_t;
133*b30d1939SAndy Fiddaman 
134*b30d1939SAndy Fiddaman /*
135*b30d1939SAndy Fiddaman  * NOTE: key[] element order must match the corresponding macro
136*b30d1939SAndy Fiddaman  */
137*b30d1939SAndy Fiddaman 
138*b30d1939SAndy Fiddaman #define KEY(s)			{s,sizeof(s)-1,0}
139*b30d1939SAndy Fiddaman 
140*b30d1939SAndy Fiddaman static const Item_t	key[] =
141*b30d1939SAndy Fiddaman {
142*b30d1939SAndy Fiddaman 	KEY("author"),
143*b30d1939SAndy Fiddaman 	KEY("class"),
144*b30d1939SAndy Fiddaman 	KEY("company"),
145*b30d1939SAndy Fiddaman 	KEY("component"),
146*b30d1939SAndy Fiddaman 	KEY("contributor"),
147*b30d1939SAndy Fiddaman 	KEY("corporation"),
148*b30d1939SAndy Fiddaman 	KEY("domain"),
149*b30d1939SAndy Fiddaman 	KEY("id"),
150*b30d1939SAndy Fiddaman 	KEY("incorporation"),
151*b30d1939SAndy Fiddaman 	KEY("license"),
152*b30d1939SAndy Fiddaman 	KEY("location"),
153*b30d1939SAndy Fiddaman 	KEY("name"),
154*b30d1939SAndy Fiddaman 	KEY("notice"),
155*b30d1939SAndy Fiddaman 	KEY("organization"),
156*b30d1939SAndy Fiddaman 	KEY("package"),
157*b30d1939SAndy Fiddaman 	KEY("parent"),
158*b30d1939SAndy Fiddaman 	KEY("query"),
159*b30d1939SAndy Fiddaman 	KEY("since"),
160*b30d1939SAndy Fiddaman 	KEY("source"),
161*b30d1939SAndy Fiddaman 	KEY("start"),
162*b30d1939SAndy Fiddaman 	KEY("type"),
163*b30d1939SAndy Fiddaman 	KEY("url"),
164*b30d1939SAndy Fiddaman 	KEY("urlmd5"),
165*b30d1939SAndy Fiddaman 	KEY("version"),
166*b30d1939SAndy Fiddaman 	{0}
167*b30d1939SAndy Fiddaman };
168*b30d1939SAndy Fiddaman 
169*b30d1939SAndy Fiddaman #define ITEMS			(sizeof(key)/sizeof(key[0])-1)
170*b30d1939SAndy Fiddaman 
171*b30d1939SAndy Fiddaman #define LIC(s,c)		{s,sizeof(s)-1,c}
172*b30d1939SAndy Fiddaman 
173*b30d1939SAndy Fiddaman static const Item_t	lic[] =
174*b30d1939SAndy Fiddaman {
175*b30d1939SAndy Fiddaman 	LIC("none", NONE),
176*b30d1939SAndy Fiddaman 	LIC("inline", SPECIAL),
177*b30d1939SAndy Fiddaman 	LIC("test", TEST),
178*b30d1939SAndy Fiddaman 	LIC("verbose", VERBOSE),
179*b30d1939SAndy Fiddaman 	LIC("usage", USAGE),
180*b30d1939SAndy Fiddaman 	LIC("open", OPEN),
181*b30d1939SAndy Fiddaman 	LIC("cpl", OPEN),
182*b30d1939SAndy Fiddaman 	LIC("epl", OPEN),
183*b30d1939SAndy Fiddaman 	LIC("bsd", OPEN),
184*b30d1939SAndy Fiddaman 	LIC("zlib", OPEN),
185*b30d1939SAndy Fiddaman 	LIC("mit", OPEN),
186*b30d1939SAndy Fiddaman 	LIC("gpl", GPL),
187*b30d1939SAndy Fiddaman 	LIC("special", SPECIAL),
188*b30d1939SAndy Fiddaman 	LIC("nonexclusive", SPECIAL),
189*b30d1939SAndy Fiddaman 	LIC("noncommercial", SPECIAL),
190*b30d1939SAndy Fiddaman 	LIC("proprietary", PROPRIETARY),
191*b30d1939SAndy Fiddaman 	{0}
192*b30d1939SAndy Fiddaman };
193*b30d1939SAndy Fiddaman 
194*b30d1939SAndy Fiddaman typedef struct Notice_s
195*b30d1939SAndy Fiddaman {
196*b30d1939SAndy Fiddaman 	int		test;
197*b30d1939SAndy Fiddaman 	int		type;
198*b30d1939SAndy Fiddaman 	int		verbose;
199*b30d1939SAndy Fiddaman 	int		ids;
200*b30d1939SAndy Fiddaman 	Item_t		item[ITEMS];
201*b30d1939SAndy Fiddaman 	Id_t		id[IDS];
202*b30d1939SAndy Fiddaman 	char		cc[3];
203*b30d1939SAndy Fiddaman } Notice_t;
204*b30d1939SAndy Fiddaman 
205*b30d1939SAndy Fiddaman /*
206*b30d1939SAndy Fiddaman  * return index given <name,size>
207*b30d1939SAndy Fiddaman  */
208*b30d1939SAndy Fiddaman 
209*b30d1939SAndy Fiddaman static int
lookup(register const Item_t * item,const char * name,int size)210*b30d1939SAndy Fiddaman lookup(register const Item_t* item, const char* name, int size)
211*b30d1939SAndy Fiddaman {
212*b30d1939SAndy Fiddaman 	register int	c;
213*b30d1939SAndy Fiddaman 	register int	i;
214*b30d1939SAndy Fiddaman 
215*b30d1939SAndy Fiddaman 	c = name[0];
216*b30d1939SAndy Fiddaman 	for (i = 0; item[i].data; i++)
217*b30d1939SAndy Fiddaman 		if (c == item[i].data[0] && size == item[i].size && !strncmp(name, item[i].data, size))
218*b30d1939SAndy Fiddaman 			return i;
219*b30d1939SAndy Fiddaman 	return -1;
220*b30d1939SAndy Fiddaman }
221*b30d1939SAndy Fiddaman 
222*b30d1939SAndy Fiddaman /*
223*b30d1939SAndy Fiddaman  * copy s of size n to b
224*b30d1939SAndy Fiddaman  * n<0 means 0 terminated string
225*b30d1939SAndy Fiddaman  */
226*b30d1939SAndy Fiddaman 
227*b30d1939SAndy Fiddaman static void
copy(register Buffer_t * b,register char * s,int n)228*b30d1939SAndy Fiddaman copy(register Buffer_t* b, register char* s, int n)
229*b30d1939SAndy Fiddaman {
230*b30d1939SAndy Fiddaman 	if (n < 0)
231*b30d1939SAndy Fiddaman 		n = strlen(s);
232*b30d1939SAndy Fiddaman 	while (n--)
233*b30d1939SAndy Fiddaman 		PUT(b, *s++);
234*b30d1939SAndy Fiddaman }
235*b30d1939SAndy Fiddaman 
236*b30d1939SAndy Fiddaman /*
237*b30d1939SAndy Fiddaman  * center and copy comment line s to p
238*b30d1939SAndy Fiddaman  * if s==0 then
239*b30d1939SAndy Fiddaman  *	n>0	first frame line
240*b30d1939SAndy Fiddaman  *	n=0	blank line
241*b30d1939SAndy Fiddaman  *	n<0	last frame line
242*b30d1939SAndy Fiddaman  * if u>0 then s converted to upper case
243*b30d1939SAndy Fiddaman  * if u<0 then s is left justified
244*b30d1939SAndy Fiddaman  */
245*b30d1939SAndy Fiddaman 
246*b30d1939SAndy Fiddaman static void
comment(Notice_t * notice,register Buffer_t * b,register char * s,register int n,int u)247*b30d1939SAndy Fiddaman comment(Notice_t* notice, register Buffer_t* b, register char* s, register int n, int u)
248*b30d1939SAndy Fiddaman {
249*b30d1939SAndy Fiddaman 	register int	i;
250*b30d1939SAndy Fiddaman 	register int	m;
251*b30d1939SAndy Fiddaman 	register int	x;
252*b30d1939SAndy Fiddaman 	int		cc;
253*b30d1939SAndy Fiddaman 
254*b30d1939SAndy Fiddaman 	cc = notice->cc[1];
255*b30d1939SAndy Fiddaman 	if (!s)
256*b30d1939SAndy Fiddaman 	{
257*b30d1939SAndy Fiddaman 		if (n)
258*b30d1939SAndy Fiddaman 		{
259*b30d1939SAndy Fiddaman 			PUT(b, notice->cc[n > 0 ? 0 : 1]);
260*b30d1939SAndy Fiddaman 			for (i = 0; i < COMDATA; i++)
261*b30d1939SAndy Fiddaman 				PUT(b, cc);
262*b30d1939SAndy Fiddaman 			PUT(b, notice->cc[n > 0 ? 1 : 2]);
263*b30d1939SAndy Fiddaman 		}
264*b30d1939SAndy Fiddaman 		else
265*b30d1939SAndy Fiddaman 			s = "";
266*b30d1939SAndy Fiddaman 	}
267*b30d1939SAndy Fiddaman 	if (s)
268*b30d1939SAndy Fiddaman 	{
269*b30d1939SAndy Fiddaman 		if (n > COMDATA)
270*b30d1939SAndy Fiddaman 			n = COMDATA;
271*b30d1939SAndy Fiddaman 		PUT(b, cc);
272*b30d1939SAndy Fiddaman 		m = (u < 0) ? 1 : (COMDATA - n) / 2;
273*b30d1939SAndy Fiddaman 		if ((x = COMDATA - m - n) < 0)
274*b30d1939SAndy Fiddaman 			n--;
275*b30d1939SAndy Fiddaman 		while (m-- > 0)
276*b30d1939SAndy Fiddaman 			PUT(b, ' ');
277*b30d1939SAndy Fiddaman 		while (n-- > 0)
278*b30d1939SAndy Fiddaman 		{
279*b30d1939SAndy Fiddaman 			i = *s++;
280*b30d1939SAndy Fiddaman 			if (u > 0 && i >= 'a' && i <= 'z')
281*b30d1939SAndy Fiddaman 				i = i - 'a' + 'A';
282*b30d1939SAndy Fiddaman 			PUT(b, i);
283*b30d1939SAndy Fiddaman 		}
284*b30d1939SAndy Fiddaman 		while (x-- > 0)
285*b30d1939SAndy Fiddaman 			PUT(b, ' ');
286*b30d1939SAndy Fiddaman 		PUT(b, cc);
287*b30d1939SAndy Fiddaman 	}
288*b30d1939SAndy Fiddaman 	PUT(b, '\n');
289*b30d1939SAndy Fiddaman }
290*b30d1939SAndy Fiddaman 
291*b30d1939SAndy Fiddaman /*
292*b30d1939SAndy Fiddaman  * expand simple ${...}
293*b30d1939SAndy Fiddaman  */
294*b30d1939SAndy Fiddaman 
295*b30d1939SAndy Fiddaman static void
expand(Notice_t * notice,register Buffer_t * b,const Item_t * item)296*b30d1939SAndy Fiddaman expand(Notice_t* notice, register Buffer_t* b, const Item_t* item)
297*b30d1939SAndy Fiddaman {
298*b30d1939SAndy Fiddaman 	register char*	t;
299*b30d1939SAndy Fiddaman 	register char*	e;
300*b30d1939SAndy Fiddaman 	register int	q;
301*b30d1939SAndy Fiddaman 	register char*	x;
302*b30d1939SAndy Fiddaman 	register char*	z;
303*b30d1939SAndy Fiddaman 	register int	c;
304*b30d1939SAndy Fiddaman 	int		m;
305*b30d1939SAndy Fiddaman 	int		i;
306*b30d1939SAndy Fiddaman 	int		k;
307*b30d1939SAndy Fiddaman 
308*b30d1939SAndy Fiddaman 	if (t = item->data)
309*b30d1939SAndy Fiddaman 	{
310*b30d1939SAndy Fiddaman 		q = item->quote;
311*b30d1939SAndy Fiddaman 		e = t + item->size;
312*b30d1939SAndy Fiddaman 		i = 0;
313*b30d1939SAndy Fiddaman 		while (t < e)
314*b30d1939SAndy Fiddaman 		{
315*b30d1939SAndy Fiddaman 			if (*t == '$' && t < (e + 2) && *(t + 1) == '{')
316*b30d1939SAndy Fiddaman 			{
317*b30d1939SAndy Fiddaman 				k = m = 0;
318*b30d1939SAndy Fiddaman 				x = t += 2;
319*b30d1939SAndy Fiddaman 				while (t < e && (c = *t++) != '}')
320*b30d1939SAndy Fiddaman 					if (c == '.')
321*b30d1939SAndy Fiddaman 						x = t;
322*b30d1939SAndy Fiddaman 					else if (c == '-')
323*b30d1939SAndy Fiddaman 					{
324*b30d1939SAndy Fiddaman 						k = 1;
325*b30d1939SAndy Fiddaman 						break;
326*b30d1939SAndy Fiddaman 					}
327*b30d1939SAndy Fiddaman 					else if (c == '/')
328*b30d1939SAndy Fiddaman 					{
329*b30d1939SAndy Fiddaman 						m = 1;
330*b30d1939SAndy Fiddaman 						break;
331*b30d1939SAndy Fiddaman 					}
332*b30d1939SAndy Fiddaman 				if ((c = lookup(key, x, t - x - 1)) >= 0 && (x = notice->item[c].data))
333*b30d1939SAndy Fiddaman 				{
334*b30d1939SAndy Fiddaman 					z = x + notice->item[c].size;
335*b30d1939SAndy Fiddaman 					while (x < z)
336*b30d1939SAndy Fiddaman 					{
337*b30d1939SAndy Fiddaman 						c = *x++;
338*b30d1939SAndy Fiddaman 						if (!m || c >= '0' && c <= '9')
339*b30d1939SAndy Fiddaman 							PUT(b, c);
340*b30d1939SAndy Fiddaman 					}
341*b30d1939SAndy Fiddaman 				}
342*b30d1939SAndy Fiddaman 				else if (k)
343*b30d1939SAndy Fiddaman 				{
344*b30d1939SAndy Fiddaman 					k = 0;
345*b30d1939SAndy Fiddaman 					i++;
346*b30d1939SAndy Fiddaman 				}
347*b30d1939SAndy Fiddaman 				if (k || m)
348*b30d1939SAndy Fiddaman 				{
349*b30d1939SAndy Fiddaman 					k = 1;
350*b30d1939SAndy Fiddaman 					while (t < e)
351*b30d1939SAndy Fiddaman 						if ((c = *t++) == '{')
352*b30d1939SAndy Fiddaman 							k++;
353*b30d1939SAndy Fiddaman 						else if (c == '}' && !--k)
354*b30d1939SAndy Fiddaman 							break;
355*b30d1939SAndy Fiddaman 				}
356*b30d1939SAndy Fiddaman 			}
357*b30d1939SAndy Fiddaman 			else if (q > 0 && *t == '\\' && (*(t + 1) == q || *(t + 1) == '\\'))
358*b30d1939SAndy Fiddaman 				t++;
359*b30d1939SAndy Fiddaman 			else if (*t == '}' && i)
360*b30d1939SAndy Fiddaman 			{
361*b30d1939SAndy Fiddaman 				t++;
362*b30d1939SAndy Fiddaman 				i--;
363*b30d1939SAndy Fiddaman 			}
364*b30d1939SAndy Fiddaman 			else
365*b30d1939SAndy Fiddaman 				PUT(b, *t++);
366*b30d1939SAndy Fiddaman 		}
367*b30d1939SAndy Fiddaman 	}
368*b30d1939SAndy Fiddaman }
369*b30d1939SAndy Fiddaman 
370*b30d1939SAndy Fiddaman /*
371*b30d1939SAndy Fiddaman  * generate a copright notice
372*b30d1939SAndy Fiddaman  */
373*b30d1939SAndy Fiddaman 
374*b30d1939SAndy Fiddaman static void
copyright(Notice_t * notice,register Buffer_t * b)375*b30d1939SAndy Fiddaman copyright(Notice_t* notice, register Buffer_t* b)
376*b30d1939SAndy Fiddaman {
377*b30d1939SAndy Fiddaman 	register char*	x;
378*b30d1939SAndy Fiddaman 	register char*	t;
379*b30d1939SAndy Fiddaman 	time_t		clock;
380*b30d1939SAndy Fiddaman 
381*b30d1939SAndy Fiddaman 	copy(b, "Copyright (c) ", -1);
382*b30d1939SAndy Fiddaman 	if (notice->test)
383*b30d1939SAndy Fiddaman 	{
384*b30d1939SAndy Fiddaman 		clock = (time_t)1000212300;
385*b30d1939SAndy Fiddaman 		t = ctime(&clock) + 20;
386*b30d1939SAndy Fiddaman 	}
387*b30d1939SAndy Fiddaman 	else if (!(t = notice->item[SOURCE].data))
388*b30d1939SAndy Fiddaman 	{
389*b30d1939SAndy Fiddaman 		time(&clock);
390*b30d1939SAndy Fiddaman 		t = ctime(&clock) + 20;
391*b30d1939SAndy Fiddaman 	}
392*b30d1939SAndy Fiddaman 	if ((x = notice->item[START].data) && strncmp(t, x, 4) < 0)
393*b30d1939SAndy Fiddaman 		t = x;
394*b30d1939SAndy Fiddaman 	if ((x = notice->item[SINCE].data) && strncmp(x, t, 4) < 0)
395*b30d1939SAndy Fiddaman 	{
396*b30d1939SAndy Fiddaman 		expand(notice, b, &notice->item[SINCE]);
397*b30d1939SAndy Fiddaman 		PUT(b, '-');
398*b30d1939SAndy Fiddaman 	}
399*b30d1939SAndy Fiddaman 	copy(b, t, 4);
400*b30d1939SAndy Fiddaman 	if (notice->item[PARENT].data)
401*b30d1939SAndy Fiddaman 	{
402*b30d1939SAndy Fiddaman 		PUT(b, ' ');
403*b30d1939SAndy Fiddaman 		expand(notice, b, &notice->item[PARENT]);
404*b30d1939SAndy Fiddaman 	}
405*b30d1939SAndy Fiddaman 	if (notice->item[CORPORATION].data)
406*b30d1939SAndy Fiddaman 	{
407*b30d1939SAndy Fiddaman 		PUT(b, ' ');
408*b30d1939SAndy Fiddaman 		expand(notice, b, &notice->item[CORPORATION]);
409*b30d1939SAndy Fiddaman 		if (notice->item[INCORPORATION].data)
410*b30d1939SAndy Fiddaman 		{
411*b30d1939SAndy Fiddaman 			PUT(b, ' ');
412*b30d1939SAndy Fiddaman 			expand(notice, b, &notice->item[INCORPORATION]);
413*b30d1939SAndy Fiddaman 		}
414*b30d1939SAndy Fiddaman 	}
415*b30d1939SAndy Fiddaman 	else if (notice->item[COMPANY].data)
416*b30d1939SAndy Fiddaman 	{
417*b30d1939SAndy Fiddaman 		PUT(b, ' ');
418*b30d1939SAndy Fiddaman 		expand(notice, b, &notice->item[COMPANY]);
419*b30d1939SAndy Fiddaman 	}
420*b30d1939SAndy Fiddaman }
421*b30d1939SAndy Fiddaman 
422*b30d1939SAndy Fiddaman typedef struct Stack_s
423*b30d1939SAndy Fiddaman {
424*b30d1939SAndy Fiddaman 	char*	info;
425*b30d1939SAndy Fiddaman 	char*	file;
426*b30d1939SAndy Fiddaman 	int	line;
427*b30d1939SAndy Fiddaman 	int	size;
428*b30d1939SAndy Fiddaman } Stack_t;
429*b30d1939SAndy Fiddaman 
430*b30d1939SAndy Fiddaman static int
push(Stack_t * sp,char * file,char * parent,char * info,int size,Buffer_t * buf)431*b30d1939SAndy Fiddaman push(Stack_t* sp, char* file, char* parent, char* info, int size, Buffer_t* buf)
432*b30d1939SAndy Fiddaman {
433*b30d1939SAndy Fiddaman 	char*		s;
434*b30d1939SAndy Fiddaman 	char*		t;
435*b30d1939SAndy Fiddaman 	int		i;
436*b30d1939SAndy Fiddaman 	int		n;
437*b30d1939SAndy Fiddaman 	char		path[1024];
438*b30d1939SAndy Fiddaman 
439*b30d1939SAndy Fiddaman 	if (size <= 8)
440*b30d1939SAndy Fiddaman 	{
441*b30d1939SAndy Fiddaman 		copy(buf, file, -1);
442*b30d1939SAndy Fiddaman 		copy(buf, ": no space", -1);
443*b30d1939SAndy Fiddaman 		PUT(buf, 0);
444*b30d1939SAndy Fiddaman 		return -1;
445*b30d1939SAndy Fiddaman 	}
446*b30d1939SAndy Fiddaman 	if (*file != '/' && parent && (s = strrchr(parent, '/')))
447*b30d1939SAndy Fiddaman 	{
448*b30d1939SAndy Fiddaman 		n = s - parent + 1;
449*b30d1939SAndy Fiddaman 		if ((strlen(file) + n + 1) <= sizeof(path))
450*b30d1939SAndy Fiddaman 		{
451*b30d1939SAndy Fiddaman 			memcpy(path, parent, n);
452*b30d1939SAndy Fiddaman 			strcpy(path + n, file);
453*b30d1939SAndy Fiddaman 			file = path;
454*b30d1939SAndy Fiddaman 		}
455*b30d1939SAndy Fiddaman 	}
456*b30d1939SAndy Fiddaman 	if ((i = open(file, O_RDONLY|O_cloexec)) < 0)
457*b30d1939SAndy Fiddaman 	{
458*b30d1939SAndy Fiddaman 		/* this hack viewpath lookup works for default package setups */
459*b30d1939SAndy Fiddaman 		if (file == path)
460*b30d1939SAndy Fiddaman 			for (s = path; *s; s++)
461*b30d1939SAndy Fiddaman 				if (s[0] == '/' && s[1] == 'a' && s[2] == 'r' && s[3] == 'c' && s[4] == 'h' && s[5] == '/')
462*b30d1939SAndy Fiddaman 				{
463*b30d1939SAndy Fiddaman 					t = s;
464*b30d1939SAndy Fiddaman 					for (s += 6; *s && *s != '/'; s++);
465*b30d1939SAndy Fiddaman 					while (*t++ = *s++);
466*b30d1939SAndy Fiddaman 					i = open(file, O_RDONLY|O_cloexec);
467*b30d1939SAndy Fiddaman 				}
468*b30d1939SAndy Fiddaman 		if (i < 0)
469*b30d1939SAndy Fiddaman 		{
470*b30d1939SAndy Fiddaman 			copy(buf, file, -1);
471*b30d1939SAndy Fiddaman 			copy(buf, ": cannot open", -1);
472*b30d1939SAndy Fiddaman 			PUT(buf, 0);
473*b30d1939SAndy Fiddaman 			return -1;
474*b30d1939SAndy Fiddaman 		}
475*b30d1939SAndy Fiddaman 	}
476*b30d1939SAndy Fiddaman 	n = read(i, info, size - 1);
477*b30d1939SAndy Fiddaman 	close(i);
478*b30d1939SAndy Fiddaman 	if (n < 0)
479*b30d1939SAndy Fiddaman 	{
480*b30d1939SAndy Fiddaman 		copy(buf, file, -1);
481*b30d1939SAndy Fiddaman 		copy(buf, ": cannot read", -1);
482*b30d1939SAndy Fiddaman 		PUT(buf, 0);
483*b30d1939SAndy Fiddaman 		return -1;
484*b30d1939SAndy Fiddaman 	}
485*b30d1939SAndy Fiddaman 	info[n++] = 0;
486*b30d1939SAndy Fiddaman 	sp->file = file;
487*b30d1939SAndy Fiddaman 	sp->info = info;
488*b30d1939SAndy Fiddaman 	sp->line = 0;
489*b30d1939SAndy Fiddaman 	sp->size = n;
490*b30d1939SAndy Fiddaman 	return 0;
491*b30d1939SAndy Fiddaman }
492*b30d1939SAndy Fiddaman 
493*b30d1939SAndy Fiddaman /*
494*b30d1939SAndy Fiddaman  * read the license file and generate a comment in p, length size
495*b30d1939SAndy Fiddaman  * license length in p returned, -1 on error
496*b30d1939SAndy Fiddaman  * -1 return places 0 terminated error string in p
497*b30d1939SAndy Fiddaman  */
498*b30d1939SAndy Fiddaman 
499*b30d1939SAndy Fiddaman int
astlicense(char * p,int size,char * file,char * options,int cc1,int cc2,int cc3)500*b30d1939SAndy Fiddaman astlicense(char* p, int size, char* file, char* options, int cc1, int cc2, int cc3)
501*b30d1939SAndy Fiddaman {
502*b30d1939SAndy Fiddaman 	register char*	s;
503*b30d1939SAndy Fiddaman 	register char*	v;
504*b30d1939SAndy Fiddaman 	register char*	x;
505*b30d1939SAndy Fiddaman 	register int	c;
506*b30d1939SAndy Fiddaman 	int		i;
507*b30d1939SAndy Fiddaman 	int		h;
508*b30d1939SAndy Fiddaman 	int		k;
509*b30d1939SAndy Fiddaman 	int		n;
510*b30d1939SAndy Fiddaman 	int		q;
511*b30d1939SAndy Fiddaman 	int		contributor;
512*b30d1939SAndy Fiddaman 	int		first;
513*b30d1939SAndy Fiddaman 	int		level;
514*b30d1939SAndy Fiddaman 	int		quote;
515*b30d1939SAndy Fiddaman 	char*		data;
516*b30d1939SAndy Fiddaman 	char		tmpbuf[COMLINE];
517*b30d1939SAndy Fiddaman 	char		info[8 * 1024];
518*b30d1939SAndy Fiddaman 	Stack_t		input[4];
519*b30d1939SAndy Fiddaman 	Notice_t	notice;
520*b30d1939SAndy Fiddaman 	Item_t		item;
521*b30d1939SAndy Fiddaman 	Buffer_t	buf;
522*b30d1939SAndy Fiddaman 	Buffer_t	tmp;
523*b30d1939SAndy Fiddaman 
524*b30d1939SAndy Fiddaman 	buf.end = (buf.buf = buf.nxt = p) + size;
525*b30d1939SAndy Fiddaman 	tmp.end = (tmp.buf = tmp.nxt = tmpbuf) + sizeof(tmpbuf);
526*b30d1939SAndy Fiddaman 	level = 0;
527*b30d1939SAndy Fiddaman 	data = info;
528*b30d1939SAndy Fiddaman 	level = -1;
529*b30d1939SAndy Fiddaman 	if (options)
530*b30d1939SAndy Fiddaman 	{
531*b30d1939SAndy Fiddaman 		level++;
532*b30d1939SAndy Fiddaman 		input[level].file = "<options>";
533*b30d1939SAndy Fiddaman 		input[level].info = options;
534*b30d1939SAndy Fiddaman 		input[level].line = 0;
535*b30d1939SAndy Fiddaman 	}
536*b30d1939SAndy Fiddaman 	if (file && *file)
537*b30d1939SAndy Fiddaman 	{
538*b30d1939SAndy Fiddaman 		if (push(&input[++level], file, 0, data, &info[sizeof(info)] - data, &buf))
539*b30d1939SAndy Fiddaman 			return -1;
540*b30d1939SAndy Fiddaman 		data += input[level].size;
541*b30d1939SAndy Fiddaman 	}
542*b30d1939SAndy Fiddaman 	if (level < 0)
543*b30d1939SAndy Fiddaman 		return 0;
544*b30d1939SAndy Fiddaman 	s = input[level].info;
545*b30d1939SAndy Fiddaman 	notice.test = 0;
546*b30d1939SAndy Fiddaman 	notice.type = NONE;
547*b30d1939SAndy Fiddaman 	notice.verbose = 0;
548*b30d1939SAndy Fiddaman 	notice.ids = 0;
549*b30d1939SAndy Fiddaman 	notice.cc[0] = cc1;
550*b30d1939SAndy Fiddaman 	notice.cc[1] = cc2;
551*b30d1939SAndy Fiddaman 	notice.cc[2] = cc3;
552*b30d1939SAndy Fiddaman 	for (i = 0; i < ITEMS; i++)
553*b30d1939SAndy Fiddaman 		notice.item[i].data = 0;
554*b30d1939SAndy Fiddaman 	notice.item[STYLE] = notice.item[CLASS] = lic[notice.type];
555*b30d1939SAndy Fiddaman 	notice.item[STYLE].quote = notice.item[CLASS].quote = 0;
556*b30d1939SAndy Fiddaman 	contributor = i = k = 0;
557*b30d1939SAndy Fiddaman 	for (;;)
558*b30d1939SAndy Fiddaman 	{
559*b30d1939SAndy Fiddaman 		first = 1;
560*b30d1939SAndy Fiddaman 		while (c = *s)
561*b30d1939SAndy Fiddaman 		{
562*b30d1939SAndy Fiddaman 			while (c == ' ' || c == '\t' || c == '\n' && ++input[level].line || c == '\r' || c == ',' || c == ';' || c == ')')
563*b30d1939SAndy Fiddaman 				c = *++s;
564*b30d1939SAndy Fiddaman 			if (!c)
565*b30d1939SAndy Fiddaman 				break;
566*b30d1939SAndy Fiddaman 			if (c == '#')
567*b30d1939SAndy Fiddaman 			{
568*b30d1939SAndy Fiddaman 				while (*++s && *s != '\n');
569*b30d1939SAndy Fiddaman 				if (*s)
570*b30d1939SAndy Fiddaman 					s++;
571*b30d1939SAndy Fiddaman 				input[level].line++;
572*b30d1939SAndy Fiddaman 				continue;
573*b30d1939SAndy Fiddaman 			}
574*b30d1939SAndy Fiddaman 			if (c == '.')
575*b30d1939SAndy Fiddaman 			{
576*b30d1939SAndy Fiddaman 				while ((c = *++s) && (c == ' ' || c == '\t'));
577*b30d1939SAndy Fiddaman 				file = s;
578*b30d1939SAndy Fiddaman 				while (c && c != ' ' && c != '\t' && c != '\r' && c != '\n')
579*b30d1939SAndy Fiddaman 					c = *++s;
580*b30d1939SAndy Fiddaman 				*s = 0;
581*b30d1939SAndy Fiddaman 				while (c && c != '\n')
582*b30d1939SAndy Fiddaman 					c = *++s;
583*b30d1939SAndy Fiddaman 				if (*file)
584*b30d1939SAndy Fiddaman 				{
585*b30d1939SAndy Fiddaman 					input[level].info = s + (c != 0);
586*b30d1939SAndy Fiddaman 					if (++level >= (sizeof(input) / sizeof(input[0])) || push(&input[level], file, input[level-1].file, data, &info[sizeof(info)] - data, &buf))
587*b30d1939SAndy Fiddaman 						return -1;
588*b30d1939SAndy Fiddaman 					data += input[level].size;
589*b30d1939SAndy Fiddaman 					s = input[level].info;
590*b30d1939SAndy Fiddaman 				}
591*b30d1939SAndy Fiddaman 				continue;
592*b30d1939SAndy Fiddaman 			}
593*b30d1939SAndy Fiddaman 			if (c == '\n')
594*b30d1939SAndy Fiddaman 			{
595*b30d1939SAndy Fiddaman 				s++;
596*b30d1939SAndy Fiddaman 				input[level].line++;
597*b30d1939SAndy Fiddaman 				continue;
598*b30d1939SAndy Fiddaman 			}
599*b30d1939SAndy Fiddaman 			if (c == '[')
600*b30d1939SAndy Fiddaman 				c = *++s;
601*b30d1939SAndy Fiddaman 			x = s;
602*b30d1939SAndy Fiddaman 			n = 0;
603*b30d1939SAndy Fiddaman 			while (c && c != '+' && c != '=' && c != ']' && c != ')' && c != ',' && c != ' ' && c != '\t' && c != '\n' && c != '\r')
604*b30d1939SAndy Fiddaman 				c = *++s;
605*b30d1939SAndy Fiddaman 			n = s - x;
606*b30d1939SAndy Fiddaman 			h = lookup(key, x, n);
607*b30d1939SAndy Fiddaman 			if (c == '+' || c == ']')
608*b30d1939SAndy Fiddaman 				c = *++s;
609*b30d1939SAndy Fiddaman 			quote = 0;
610*b30d1939SAndy Fiddaman 			if (c == '=' || first)
611*b30d1939SAndy Fiddaman 			{
612*b30d1939SAndy Fiddaman 				if (c == '=')
613*b30d1939SAndy Fiddaman 				{
614*b30d1939SAndy Fiddaman 					q = ((c = *++s) == '"' || c == '\'') ? *s++ : 0;
615*b30d1939SAndy Fiddaman 					if (c == '(')
616*b30d1939SAndy Fiddaman 					{
617*b30d1939SAndy Fiddaman 						s++;
618*b30d1939SAndy Fiddaman 						if (h == LICENSE)
619*b30d1939SAndy Fiddaman 							contributor = 0;
620*b30d1939SAndy Fiddaman 						else if (h == CONTRIBUTOR)
621*b30d1939SAndy Fiddaman 							contributor = 1;
622*b30d1939SAndy Fiddaman 						else
623*b30d1939SAndy Fiddaman 						{
624*b30d1939SAndy Fiddaman 							q = 1;
625*b30d1939SAndy Fiddaman 							i = 0;
626*b30d1939SAndy Fiddaman 							for (;;)
627*b30d1939SAndy Fiddaman 							{
628*b30d1939SAndy Fiddaman 								switch (*s++)
629*b30d1939SAndy Fiddaman 								{
630*b30d1939SAndy Fiddaman 								case 0:
631*b30d1939SAndy Fiddaman 									s--;
632*b30d1939SAndy Fiddaman 									break;
633*b30d1939SAndy Fiddaman 								case '(':
634*b30d1939SAndy Fiddaman 									if (!i)
635*b30d1939SAndy Fiddaman 										q++;
636*b30d1939SAndy Fiddaman 									continue;
637*b30d1939SAndy Fiddaman 								case ')':
638*b30d1939SAndy Fiddaman 									if (!i && !--q)
639*b30d1939SAndy Fiddaman 										break;
640*b30d1939SAndy Fiddaman 									continue;
641*b30d1939SAndy Fiddaman 								case '"':
642*b30d1939SAndy Fiddaman 								case '\'':
643*b30d1939SAndy Fiddaman 									if (!i)
644*b30d1939SAndy Fiddaman 										i = *(s - 1);
645*b30d1939SAndy Fiddaman 									else if (i == *(s - 1))
646*b30d1939SAndy Fiddaman 										i = 0;
647*b30d1939SAndy Fiddaman 									continue;
648*b30d1939SAndy Fiddaman 								case '\\':
649*b30d1939SAndy Fiddaman 									if (*s == i && i == '"')
650*b30d1939SAndy Fiddaman 										i++;
651*b30d1939SAndy Fiddaman 									continue;
652*b30d1939SAndy Fiddaman 								case '\n':
653*b30d1939SAndy Fiddaman 									input[level].line++;
654*b30d1939SAndy Fiddaman 									continue;
655*b30d1939SAndy Fiddaman 								default:
656*b30d1939SAndy Fiddaman 									continue;
657*b30d1939SAndy Fiddaman 								}
658*b30d1939SAndy Fiddaman 								break;
659*b30d1939SAndy Fiddaman 							}
660*b30d1939SAndy Fiddaman 						}
661*b30d1939SAndy Fiddaman 						continue;
662*b30d1939SAndy Fiddaman 					}
663*b30d1939SAndy Fiddaman 					v = s;
664*b30d1939SAndy Fiddaman 					while ((c = *s) && (q == '"' && (c == '\\' && (*(s + 1) == '"' || *(s + 1) == '\\') && s++ && (quote = q)) || q && c != q || !q && c != ' ' && c != '\t' && c != '\n' && c != '\r' && c != ',' && c != ';'))
665*b30d1939SAndy Fiddaman 					{
666*b30d1939SAndy Fiddaman 						if (c == '\n')
667*b30d1939SAndy Fiddaman 							input[level].line++;
668*b30d1939SAndy Fiddaman 						s++;
669*b30d1939SAndy Fiddaman 					}
670*b30d1939SAndy Fiddaman 				}
671*b30d1939SAndy Fiddaman 				else
672*b30d1939SAndy Fiddaman 				{
673*b30d1939SAndy Fiddaman 					h = STYLE;
674*b30d1939SAndy Fiddaman 					v = x;
675*b30d1939SAndy Fiddaman 				}
676*b30d1939SAndy Fiddaman 				if (c == '\n')
677*b30d1939SAndy Fiddaman 					input[level].line++;
678*b30d1939SAndy Fiddaman 				if (contributor)
679*b30d1939SAndy Fiddaman 				{
680*b30d1939SAndy Fiddaman 					for (i = 0; i < notice.ids; i++)
681*b30d1939SAndy Fiddaman 						if (n == notice.id[i].name.size && !strncmp(x, notice.id[i].name.data, n))
682*b30d1939SAndy Fiddaman 							break;
683*b30d1939SAndy Fiddaman 					if (i < IDS)
684*b30d1939SAndy Fiddaman 					{
685*b30d1939SAndy Fiddaman 						notice.id[i].name.data = x;
686*b30d1939SAndy Fiddaman 						notice.id[i].name.size = n;
687*b30d1939SAndy Fiddaman 						notice.id[i].name.quote = 0;
688*b30d1939SAndy Fiddaman 						notice.id[i].value.data = v;
689*b30d1939SAndy Fiddaman 						notice.id[i].value.size = s - v;
690*b30d1939SAndy Fiddaman 						notice.id[i].value.quote = quote;
691*b30d1939SAndy Fiddaman 						if (notice.ids <= i)
692*b30d1939SAndy Fiddaman 							notice.ids = i + 1;
693*b30d1939SAndy Fiddaman 					}
694*b30d1939SAndy Fiddaman 				}
695*b30d1939SAndy Fiddaman 				else if (h == QUERY)
696*b30d1939SAndy Fiddaman 				{
697*b30d1939SAndy Fiddaman 					if ((s - v) == 3 && v[0] == 'a' && v[1] == 'l' && v[2] == 'l')
698*b30d1939SAndy Fiddaman 					{
699*b30d1939SAndy Fiddaman 						for (i = 0; i < ITEMS; i++)
700*b30d1939SAndy Fiddaman 							if (notice.item[i].size)
701*b30d1939SAndy Fiddaman 							{
702*b30d1939SAndy Fiddaman 								expand(&notice, &buf, &key[i]);
703*b30d1939SAndy Fiddaman 								PUT(&buf, '=');
704*b30d1939SAndy Fiddaman 								for (h = 0;; h++)
705*b30d1939SAndy Fiddaman 									if (h >= notice.item[i].size)
706*b30d1939SAndy Fiddaman 									{
707*b30d1939SAndy Fiddaman 										h = 0;
708*b30d1939SAndy Fiddaman 										break;
709*b30d1939SAndy Fiddaman 									}
710*b30d1939SAndy Fiddaman 									else if (notice.item[i].data[h] == ' ' || notice.item[i].data[h] == '\t')
711*b30d1939SAndy Fiddaman 										break;
712*b30d1939SAndy Fiddaman 								if (h)
713*b30d1939SAndy Fiddaman 									PUT(&buf, '\'');
714*b30d1939SAndy Fiddaman 								expand(&notice, &buf, &notice.item[i]);
715*b30d1939SAndy Fiddaman 								if (h)
716*b30d1939SAndy Fiddaman 									PUT(&buf, '\'');
717*b30d1939SAndy Fiddaman 								PUT(&buf, '\n');
718*b30d1939SAndy Fiddaman 							}
719*b30d1939SAndy Fiddaman 					}
720*b30d1939SAndy Fiddaman 					else
721*b30d1939SAndy Fiddaman 					{
722*b30d1939SAndy Fiddaman 						if ((h = lookup(key, v, s - v)) < 0)
723*b30d1939SAndy Fiddaman 						{
724*b30d1939SAndy Fiddaman 							item.data = v;
725*b30d1939SAndy Fiddaman 							item.size = s - v;
726*b30d1939SAndy Fiddaman 							item.quote = 0;
727*b30d1939SAndy Fiddaman 							expand(&notice, &buf, &item);
728*b30d1939SAndy Fiddaman 						}
729*b30d1939SAndy Fiddaman 						else
730*b30d1939SAndy Fiddaman 							expand(&notice, &buf, &notice.item[h]);
731*b30d1939SAndy Fiddaman 						PUT(&buf, '\n');
732*b30d1939SAndy Fiddaman 					}
733*b30d1939SAndy Fiddaman 					return END(&buf);
734*b30d1939SAndy Fiddaman 				}
735*b30d1939SAndy Fiddaman 				else
736*b30d1939SAndy Fiddaman 				{
737*b30d1939SAndy Fiddaman 					if (h == STYLE)
738*b30d1939SAndy Fiddaman 						switch (c = lookup(lic, v, s - v))
739*b30d1939SAndy Fiddaman 						{
740*b30d1939SAndy Fiddaman 						case NONE:
741*b30d1939SAndy Fiddaman 							return 0;
742*b30d1939SAndy Fiddaman 						case TEST:
743*b30d1939SAndy Fiddaman 							notice.test = 1;
744*b30d1939SAndy Fiddaman 							h = -1;
745*b30d1939SAndy Fiddaman 							break;
746*b30d1939SAndy Fiddaman 						case VERBOSE:
747*b30d1939SAndy Fiddaman 							notice.verbose = 1;
748*b30d1939SAndy Fiddaman 							h = -1;
749*b30d1939SAndy Fiddaman 							break;
750*b30d1939SAndy Fiddaman 						case USAGE:
751*b30d1939SAndy Fiddaman 							notice.type = c;
752*b30d1939SAndy Fiddaman 							h = -1;
753*b30d1939SAndy Fiddaman 							break;
754*b30d1939SAndy Fiddaman 						case -1:
755*b30d1939SAndy Fiddaman 							c = SPECIAL;
756*b30d1939SAndy Fiddaman 							/*FALLTHROUGH*/
757*b30d1939SAndy Fiddaman 						default:
758*b30d1939SAndy Fiddaman 							notice.type = c;
759*b30d1939SAndy Fiddaman 							notice.item[CLASS].data = lic[lic[c].quote].data;
760*b30d1939SAndy Fiddaman 							notice.item[CLASS].size = lic[lic[c].quote].size;
761*b30d1939SAndy Fiddaman 							if (notice.item[STYLE].data != lic[NONE].data)
762*b30d1939SAndy Fiddaman 								h = -1;
763*b30d1939SAndy Fiddaman 							break;
764*b30d1939SAndy Fiddaman 						}
765*b30d1939SAndy Fiddaman 					if (h >= 0)
766*b30d1939SAndy Fiddaman 					{
767*b30d1939SAndy Fiddaman 						notice.item[h].data = (notice.item[h].size = s - v) ? v : (char*)0;
768*b30d1939SAndy Fiddaman 						notice.item[h].quote = quote;
769*b30d1939SAndy Fiddaman 						k = 1;
770*b30d1939SAndy Fiddaman 					}
771*b30d1939SAndy Fiddaman 				}
772*b30d1939SAndy Fiddaman 			}
773*b30d1939SAndy Fiddaman 			else
774*b30d1939SAndy Fiddaman 			{
775*b30d1939SAndy Fiddaman 				if (input[level].file)
776*b30d1939SAndy Fiddaman 				{
777*b30d1939SAndy Fiddaman 					copy(&buf, "\"", -1);
778*b30d1939SAndy Fiddaman 					copy(&buf, input[level].file, -1);
779*b30d1939SAndy Fiddaman 					copy(&buf, "\", line ", -1);
780*b30d1939SAndy Fiddaman 					x = &tmpbuf[sizeof(tmpbuf)];
781*b30d1939SAndy Fiddaman 					*--x = 0;
782*b30d1939SAndy Fiddaman 					n = ++input[level].line;
783*b30d1939SAndy Fiddaman 					do *--x = ("0123456789")[n % 10]; while (n /= 10);
784*b30d1939SAndy Fiddaman 					copy(&buf, x, -1);
785*b30d1939SAndy Fiddaman 					copy(&buf, ": ", -1);
786*b30d1939SAndy Fiddaman 				}
787*b30d1939SAndy Fiddaman 				copy(&buf, "option error: assignment expected", -1);
788*b30d1939SAndy Fiddaman 				PUT(&buf, 0);
789*b30d1939SAndy Fiddaman 				return -1;
790*b30d1939SAndy Fiddaman 			}
791*b30d1939SAndy Fiddaman 			if (*s)
792*b30d1939SAndy Fiddaman 				s++;
793*b30d1939SAndy Fiddaman 			first = 0;
794*b30d1939SAndy Fiddaman 		}
795*b30d1939SAndy Fiddaman 		if (!level--)
796*b30d1939SAndy Fiddaman 			break;
797*b30d1939SAndy Fiddaman 		s = input[level].info;
798*b30d1939SAndy Fiddaman 	}
799*b30d1939SAndy Fiddaman 	if (!k)
800*b30d1939SAndy Fiddaman 		return 0;
801*b30d1939SAndy Fiddaman 	if (notice.type == INLINE && (!notice.verbose || !notice.item[NOTICE].data))
802*b30d1939SAndy Fiddaman 		return 0;
803*b30d1939SAndy Fiddaman 	if (notice.type != USAGE)
804*b30d1939SAndy Fiddaman 	{
805*b30d1939SAndy Fiddaman 		if (!notice.type)
806*b30d1939SAndy Fiddaman 			notice.type = SPECIAL;
807*b30d1939SAndy Fiddaman 		comment(&notice, &buf, NiL, 1, 0);
808*b30d1939SAndy Fiddaman 		comment(&notice, &buf, NiL, 0, 0);
809*b30d1939SAndy Fiddaman 		if (notice.item[PACKAGE].data)
810*b30d1939SAndy Fiddaman 		{
811*b30d1939SAndy Fiddaman 			copy(&tmp, "This software is part of the ", -1);
812*b30d1939SAndy Fiddaman 			expand(&notice, &tmp, &notice.item[PACKAGE]);
813*b30d1939SAndy Fiddaman 			copy(&tmp, " package", -1);
814*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
815*b30d1939SAndy Fiddaman 		}
816*b30d1939SAndy Fiddaman 		if (notice.type >= OPEN)
817*b30d1939SAndy Fiddaman 		{
818*b30d1939SAndy Fiddaman 			copyright(&notice, &tmp);
819*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
820*b30d1939SAndy Fiddaman 			if (notice.type >= SPECIAL)
821*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "All Rights Reserved", 0);
822*b30d1939SAndy Fiddaman 		}
823*b30d1939SAndy Fiddaman 		if (notice.type == CPL || notice.type == EPL)
824*b30d1939SAndy Fiddaman 		{
825*b30d1939SAndy Fiddaman 			copy(&tmp, notice.item[PACKAGE].data ? "and" : "This software", -1);
826*b30d1939SAndy Fiddaman 			copy(&tmp, " is licensed under the", -1);
827*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
828*b30d1939SAndy Fiddaman 			if (notice.type == EPL)
829*b30d1939SAndy Fiddaman 				copy(&tmp, "Eclipse Public License", -1);
830*b30d1939SAndy Fiddaman 			else
831*b30d1939SAndy Fiddaman 				copy(&tmp, "Common Public License", -1);
832*b30d1939SAndy Fiddaman 			if (notice.item[VERSION].data)
833*b30d1939SAndy Fiddaman 			{
834*b30d1939SAndy Fiddaman 				copy(&tmp, ", Version ", -1);
835*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[VERSION]);
836*b30d1939SAndy Fiddaman 			}
837*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
838*b30d1939SAndy Fiddaman 			if (notice.item[CORPORATION].data || notice.item[COMPANY].data)
839*b30d1939SAndy Fiddaman 			{
840*b30d1939SAndy Fiddaman 				copy(&tmp, "by ", -1);
841*b30d1939SAndy Fiddaman 				if (notice.item[PARENT].data)
842*b30d1939SAndy Fiddaman 				{
843*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[PARENT]);
844*b30d1939SAndy Fiddaman 					copy(&tmp, " ", -1);
845*b30d1939SAndy Fiddaman 				}
846*b30d1939SAndy Fiddaman 				if (notice.item[CORPORATION].data)
847*b30d1939SAndy Fiddaman 				{
848*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[CORPORATION]);
849*b30d1939SAndy Fiddaman 					if (notice.item[INCORPORATION].data)
850*b30d1939SAndy Fiddaman 					{
851*b30d1939SAndy Fiddaman 						copy(&tmp, " ", -1);
852*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[INCORPORATION]);
853*b30d1939SAndy Fiddaman 					}
854*b30d1939SAndy Fiddaman 				}
855*b30d1939SAndy Fiddaman 				else if (notice.item[COMPANY].data)
856*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[COMPANY]);
857*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
858*b30d1939SAndy Fiddaman 			}
859*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
860*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "A copy of the License is available at", 0);
861*b30d1939SAndy Fiddaman 			if (notice.item[URL].data)
862*b30d1939SAndy Fiddaman 			{
863*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[URL]);
864*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
865*b30d1939SAndy Fiddaman 				if (notice.item[URLMD5].data)
866*b30d1939SAndy Fiddaman 				{
867*b30d1939SAndy Fiddaman 					copy(&tmp, "(with md5 checksum ", -1);
868*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[URLMD5]);
869*b30d1939SAndy Fiddaman 					copy(&tmp, ")", -1);
870*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
871*b30d1939SAndy Fiddaman 				}
872*b30d1939SAndy Fiddaman 			}
873*b30d1939SAndy Fiddaman 			else if (notice.type == EPL)
874*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "http://www.eclipse.org/org/documents/epl-v10.html", 0);
875*b30d1939SAndy Fiddaman 			else
876*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "http://www.opensource.org/licenses/cpl", 0);
877*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
878*b30d1939SAndy Fiddaman 		}
879*b30d1939SAndy Fiddaman 		else if (notice.type == OPEN)
880*b30d1939SAndy Fiddaman 		{
881*b30d1939SAndy Fiddaman 			copy(&tmp, notice.item[PACKAGE].data ? "and it" : "This software", -1);
882*b30d1939SAndy Fiddaman 			copy(&tmp, " may only be used by you under license from", -1);
883*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
884*b30d1939SAndy Fiddaman 			if (notice.item[i = CORPORATION].data)
885*b30d1939SAndy Fiddaman 			{
886*b30d1939SAndy Fiddaman 				if (notice.item[PARENT].data)
887*b30d1939SAndy Fiddaman 				{
888*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[i = PARENT]);
889*b30d1939SAndy Fiddaman 					copy(&tmp, " ", -1);
890*b30d1939SAndy Fiddaman 				}
891*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[CORPORATION]);
892*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
893*b30d1939SAndy Fiddaman 			}
894*b30d1939SAndy Fiddaman 			else if (notice.item[i = COMPANY].data)
895*b30d1939SAndy Fiddaman 			{
896*b30d1939SAndy Fiddaman 				if (notice.item[PARENT].data)
897*b30d1939SAndy Fiddaman 				{
898*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[i = PARENT]);
899*b30d1939SAndy Fiddaman 					copy(&tmp, " ", -1);
900*b30d1939SAndy Fiddaman 				}
901*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[COMPANY]);
902*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
903*b30d1939SAndy Fiddaman 			}
904*b30d1939SAndy Fiddaman 			else
905*b30d1939SAndy Fiddaman 				i = -1;
906*b30d1939SAndy Fiddaman 			if (notice.item[URL].data)
907*b30d1939SAndy Fiddaman 			{
908*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "A copy of the Source Code Agreement is available", 0);
909*b30d1939SAndy Fiddaman 				copy(&tmp, "at the ", -1);
910*b30d1939SAndy Fiddaman 				if (i >= 0)
911*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[i]);
912*b30d1939SAndy Fiddaman 				copy(&tmp, " Internet web site URL", -1);
913*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
914*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
915*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[URL]);
916*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
917*b30d1939SAndy Fiddaman 				if (notice.item[URLMD5].data)
918*b30d1939SAndy Fiddaman 				{
919*b30d1939SAndy Fiddaman 					copy(&tmp, "(with an md5 checksum of ", -1);
920*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[URLMD5]);
921*b30d1939SAndy Fiddaman 					copy(&tmp, ")", -1);
922*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
923*b30d1939SAndy Fiddaman 				}
924*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
925*b30d1939SAndy Fiddaman 			}
926*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "If you have copied or used this software without agreeing", 0);
927*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "to the terms of the license you are infringing on", 0);
928*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "the license and copyright and are violating", 0);
929*b30d1939SAndy Fiddaman 			if (i >= 0)
930*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[i]);
931*b30d1939SAndy Fiddaman 			copy(&tmp, "'s", -1);
932*b30d1939SAndy Fiddaman 			if (n >= COMLONG)
933*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
934*b30d1939SAndy Fiddaman 			else
935*b30d1939SAndy Fiddaman 				PUT(&tmp, ' ');
936*b30d1939SAndy Fiddaman 			copy(&tmp, "intellectual property rights.", -1);
937*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
938*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
939*b30d1939SAndy Fiddaman 		}
940*b30d1939SAndy Fiddaman 		else if (notice.type == GPL)
941*b30d1939SAndy Fiddaman 		{
942*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
943*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "This is free software; you can redistribute it and/or", 0);
944*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "modify it under the terms of the GNU General Public License", 0);
945*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "as published by the Free Software Foundation;", 0);
946*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "either version 2, or (at your option) any later version.", 0);
947*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
948*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "This software is distributed in the hope that it", 0);
949*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "will be useful, but WITHOUT ANY WARRANTY;", 0);
950*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "without even the implied warranty of MERCHANTABILITY", 0);
951*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "or FITNESS FOR A PARTICULAR PURPOSE.", 0);
952*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "See the GNU General Public License for more details.", 0);
953*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
954*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "You should have received a copy of the", 0);
955*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "GNU General Public License", 0);
956*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "along with this software (see the file COPYING.)", 0);
957*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "If not, a copy is available at", 0);
958*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "http://www.gnu.org/copyleft/gpl.html", 0);
959*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
960*b30d1939SAndy Fiddaman 		}
961*b30d1939SAndy Fiddaman 		else if (notice.type == BSD)
962*b30d1939SAndy Fiddaman 		{
963*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
964*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "Redistribution and use in source and binary forms, with or", -1);
965*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "without modification, are permitted provided that the following", -1);
966*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "conditions are met:", -1);
967*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
968*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "   1. Redistributions of source code must retain the above", -1);
969*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      copyright notice, this list of conditions and the", -1);
970*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      following disclaimer.", -1);
971*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
972*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "   2. Redistributions in binary form must reproduce the above", -1);
973*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      copyright notice, this list of conditions and the", -1);
974*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      following disclaimer in the documentation and/or other", -1);
975*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      materials provided with the distribution.", -1);
976*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
977*b30d1939SAndy Fiddaman 			copy(&tmp, "   3. Neither the name of ", -1);
978*b30d1939SAndy Fiddaman 			if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data || notice.item[i = COMPANY].data)
979*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[i]);
980*b30d1939SAndy Fiddaman 			else
981*b30d1939SAndy Fiddaman 				copy(&tmp, "the copyright holder", -1);
982*b30d1939SAndy Fiddaman 			copy(&tmp, " nor the", -1);
983*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), -1);
984*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      names of its contributors may be used to endorse or", -1);
985*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      promote products derived from this software without", -1);
986*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "      specific prior written permission.", -1);
987*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
988*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND", -1);
989*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,", -1);
990*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF", -1);
991*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE", -1);
992*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS", -1);
993*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", -1);
994*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED", -1);
995*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,", -1);
996*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON", -1);
997*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,", -1);
998*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY", -1);
999*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE", -1);
1000*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "POSSIBILITY OF SUCH DAMAGE.", -1);
1001*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1002*b30d1939SAndy Fiddaman 		}
1003*b30d1939SAndy Fiddaman 		else if (notice.type == ZLIB)
1004*b30d1939SAndy Fiddaman 		{
1005*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1006*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "This software is provided 'as-is', without any express or implied", -1);
1007*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "warranty. In no event will the authors be held liable for any", -1);
1008*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "damages arising from the use of this software.", -1);
1009*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1010*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "Permission is granted to anyone to use this software for any", -1);
1011*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "purpose, including commercial applications, and to alter it and", -1);
1012*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "redistribute it freely, subject to the following restrictions:", -1);
1013*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1014*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, " 1. The origin of this software must not be misrepresented;", -1);
1015*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    you must not claim that you wrote the original software. If", -1);
1016*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    you use this software in a product, an acknowledgment in the", -1);
1017*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    product documentation would be appreciated but is not", -1);
1018*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    required.", -1);
1019*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1020*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, " 2. Altered source versions must be plainly marked as such,", -1);
1021*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    and must not be misrepresented as being the original", -1);
1022*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    software.", -1);
1023*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1024*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, " 3. This notice may not be removed or altered from any source", -1);
1025*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "    distribution.", -1);
1026*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1027*b30d1939SAndy Fiddaman 		}
1028*b30d1939SAndy Fiddaman 		else if (notice.type == MIT)
1029*b30d1939SAndy Fiddaman 		{
1030*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1031*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "Permission is hereby granted, free of charge, to any person", 0);
1032*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "obtaining a copy of this software and associated", 0);
1033*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "documentation files (the \"Software\"), to deal in the", 0);
1034*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "Software without restriction, including without limitation", 0);
1035*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "the rights to use, copy, modify, merge, publish, distribute,", 0);
1036*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "sublicense, and/or sell copies of the Software, and to", 0);
1037*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "permit persons to whom the Software is furnished to do so,", 0);
1038*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "subject to the following conditions:", 0);
1039*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1040*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "The above copyright notice and this permission notice shall", 0);
1041*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "be included in all copies or substantial portions of the", 0);
1042*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "Software.", 0);
1043*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1044*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY", 0);
1045*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE", 0);
1046*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR", 0);
1047*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS", 0);
1048*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR", 0);
1049*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR", 0);
1050*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE", 0);
1051*b30d1939SAndy Fiddaman 			COMMENT(&notice, &buf, "SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", 0);
1052*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1053*b30d1939SAndy Fiddaman 		}
1054*b30d1939SAndy Fiddaman 		else
1055*b30d1939SAndy Fiddaman 		{
1056*b30d1939SAndy Fiddaman 			if (notice.type == PROPRIETARY)
1057*b30d1939SAndy Fiddaman 			{
1058*b30d1939SAndy Fiddaman 				if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data || notice.item[i = COMPANY].data)
1059*b30d1939SAndy Fiddaman 				{
1060*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[i]);
1061*b30d1939SAndy Fiddaman 					copy(&tmp, " - ", -1);
1062*b30d1939SAndy Fiddaman 				}
1063*b30d1939SAndy Fiddaman 				else
1064*b30d1939SAndy Fiddaman 					i = -1;
1065*b30d1939SAndy Fiddaman 				copy(&tmp, "Proprietary", -1);
1066*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1067*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1068*b30d1939SAndy Fiddaman 				if (notice.item[URL].data)
1069*b30d1939SAndy Fiddaman 				{
1070*b30d1939SAndy Fiddaman 					copy(&tmp, "This is proprietary source code", -1);
1071*b30d1939SAndy Fiddaman 					if (i >= 0)
1072*b30d1939SAndy Fiddaman 						copy(&tmp, " licensed by", -1);
1073*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1074*b30d1939SAndy Fiddaman 					if (notice.item[PARENT].data)
1075*b30d1939SAndy Fiddaman 					{
1076*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[PARENT]);
1077*b30d1939SAndy Fiddaman 						copy(&tmp, " ", -1);
1078*b30d1939SAndy Fiddaman 					}
1079*b30d1939SAndy Fiddaman 					if (notice.item[CORPORATION].data)
1080*b30d1939SAndy Fiddaman 					{
1081*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[CORPORATION]);
1082*b30d1939SAndy Fiddaman 						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1083*b30d1939SAndy Fiddaman 					}
1084*b30d1939SAndy Fiddaman 					else if (notice.item[COMPANY].data)
1085*b30d1939SAndy Fiddaman 					{
1086*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[COMPANY]);
1087*b30d1939SAndy Fiddaman 						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1088*b30d1939SAndy Fiddaman 					}
1089*b30d1939SAndy Fiddaman 				}
1090*b30d1939SAndy Fiddaman 				else
1091*b30d1939SAndy Fiddaman 				{
1092*b30d1939SAndy Fiddaman 					copy(&tmp, "This is unpublished proprietary source code", -1);
1093*b30d1939SAndy Fiddaman 					if (i >= 0)
1094*b30d1939SAndy Fiddaman 						copy(&tmp, " of", -1);
1095*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1096*b30d1939SAndy Fiddaman 					if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
1097*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[i]);
1098*b30d1939SAndy Fiddaman 					if (notice.item[COMPANY].data)
1099*b30d1939SAndy Fiddaman 					{
1100*b30d1939SAndy Fiddaman 						if (SIZ(&tmp))
1101*b30d1939SAndy Fiddaman 							PUT(&tmp, ' ');
1102*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[COMPANY]);
1103*b30d1939SAndy Fiddaman 					}
1104*b30d1939SAndy Fiddaman 					if (SIZ(&tmp))
1105*b30d1939SAndy Fiddaman 						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
1106*b30d1939SAndy Fiddaman 					COMMENT(&notice, &buf, "and is not to be disclosed or used except in", 1);
1107*b30d1939SAndy Fiddaman 					COMMENT(&notice, &buf, "accordance with applicable agreements", 1);
1108*b30d1939SAndy Fiddaman 				}
1109*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1110*b30d1939SAndy Fiddaman 			}
1111*b30d1939SAndy Fiddaman 			else if (notice.type == NONEXCLUSIVE)
1112*b30d1939SAndy Fiddaman 			{
1113*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "For nonexclusive individual use", 1);
1114*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1115*b30d1939SAndy Fiddaman 			}
1116*b30d1939SAndy Fiddaman 			else if (notice.type == NONCOMMERCIAL)
1117*b30d1939SAndy Fiddaman 			{
1118*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "For noncommercial use", 1);
1119*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1120*b30d1939SAndy Fiddaman 			}
1121*b30d1939SAndy Fiddaman 			if (notice.type >= PROPRIETARY && !notice.item[URL].data)
1122*b30d1939SAndy Fiddaman 			{
1123*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "Unpublished & Not for Publication", 0);
1124*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1125*b30d1939SAndy Fiddaman 			}
1126*b30d1939SAndy Fiddaman 			if (notice.item[URL].data)
1127*b30d1939SAndy Fiddaman 			{
1128*b30d1939SAndy Fiddaman 				copy(&tmp, "This software is licensed", -1);
1129*b30d1939SAndy Fiddaman 				if (notice.item[CORPORATION].data || notice.item[COMPANY].data)
1130*b30d1939SAndy Fiddaman 				{
1131*b30d1939SAndy Fiddaman 					copy(&tmp, " by", -1);
1132*b30d1939SAndy Fiddaman 					if ((notice.item[PARENT].size + (notice.item[CORPORATION].data ? (notice.item[CORPORATION].size + notice.item[INCORPORATION].size) : notice.item[COMPANY].size)) >= (COMLONG - 6))
1133*b30d1939SAndy Fiddaman 						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1134*b30d1939SAndy Fiddaman 					else
1135*b30d1939SAndy Fiddaman 						PUT(&tmp, ' ');
1136*b30d1939SAndy Fiddaman 					if (notice.item[PARENT].data)
1137*b30d1939SAndy Fiddaman 					{
1138*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[PARENT]);
1139*b30d1939SAndy Fiddaman 						copy(&tmp, " ", -1);
1140*b30d1939SAndy Fiddaman 					}
1141*b30d1939SAndy Fiddaman 					if (notice.item[CORPORATION].data)
1142*b30d1939SAndy Fiddaman 					{
1143*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[CORPORATION]);
1144*b30d1939SAndy Fiddaman 						if (notice.item[INCORPORATION].data)
1145*b30d1939SAndy Fiddaman 						{
1146*b30d1939SAndy Fiddaman 							copy(&tmp, " ", -1);
1147*b30d1939SAndy Fiddaman 							expand(&notice, &tmp, &notice.item[INCORPORATION]);
1148*b30d1939SAndy Fiddaman 						}
1149*b30d1939SAndy Fiddaman 					}
1150*b30d1939SAndy Fiddaman 					else if (notice.item[COMPANY].data)
1151*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.item[COMPANY]);
1152*b30d1939SAndy Fiddaman 				}
1153*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1154*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "under the terms and conditions of the license in", 0);
1155*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[URL]);
1156*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1157*b30d1939SAndy Fiddaman 				if (notice.item[URLMD5].data)
1158*b30d1939SAndy Fiddaman 				{
1159*b30d1939SAndy Fiddaman 					copy(&tmp, "(with an md5 checksum of ", -1);
1160*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &notice.item[URLMD5]);
1161*b30d1939SAndy Fiddaman 					copy(&tmp, ")", -1);
1162*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1163*b30d1939SAndy Fiddaman 				}
1164*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1165*b30d1939SAndy Fiddaman 			}
1166*b30d1939SAndy Fiddaman 			else if (notice.type == PROPRIETARY)
1167*b30d1939SAndy Fiddaman 			{
1168*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "The copyright notice above does not evidence any", 0);
1169*b30d1939SAndy Fiddaman 				COMMENT(&notice, &buf, "actual or intended publication of such source code", 0);
1170*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1171*b30d1939SAndy Fiddaman 			}
1172*b30d1939SAndy Fiddaman 		}
1173*b30d1939SAndy Fiddaman 		if (v = notice.item[NOTICE].data)
1174*b30d1939SAndy Fiddaman 		{
1175*b30d1939SAndy Fiddaman 			x = v + notice.item[NOTICE].size;
1176*b30d1939SAndy Fiddaman 			if (*v == '\n')
1177*b30d1939SAndy Fiddaman 				v++;
1178*b30d1939SAndy Fiddaman 			item.quote = notice.item[NOTICE].quote;
1179*b30d1939SAndy Fiddaman 			do
1180*b30d1939SAndy Fiddaman 			{
1181*b30d1939SAndy Fiddaman 				for (item.data = v; v < x && *v != '\n'; v++);
1182*b30d1939SAndy Fiddaman 				if ((item.size = v - item.data) && *item.data == '\t')
1183*b30d1939SAndy Fiddaman 				{
1184*b30d1939SAndy Fiddaman 					item.data++;
1185*b30d1939SAndy Fiddaman 					item.size--;
1186*b30d1939SAndy Fiddaman 					h = 0;
1187*b30d1939SAndy Fiddaman 				}
1188*b30d1939SAndy Fiddaman 				else
1189*b30d1939SAndy Fiddaman 					h = -1;
1190*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &item);
1191*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), h);
1192*b30d1939SAndy Fiddaman 			} while (v++ < x);
1193*b30d1939SAndy Fiddaman 			if (item.size)
1194*b30d1939SAndy Fiddaman 				comment(&notice, &buf, NiL, 0, 0);
1195*b30d1939SAndy Fiddaman 		}
1196*b30d1939SAndy Fiddaman 		if (notice.item[ORGANIZATION].data)
1197*b30d1939SAndy Fiddaman 		{
1198*b30d1939SAndy Fiddaman 			expand(&notice, &tmp, &notice.item[ORGANIZATION]);
1199*b30d1939SAndy Fiddaman 			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1200*b30d1939SAndy Fiddaman 			if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
1201*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[i]);
1202*b30d1939SAndy Fiddaman 			if (notice.item[COMPANY].data)
1203*b30d1939SAndy Fiddaman 			{
1204*b30d1939SAndy Fiddaman 				if (SIZ(&tmp))
1205*b30d1939SAndy Fiddaman 					PUT(&tmp, ' ');
1206*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[COMPANY]);
1207*b30d1939SAndy Fiddaman 			}
1208*b30d1939SAndy Fiddaman 			if (SIZ(&tmp))
1209*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1210*b30d1939SAndy Fiddaman 			if (notice.item[LOCATION].data)
1211*b30d1939SAndy Fiddaman 			{
1212*b30d1939SAndy Fiddaman 				expand(&notice, &tmp, &notice.item[LOCATION]);
1213*b30d1939SAndy Fiddaman 				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1214*b30d1939SAndy Fiddaman 			}
1215*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1216*b30d1939SAndy Fiddaman 		}
1217*b30d1939SAndy Fiddaman 	}
1218*b30d1939SAndy Fiddaman 	if (v = notice.item[AUTHOR].data)
1219*b30d1939SAndy Fiddaman 	{
1220*b30d1939SAndy Fiddaman 		x = v + notice.item[AUTHOR].size;
1221*b30d1939SAndy Fiddaman 		q = (x - v) == 1 && (*v == '*' || *v == '-');
1222*b30d1939SAndy Fiddaman 		k = q && notice.type != USAGE ? -1 : 0;
1223*b30d1939SAndy Fiddaman 		for (;;)
1224*b30d1939SAndy Fiddaman 		{
1225*b30d1939SAndy Fiddaman 			if (!q)
1226*b30d1939SAndy Fiddaman 			{
1227*b30d1939SAndy Fiddaman 				while (v < x && (*v == ' ' || *v == '\t' || *v == '\r' || *v == '\n' || *v == ',' || *v == '+'))
1228*b30d1939SAndy Fiddaman 					v++;
1229*b30d1939SAndy Fiddaman 				if (v >= x)
1230*b30d1939SAndy Fiddaman 					break;
1231*b30d1939SAndy Fiddaman 				item.data = v;
1232*b30d1939SAndy Fiddaman 				while (v < x && *v != ',' && *v != '+' && *v++ != '>');
1233*b30d1939SAndy Fiddaman 				item.size = v - item.data;
1234*b30d1939SAndy Fiddaman 				item.quote = notice.item[AUTHOR].quote;
1235*b30d1939SAndy Fiddaman 			}
1236*b30d1939SAndy Fiddaman 			h = 0;
1237*b30d1939SAndy Fiddaman 			for (i = 0; i < notice.ids; i++)
1238*b30d1939SAndy Fiddaman 				if (q || item.size == notice.id[i].name.size && !strncmp(item.data, notice.id[i].name.data, item.size))
1239*b30d1939SAndy Fiddaman 				{
1240*b30d1939SAndy Fiddaman 					h = 1;
1241*b30d1939SAndy Fiddaman 					if (notice.type == USAGE)
1242*b30d1939SAndy Fiddaman 					{
1243*b30d1939SAndy Fiddaman 						copy(&buf, "[-author?", -1);
1244*b30d1939SAndy Fiddaman 						expand(&notice, &buf, &notice.id[i].value);
1245*b30d1939SAndy Fiddaman 						PUT(&buf, ']');
1246*b30d1939SAndy Fiddaman 					}
1247*b30d1939SAndy Fiddaman 					else
1248*b30d1939SAndy Fiddaman 					{
1249*b30d1939SAndy Fiddaman 						if (k < 0)
1250*b30d1939SAndy Fiddaman 						{
1251*b30d1939SAndy Fiddaman 							COMMENT(&notice, &buf, "CONTRIBUTORS", 0);
1252*b30d1939SAndy Fiddaman 							comment(&notice, &buf, NiL, 0, 0);
1253*b30d1939SAndy Fiddaman 						}
1254*b30d1939SAndy Fiddaman 						k = 1;
1255*b30d1939SAndy Fiddaman 						expand(&notice, &tmp, &notice.id[i].value);
1256*b30d1939SAndy Fiddaman 						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1257*b30d1939SAndy Fiddaman 					}
1258*b30d1939SAndy Fiddaman 					if (!q)
1259*b30d1939SAndy Fiddaman 						break;
1260*b30d1939SAndy Fiddaman 				}
1261*b30d1939SAndy Fiddaman 			if (q)
1262*b30d1939SAndy Fiddaman 				break;
1263*b30d1939SAndy Fiddaman 			if (!h)
1264*b30d1939SAndy Fiddaman 			{
1265*b30d1939SAndy Fiddaman 				if (notice.type == USAGE)
1266*b30d1939SAndy Fiddaman 				{
1267*b30d1939SAndy Fiddaman 					copy(&buf, "[-author?", -1);
1268*b30d1939SAndy Fiddaman 					expand(&notice, &buf, &item);
1269*b30d1939SAndy Fiddaman 					PUT(&buf, ']');
1270*b30d1939SAndy Fiddaman 				}
1271*b30d1939SAndy Fiddaman 				else
1272*b30d1939SAndy Fiddaman 				{
1273*b30d1939SAndy Fiddaman 					if (k < 0)
1274*b30d1939SAndy Fiddaman 					{
1275*b30d1939SAndy Fiddaman 						COMMENT(&notice, &buf, "CONTRIBUTORS", 0);
1276*b30d1939SAndy Fiddaman 						comment(&notice, &buf, NiL, 0, 0);
1277*b30d1939SAndy Fiddaman 					}
1278*b30d1939SAndy Fiddaman 					k = 1;
1279*b30d1939SAndy Fiddaman 					expand(&notice, &tmp, &item);
1280*b30d1939SAndy Fiddaman 					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
1281*b30d1939SAndy Fiddaman 				}
1282*b30d1939SAndy Fiddaman 			}
1283*b30d1939SAndy Fiddaman 		}
1284*b30d1939SAndy Fiddaman 		if (k > 0)
1285*b30d1939SAndy Fiddaman 			comment(&notice, &buf, NiL, 0, 0);
1286*b30d1939SAndy Fiddaman 	}
1287*b30d1939SAndy Fiddaman 	if (notice.type == USAGE)
1288*b30d1939SAndy Fiddaman 	{
1289*b30d1939SAndy Fiddaman 		copy(&buf, "[-copyright?", -1);
1290*b30d1939SAndy Fiddaman 		copyright(&notice, &buf);
1291*b30d1939SAndy Fiddaman 		PUT(&buf, ']');
1292*b30d1939SAndy Fiddaman 		if (notice.item[URL].data)
1293*b30d1939SAndy Fiddaman 		{
1294*b30d1939SAndy Fiddaman 			copy(&buf, "[-license?", -1);
1295*b30d1939SAndy Fiddaman 			expand(&notice, &buf, &notice.item[URL]);
1296*b30d1939SAndy Fiddaman 			PUT(&buf, ']');
1297*b30d1939SAndy Fiddaman 		}
1298*b30d1939SAndy Fiddaman 		PUT(&buf, '\n');
1299*b30d1939SAndy Fiddaman 	}
1300*b30d1939SAndy Fiddaman 	else
1301*b30d1939SAndy Fiddaman 		comment(&notice, &buf, NiL, -1, 0);
1302*b30d1939SAndy Fiddaman 	return END(&buf);
1303*b30d1939SAndy Fiddaman }
1304