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