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