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, ¬ice->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, ¬ice->item[PARENT]);
354da2e3ebdSchin }
355da2e3ebdSchin if (notice->item[CORPORATION].data)
356da2e3ebdSchin {
357da2e3ebdSchin PUT(b, ' ');
358da2e3ebdSchin expand(notice, b, ¬ice->item[CORPORATION]);
359da2e3ebdSchin if (notice->item[INCORPORATION].data)
360da2e3ebdSchin {
361da2e3ebdSchin PUT(b, ' ');
362da2e3ebdSchin expand(notice, b, ¬ice->item[INCORPORATION]);
363da2e3ebdSchin }
364da2e3ebdSchin }
365da2e3ebdSchin else if (notice->item[COMPANY].data)
366da2e3ebdSchin {
367da2e3ebdSchin PUT(b, ' ');
368da2e3ebdSchin expand(notice, b, ¬ice->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(¬ice, &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(¬ice, &buf, ¬ice.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(¬ice, &buf, &item);
596da2e3ebdSchin }
597da2e3ebdSchin else
598da2e3ebdSchin expand(¬ice, &buf, ¬ice.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(¬ice, &buf, NiL, 1, 0);
674da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
675da2e3ebdSchin if (notice.item[PACKAGE].data)
676da2e3ebdSchin {
677da2e3ebdSchin copy(&tmp, "This software is part of the ", -1);
678da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[PACKAGE]);
679da2e3ebdSchin copy(&tmp, " package", -1);
680da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
681da2e3ebdSchin }
682da2e3ebdSchin if (notice.type >= OPEN)
683da2e3ebdSchin {
684da2e3ebdSchin copyright(¬ice, &tmp);
685da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
686da2e3ebdSchin if (notice.type >= SPECIAL)
687da2e3ebdSchin COMMENT(¬ice, &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(¬ice, &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(¬ice, &tmp, ¬ice.item[VERSION]);
702da2e3ebdSchin }
703da2e3ebdSchin comment(¬ice, &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(¬ice, &tmp, ¬ice.item[PARENT]);
710da2e3ebdSchin copy(&tmp, " ", -1);
711da2e3ebdSchin }
712da2e3ebdSchin if (notice.item[CORPORATION].data)
713da2e3ebdSchin {
714da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[CORPORATION]);
715da2e3ebdSchin if (notice.item[INCORPORATION].data)
716da2e3ebdSchin {
717da2e3ebdSchin copy(&tmp, " ", -1);
718da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[INCORPORATION]);
719da2e3ebdSchin }
720da2e3ebdSchin }
721da2e3ebdSchin else if (notice.item[COMPANY].data)
722da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
723da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
724da2e3ebdSchin }
725da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
726da2e3ebdSchin COMMENT(¬ice, &buf, "A copy of the License is available at", 0);
727da2e3ebdSchin if (notice.item[URL].data)
728da2e3ebdSchin {
729da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URL]);
730da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
731da2e3ebdSchin if (notice.item[URLMD5].data)
732da2e3ebdSchin {
733da2e3ebdSchin copy(&tmp, "(with md5 checksum ", -1);
734da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URLMD5]);
735da2e3ebdSchin copy(&tmp, ")", -1);
736da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
737da2e3ebdSchin }
738da2e3ebdSchin }
739*3e14f97fSRoger A. Faulkner else if (notice.type == EPL)
740*3e14f97fSRoger A. Faulkner COMMENT(¬ice, &buf, "http://www.eclipse.org/org/documents/epl-v10.html", 0);
741da2e3ebdSchin else
742da2e3ebdSchin COMMENT(¬ice, &buf, "http://www.opensource.org/licenses/cpl", 0);
743da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
750da2e3ebdSchin if (notice.item[i = CORPORATION].data)
751da2e3ebdSchin {
752da2e3ebdSchin if (notice.item[PARENT].data)
753da2e3ebdSchin {
754da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[i = PARENT]);
755da2e3ebdSchin copy(&tmp, " ", -1);
756da2e3ebdSchin }
757da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[CORPORATION]);
758da2e3ebdSchin comment(¬ice, &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(¬ice, &tmp, ¬ice.item[i = PARENT]);
765da2e3ebdSchin copy(&tmp, " ", -1);
766da2e3ebdSchin }
767da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
768da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
769da2e3ebdSchin }
770da2e3ebdSchin else
771da2e3ebdSchin i = -1;
772da2e3ebdSchin if (notice.item[URL].data)
773da2e3ebdSchin {
774da2e3ebdSchin COMMENT(¬ice, &buf, "A copy of the Source Code Agreement is available", 0);
775da2e3ebdSchin copy(&tmp, "at the ", -1);
776da2e3ebdSchin if (i >= 0)
777da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[i]);
778da2e3ebdSchin copy(&tmp, " Internet web site URL", -1);
779da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
780da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
781da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URL]);
782da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
783da2e3ebdSchin if (notice.item[URLMD5].data)
784da2e3ebdSchin {
785da2e3ebdSchin copy(&tmp, "(with an md5 checksum of ", -1);
786da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URLMD5]);
787da2e3ebdSchin copy(&tmp, ")", -1);
788da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
789da2e3ebdSchin }
790da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
791da2e3ebdSchin }
792da2e3ebdSchin COMMENT(¬ice, &buf, "If you have copied or used this software without agreeing", 0);
793da2e3ebdSchin COMMENT(¬ice, &buf, "to the terms of the license you are infringing on", 0);
794da2e3ebdSchin COMMENT(¬ice, &buf, "the license and copyright and are violating", 0);
795da2e3ebdSchin if (i >= 0)
796da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[i]);
797da2e3ebdSchin copy(&tmp, "'s", -1);
798da2e3ebdSchin if (n >= COMLONG)
799da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
800da2e3ebdSchin else
801da2e3ebdSchin PUT(&tmp, ' ');
802da2e3ebdSchin copy(&tmp, "intellectual property rights.", -1);
803da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
804da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
805da2e3ebdSchin }
806da2e3ebdSchin else if (notice.type == GPL)
807da2e3ebdSchin {
808da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
809da2e3ebdSchin COMMENT(¬ice, &buf, "This is free software; you can redistribute it and/or", 0);
810da2e3ebdSchin COMMENT(¬ice, &buf, "modify it under the terms of the GNU General Public License", 0);
811da2e3ebdSchin COMMENT(¬ice, &buf, "as published by the Free Software Foundation;", 0);
812da2e3ebdSchin COMMENT(¬ice, &buf, "either version 2, or (at your option) any later version.", 0);
813da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
814da2e3ebdSchin COMMENT(¬ice, &buf, "This software is distributed in the hope that it", 0);
815da2e3ebdSchin COMMENT(¬ice, &buf, "will be useful, but WITHOUT ANY WARRANTY;", 0);
816da2e3ebdSchin COMMENT(¬ice, &buf, "without even the implied warranty of MERCHANTABILITY", 0);
817da2e3ebdSchin COMMENT(¬ice, &buf, "or FITNESS FOR A PARTICULAR PURPOSE.", 0);
818da2e3ebdSchin COMMENT(¬ice, &buf, "See the GNU General Public License for more details.", 0);
819da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
820da2e3ebdSchin COMMENT(¬ice, &buf, "You should have received a copy of the", 0);
821da2e3ebdSchin COMMENT(¬ice, &buf, "GNU General Public License", 0);
822da2e3ebdSchin COMMENT(¬ice, &buf, "along with this software (see the file COPYING.)", 0);
823da2e3ebdSchin COMMENT(¬ice, &buf, "If not, a copy is available at", 0);
824da2e3ebdSchin COMMENT(¬ice, &buf, "http://www.gnu.org/copyleft/gpl.html", 0);
825da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
826da2e3ebdSchin }
827da2e3ebdSchin else if (notice.type == BSD)
828da2e3ebdSchin {
829da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
830da2e3ebdSchin COMMENT(¬ice, &buf, "Redistribution and use in source and binary forms, with or", -1);
831da2e3ebdSchin COMMENT(¬ice, &buf, "without modification, are permitted provided that the following", -1);
832da2e3ebdSchin COMMENT(¬ice, &buf, "conditions are met:", -1);
833da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
834da2e3ebdSchin COMMENT(¬ice, &buf, " 1. Redistributions of source code must retain the above", -1);
835da2e3ebdSchin COMMENT(¬ice, &buf, " copyright notice, this list of conditions and the", -1);
836da2e3ebdSchin COMMENT(¬ice, &buf, " following disclaimer.", -1);
837da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
838da2e3ebdSchin COMMENT(¬ice, &buf, " 2. Redistributions in binary form must reproduce the above", -1);
839da2e3ebdSchin COMMENT(¬ice, &buf, " copyright notice, this list of conditions and the", -1);
840da2e3ebdSchin COMMENT(¬ice, &buf, " following disclaimer in the documentation and/or other", -1);
841da2e3ebdSchin COMMENT(¬ice, &buf, " materials provided with the distribution.", -1);
842da2e3ebdSchin comment(¬ice, &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(¬ice, &tmp, ¬ice.item[i]);
846da2e3ebdSchin else
847da2e3ebdSchin copy(&tmp, "the copyright holder", -1);
848da2e3ebdSchin copy(&tmp, " nor the", -1);
849da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), -1);
850da2e3ebdSchin COMMENT(¬ice, &buf, " names of its contributors may be used to endorse or", -1);
851da2e3ebdSchin COMMENT(¬ice, &buf, " promote products derived from this software without", -1);
852da2e3ebdSchin COMMENT(¬ice, &buf, " specific prior written permission.", -1);
853da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
854da2e3ebdSchin COMMENT(¬ice, &buf, "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND", -1);
855da2e3ebdSchin COMMENT(¬ice, &buf, "CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,", -1);
856da2e3ebdSchin COMMENT(¬ice, &buf, "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF", -1);
857da2e3ebdSchin COMMENT(¬ice, &buf, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE", -1);
858da2e3ebdSchin COMMENT(¬ice, &buf, "DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS", -1);
859da2e3ebdSchin COMMENT(¬ice, &buf, "BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", -1);
860da2e3ebdSchin COMMENT(¬ice, &buf, "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED", -1);
861da2e3ebdSchin COMMENT(¬ice, &buf, "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,", -1);
862da2e3ebdSchin COMMENT(¬ice, &buf, "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON", -1);
863da2e3ebdSchin COMMENT(¬ice, &buf, "ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,", -1);
864da2e3ebdSchin COMMENT(¬ice, &buf, "OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY", -1);
865da2e3ebdSchin COMMENT(¬ice, &buf, "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE", -1);
866da2e3ebdSchin COMMENT(¬ice, &buf, "POSSIBILITY OF SUCH DAMAGE.", -1);
867da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
868da2e3ebdSchin }
869da2e3ebdSchin else if (notice.type == ZLIB)
870da2e3ebdSchin {
871da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
872da2e3ebdSchin COMMENT(¬ice, &buf, "This software is provided 'as-is', without any express or implied", -1);
873da2e3ebdSchin COMMENT(¬ice, &buf, "warranty. In no event will the authors be held liable for any", -1);
874da2e3ebdSchin COMMENT(¬ice, &buf, "damages arising from the use of this software.", -1);
875da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
876da2e3ebdSchin COMMENT(¬ice, &buf, "Permission is granted to anyone to use this software for any", -1);
877da2e3ebdSchin COMMENT(¬ice, &buf, "purpose, including commercial applications, and to alter it and", -1);
878da2e3ebdSchin COMMENT(¬ice, &buf, "redistribute it freely, subject to the following restrictions:", -1);
879da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
880da2e3ebdSchin COMMENT(¬ice, &buf, " 1. The origin of this software must not be misrepresented;", -1);
881da2e3ebdSchin COMMENT(¬ice, &buf, " you must not claim that you wrote the original software. If", -1);
882da2e3ebdSchin COMMENT(¬ice, &buf, " you use this software in a product, an acknowledgment in the", -1);
883da2e3ebdSchin COMMENT(¬ice, &buf, " product documentation would be appreciated but is not", -1);
884da2e3ebdSchin COMMENT(¬ice, &buf, " required.", -1);
885da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
886da2e3ebdSchin COMMENT(¬ice, &buf, " 2. Altered source versions must be plainly marked as such,", -1);
887da2e3ebdSchin COMMENT(¬ice, &buf, " and must not be misrepresented as being the original", -1);
888da2e3ebdSchin COMMENT(¬ice, &buf, " software.", -1);
889da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
890da2e3ebdSchin COMMENT(¬ice, &buf, " 3. This notice may not be removed or altered from any source", -1);
891da2e3ebdSchin COMMENT(¬ice, &buf, " distribution.", -1);
892da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
893da2e3ebdSchin }
894da2e3ebdSchin else if (notice.type == MIT)
895da2e3ebdSchin {
896da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
897da2e3ebdSchin COMMENT(¬ice, &buf, "Permission is hereby granted, free of charge, to any person", 0);
898da2e3ebdSchin COMMENT(¬ice, &buf, "obtaining a copy of this software and associated", 0);
899da2e3ebdSchin COMMENT(¬ice, &buf, "documentation files (the \"Software\"), to deal in the", 0);
900da2e3ebdSchin COMMENT(¬ice, &buf, "Software without restriction, including without limitation", 0);
901da2e3ebdSchin COMMENT(¬ice, &buf, "the rights to use, copy, modify, merge, publish, distribute,", 0);
902da2e3ebdSchin COMMENT(¬ice, &buf, "sublicense, and/or sell copies of the Software, and to", 0);
903da2e3ebdSchin COMMENT(¬ice, &buf, "permit persons to whom the Software is furnished to do so,", 0);
904da2e3ebdSchin COMMENT(¬ice, &buf, "subject to the following conditions:", 0);
905da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
906da2e3ebdSchin COMMENT(¬ice, &buf, "The above copyright notice and this permission notice shall", 0);
907da2e3ebdSchin COMMENT(¬ice, &buf, "be included in all copies or substantial portions of the", 0);
908da2e3ebdSchin COMMENT(¬ice, &buf, "Software.", 0);
909da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
910da2e3ebdSchin COMMENT(¬ice, &buf, "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY", 0);
911da2e3ebdSchin COMMENT(¬ice, &buf, "KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE", 0);
912da2e3ebdSchin COMMENT(¬ice, &buf, "WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR", 0);
913da2e3ebdSchin COMMENT(¬ice, &buf, "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS", 0);
914da2e3ebdSchin COMMENT(¬ice, &buf, "OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR", 0);
915da2e3ebdSchin COMMENT(¬ice, &buf, "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR", 0);
916da2e3ebdSchin COMMENT(¬ice, &buf, "OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE", 0);
917da2e3ebdSchin COMMENT(¬ice, &buf, "SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", 0);
918da2e3ebdSchin comment(¬ice, &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(¬ice, &tmp, ¬ice.item[i]);
927da2e3ebdSchin copy(&tmp, " - ", -1);
928da2e3ebdSchin }
929da2e3ebdSchin else
930da2e3ebdSchin i = -1;
931da2e3ebdSchin copy(&tmp, "Proprietary", -1);
932da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 1);
933da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, BUF(&tmp), USE(&tmp), 1);
940da2e3ebdSchin if (notice.item[PARENT].data)
941da2e3ebdSchin {
942da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[PARENT]);
943da2e3ebdSchin copy(&tmp, " ", -1);
944da2e3ebdSchin }
945da2e3ebdSchin if (notice.item[CORPORATION].data)
946da2e3ebdSchin {
947da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[CORPORATION]);
948da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 1);
949da2e3ebdSchin }
950da2e3ebdSchin else if (notice.item[COMPANY].data)
951da2e3ebdSchin {
952da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
953da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, BUF(&tmp), USE(&tmp), 1);
962da2e3ebdSchin if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
963da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[i]);
964da2e3ebdSchin if (notice.item[COMPANY].data)
965da2e3ebdSchin {
966da2e3ebdSchin if (SIZ(&tmp))
967da2e3ebdSchin PUT(&tmp, ' ');
968da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
969da2e3ebdSchin }
970da2e3ebdSchin if (SIZ(&tmp))
971da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 1);
972da2e3ebdSchin COMMENT(¬ice, &buf, "and is not to be disclosed or used except in", 1);
973da2e3ebdSchin COMMENT(¬ice, &buf, "accordance with applicable agreements", 1);
974da2e3ebdSchin }
975da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
976da2e3ebdSchin }
977da2e3ebdSchin else if (notice.type == NONEXCLUSIVE)
978da2e3ebdSchin {
979da2e3ebdSchin COMMENT(¬ice, &buf, "For nonexclusive individual use", 1);
980da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
981da2e3ebdSchin }
982da2e3ebdSchin else if (notice.type == NONCOMMERCIAL)
983da2e3ebdSchin {
984da2e3ebdSchin COMMENT(¬ice, &buf, "For noncommercial use", 1);
985da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
986da2e3ebdSchin }
987da2e3ebdSchin if (notice.type >= PROPRIETARY && !notice.item[URL].data)
988da2e3ebdSchin {
989da2e3ebdSchin COMMENT(¬ice, &buf, "Unpublished & Not for Publication", 0);
990da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1000da2e3ebdSchin else
1001da2e3ebdSchin PUT(&tmp, ' ');
1002da2e3ebdSchin if (notice.item[PARENT].data)
1003da2e3ebdSchin {
1004da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[PARENT]);
1005da2e3ebdSchin copy(&tmp, " ", -1);
1006da2e3ebdSchin }
1007da2e3ebdSchin if (notice.item[CORPORATION].data)
1008da2e3ebdSchin {
1009da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[CORPORATION]);
1010da2e3ebdSchin if (notice.item[INCORPORATION].data)
1011da2e3ebdSchin {
1012da2e3ebdSchin copy(&tmp, " ", -1);
1013da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[INCORPORATION]);
1014da2e3ebdSchin }
1015da2e3ebdSchin }
1016da2e3ebdSchin else if (notice.item[COMPANY].data)
1017da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
1018da2e3ebdSchin }
1019da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1020da2e3ebdSchin COMMENT(¬ice, &buf, "under the terms and conditions of the license in", 0);
1021da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URL]);
1022da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1023da2e3ebdSchin if (notice.item[URLMD5].data)
1024da2e3ebdSchin {
1025da2e3ebdSchin copy(&tmp, "(with an md5 checksum of ", -1);
1026da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[URLMD5]);
1027da2e3ebdSchin copy(&tmp, ")", -1);
1028da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1029da2e3ebdSchin }
1030da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
1031da2e3ebdSchin }
1032da2e3ebdSchin else if (notice.type == PROPRIETARY)
1033da2e3ebdSchin {
1034da2e3ebdSchin COMMENT(¬ice, &buf, "The copyright notice above does not evidence any", 0);
1035da2e3ebdSchin COMMENT(¬ice, &buf, "actual or intended publication of such source code", 0);
1036da2e3ebdSchin comment(¬ice, &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(¬ice, &tmp, &item);
1057da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), h);
1058da2e3ebdSchin } while (v++ < x);
1059da2e3ebdSchin if (item.size)
1060da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
1061da2e3ebdSchin }
1062da2e3ebdSchin if (notice.item[ORGANIZATION].data)
1063da2e3ebdSchin {
1064da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[ORGANIZATION]);
1065da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1066da2e3ebdSchin if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
1067da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[i]);
1068da2e3ebdSchin if (notice.item[COMPANY].data)
1069da2e3ebdSchin {
1070da2e3ebdSchin if (SIZ(&tmp))
1071da2e3ebdSchin PUT(&tmp, ' ');
1072da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[COMPANY]);
1073da2e3ebdSchin }
1074da2e3ebdSchin if (SIZ(&tmp))
1075da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1076da2e3ebdSchin if (notice.item[LOCATION].data)
1077da2e3ebdSchin {
1078da2e3ebdSchin expand(¬ice, &tmp, ¬ice.item[LOCATION]);
1079da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1080da2e3ebdSchin }
1081da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, ¬ice.id[i].value);
1111da2e3ebdSchin PUT(&buf, ']');
1112da2e3ebdSchin }
1113da2e3ebdSchin else
1114da2e3ebdSchin {
1115da2e3ebdSchin if (k < 0)
1116da2e3ebdSchin {
1117da2e3ebdSchin COMMENT(¬ice, &buf, "CONTRIBUTORS", 0);
1118da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
1119da2e3ebdSchin }
1120da2e3ebdSchin k = 1;
1121da2e3ebdSchin expand(¬ice, &tmp, ¬ice.id[i].value);
1122da2e3ebdSchin comment(¬ice, &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(¬ice, &buf, &item);
1135da2e3ebdSchin PUT(&buf, ']');
1136da2e3ebdSchin }
1137da2e3ebdSchin else
1138da2e3ebdSchin {
1139da2e3ebdSchin if (k < 0)
1140da2e3ebdSchin {
1141da2e3ebdSchin COMMENT(¬ice, &buf, "CONTRIBUTORS", 0);
1142da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
1143da2e3ebdSchin }
1144da2e3ebdSchin k = 1;
1145da2e3ebdSchin expand(¬ice, &tmp, &item);
1146da2e3ebdSchin comment(¬ice, &buf, BUF(&tmp), USE(&tmp), 0);
1147da2e3ebdSchin }
1148da2e3ebdSchin }
1149da2e3ebdSchin }
1150da2e3ebdSchin if (k > 0)
1151da2e3ebdSchin comment(¬ice, &buf, NiL, 0, 0);
1152da2e3ebdSchin }
1153da2e3ebdSchin if (notice.type == USAGE)
1154da2e3ebdSchin {
1155da2e3ebdSchin copy(&buf, "[-copyright?", -1);
1156da2e3ebdSchin copyright(¬ice, &buf);
1157da2e3ebdSchin PUT(&buf, ']');
1158da2e3ebdSchin if (notice.item[URL].data)
1159da2e3ebdSchin {
1160da2e3ebdSchin copy(&buf, "[-license?", -1);
1161da2e3ebdSchin expand(¬ice, &buf, ¬ice.item[URL]);
1162da2e3ebdSchin PUT(&buf, ']');
1163da2e3ebdSchin }
1164da2e3ebdSchin PUT(&buf, '\n');
1165da2e3ebdSchin }
1166da2e3ebdSchin else
1167da2e3ebdSchin comment(¬ice, &buf, NiL, -1, 0);
1168da2e3ebdSchin return END(&buf);
1169da2e3ebdSchin }
1170