Blame src/lib/libast/port/astlicense.c

Packit Service a8c26c
/***********************************************************************
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*               This software is part of the ast package               *
Packit Service a8c26c
*          Copyright (c) 1985-2012 AT&T Intellectual Property          *
Packit Service a8c26c
*                      and is licensed under the                       *
Packit Service a8c26c
*                 Eclipse Public License, Version 1.0                  *
Packit Service a8c26c
*                    by AT&T Intellectual Property                     *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                A copy of the License is available at                 *
Packit Service a8c26c
*          http://www.eclipse.org/org/documents/epl-v10.html           *
Packit Service a8c26c
*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*              Information and Software Systems Research               *
Packit Service a8c26c
*                            AT&T Research                             *
Packit Service a8c26c
*                           Florham Park NJ                            *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                 Glenn Fowler <gsf@research.att.com>                  *
Packit Service a8c26c
*                  David Korn <dgk@research.att.com>                   *
Packit Service a8c26c
*                   Phong Vo <kpv@research.att.com>                    *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
***********************************************************************/
Packit Service a8c26c
#pragma prototyped
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * Glenn Fowler
Packit Service a8c26c
 * AT&T Research
Packit Service a8c26c
 *
Packit Service a8c26c
 * generate a license comment -- see proto(1)
Packit Service a8c26c
 *
Packit Service a8c26c
 * NOTE: coded for minimal library dependence
Packit Service a8c26c
 *	 not so for the legal department
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
#ifndef	_PPLIB_H
Packit Service a8c26c
#include <ast.h>
Packit Service a8c26c
#include <time.h>
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#ifndef O_cloexec
Packit Service a8c26c
#ifdef	O_CLOEXEC
Packit Service a8c26c
#define O_cloexec		0
Packit Service a8c26c
#else
Packit Service a8c26c
#define O_cloexec		0
Packit Service a8c26c
#endif
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#undef	copy
Packit Service a8c26c
#undef	BSD			/* guess who defines this */
Packit Service a8c26c
#undef	END
Packit Service a8c26c
#undef	INLINE
Packit Service a8c26c
#undef	TEST
Packit Service a8c26c
#undef	VERBOSE
Packit Service a8c26c
Packit Service a8c26c
#define NONE			0
Packit Service a8c26c
#define INLINE			1
Packit Service a8c26c
#define TEST			2
Packit Service a8c26c
#define VERBOSE			3
Packit Service a8c26c
#define USAGE			4
Packit Service a8c26c
#define OPEN			5
Packit Service a8c26c
#define CPL			6
Packit Service a8c26c
#define EPL			7
Packit Service a8c26c
#define BSD			8
Packit Service a8c26c
#define ZLIB			9
Packit Service a8c26c
#define MIT			10
Packit Service a8c26c
#define GPL			11
Packit Service a8c26c
#define SPECIAL			12
Packit Service a8c26c
#define NONEXCLUSIVE		13
Packit Service a8c26c
#define NONCOMMERCIAL		14
Packit Service a8c26c
#define PROPRIETARY		15
Packit Service a8c26c
Packit Service a8c26c
#define AUTHOR			0
Packit Service a8c26c
#define CLASS			1
Packit Service a8c26c
#define COMPANY			2
Packit Service a8c26c
#define COMPONENT		3
Packit Service a8c26c
#define CONTRIBUTOR		4
Packit Service a8c26c
#define CORPORATION		5
Packit Service a8c26c
#define DOMAIN			6
Packit Service a8c26c
#define ID			7
Packit Service a8c26c
#define INCORPORATION		8
Packit Service a8c26c
#define LICENSE			9
Packit Service a8c26c
#define LOCATION		10
Packit Service a8c26c
#define NAME			11
Packit Service a8c26c
#define NOTICE			12
Packit Service a8c26c
#define ORGANIZATION		13
Packit Service a8c26c
#define PACKAGE			14
Packit Service a8c26c
#define PARENT			15
Packit Service a8c26c
#define QUERY			16
Packit Service a8c26c
#define SINCE			17
Packit Service a8c26c
#define SOURCE			18
Packit Service a8c26c
#define START			19
Packit Service a8c26c
#define STYLE			20
Packit Service a8c26c
#define URL			21
Packit Service a8c26c
#define URLMD5			22
Packit Service a8c26c
#define VERSION			23
Packit Service a8c26c
Packit Service a8c26c
#define IDS			64
Packit Service a8c26c
Packit Service a8c26c
#define COMDATA			70
Packit Service a8c26c
#define COMLINE			(COMDATA+4)
Packit Service a8c26c
#define COMLONG			(COMDATA-32)
Packit Service a8c26c
#define COMMENT(x,b,s,u)	comment(x,b,s,sizeof(s)-1,u)
Packit Service a8c26c
Packit Service a8c26c
#define PUT(b,c)		(((b)->nxt<(b)->end)?(*(b)->nxt++=(c)):((c),(-1)))
Packit Service a8c26c
#define BUF(b)			((b)->buf)
Packit Service a8c26c
#define USE(b)			((b)->siz=(b)->nxt-(b)->buf,(b)->nxt=(b)->buf,(b)->siz)
Packit Service a8c26c
#define SIZ(b)			((b)->nxt-(b)->buf)
Packit Service a8c26c
#define END(b)			(*((b)->nxt>=(b)->end?((b)->nxt=(b)->end-1):(b)->nxt)=0,(b)->nxt-(b)->buf)
Packit Service a8c26c
Packit Service a8c26c
#ifndef NiL
Packit Service a8c26c
#define NiL			((char*)0)
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
typedef struct Buffer_s
Packit Service a8c26c
{
Packit Service a8c26c
	char*		buf;
Packit Service a8c26c
	char*		nxt;
Packit Service a8c26c
	char*		end;
Packit Service a8c26c
	int		siz;
Packit Service a8c26c
} Buffer_t;
Packit Service a8c26c
Packit Service a8c26c
typedef struct Item_s
Packit Service a8c26c
{
Packit Service a8c26c
	char*		data;
Packit Service a8c26c
	int		size;
Packit Service a8c26c
	int		quote;
Packit Service a8c26c
} Item_t;
Packit Service a8c26c
Packit Service a8c26c
typedef struct Id_s
Packit Service a8c26c
{
Packit Service a8c26c
	Item_t		name;
Packit Service a8c26c
	Item_t		value;
Packit Service a8c26c
} Id_t;
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * NOTE: key[] element order must match the corresponding macro
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
#define KEY(s)			{s,sizeof(s)-1,0}
Packit Service a8c26c
Packit Service a8c26c
static const Item_t	key[] =
Packit Service a8c26c
{
Packit Service a8c26c
	KEY("author"),
Packit Service a8c26c
	KEY("class"),
Packit Service a8c26c
	KEY("company"),
Packit Service a8c26c
	KEY("component"),
Packit Service a8c26c
	KEY("contributor"),
Packit Service a8c26c
	KEY("corporation"),
Packit Service a8c26c
	KEY("domain"),
Packit Service a8c26c
	KEY("id"),
Packit Service a8c26c
	KEY("incorporation"),
Packit Service a8c26c
	KEY("license"),
Packit Service a8c26c
	KEY("location"),
Packit Service a8c26c
	KEY("name"),
Packit Service a8c26c
	KEY("notice"),
Packit Service a8c26c
	KEY("organization"),
Packit Service a8c26c
	KEY("package"),
Packit Service a8c26c
	KEY("parent"),
Packit Service a8c26c
	KEY("query"),
Packit Service a8c26c
	KEY("since"),
Packit Service a8c26c
	KEY("source"),
Packit Service a8c26c
	KEY("start"),
Packit Service a8c26c
	KEY("type"),
Packit Service a8c26c
	KEY("url"),
Packit Service a8c26c
	KEY("urlmd5"),
Packit Service a8c26c
	KEY("version"),
Packit Service a8c26c
	{0}
Packit Service a8c26c
};
Packit Service a8c26c
Packit Service a8c26c
#define ITEMS			(sizeof(key)/sizeof(key[0])-1)
Packit Service a8c26c
Packit Service a8c26c
#define LIC(s,c)		{s,sizeof(s)-1,c}
Packit Service a8c26c
Packit Service a8c26c
static const Item_t	lic[] =
Packit Service a8c26c
{
Packit Service a8c26c
	LIC("none", NONE),
Packit Service a8c26c
	LIC("inline", SPECIAL),
Packit Service a8c26c
	LIC("test", TEST),
Packit Service a8c26c
	LIC("verbose", VERBOSE),
Packit Service a8c26c
	LIC("usage", USAGE),
Packit Service a8c26c
	LIC("open", OPEN),
Packit Service a8c26c
	LIC("cpl", OPEN),
Packit Service a8c26c
	LIC("epl", OPEN),
Packit Service a8c26c
	LIC("bsd", OPEN),
Packit Service a8c26c
	LIC("zlib", OPEN),
Packit Service a8c26c
	LIC("mit", OPEN),
Packit Service a8c26c
	LIC("gpl", GPL),
Packit Service a8c26c
	LIC("special", SPECIAL),
Packit Service a8c26c
	LIC("nonexclusive", SPECIAL),
Packit Service a8c26c
	LIC("noncommercial", SPECIAL),
Packit Service a8c26c
	LIC("proprietary", PROPRIETARY),
Packit Service a8c26c
	{0}
Packit Service a8c26c
};
Packit Service a8c26c
Packit Service a8c26c
typedef struct Notice_s
Packit Service a8c26c
{
Packit Service a8c26c
	int		test;
Packit Service a8c26c
	int		type;
Packit Service a8c26c
	int		verbose;
Packit Service a8c26c
	int		ids;
Packit Service a8c26c
	Item_t		item[ITEMS];
Packit Service a8c26c
	Id_t		id[IDS];
Packit Service a8c26c
	char		cc[3];
Packit Service a8c26c
} Notice_t;
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * return index given <name,size>
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static int
Packit Service a8c26c
lookup(register const Item_t* item, const char* name, int size)
Packit Service a8c26c
{
Packit Service a8c26c
	register int	c;
Packit Service a8c26c
	register int	i;
Packit Service a8c26c
Packit Service a8c26c
	c = name[0];
Packit Service a8c26c
	for (i = 0; item[i].data; i++)
Packit Service a8c26c
		if (c == item[i].data[0] && size == item[i].size && !strncmp(name, item[i].data, size))
Packit Service a8c26c
			return i;
Packit Service a8c26c
	return -1;
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * copy s of size n to b
Packit Service a8c26c
 * n<0 means 0 terminated string
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static void
Packit Service a8c26c
copy(register Buffer_t* b, register char* s, int n)
Packit Service a8c26c
{
Packit Service a8c26c
	if (n < 0)
Packit Service a8c26c
		n = strlen(s);
Packit Service a8c26c
	while (n--)
Packit Service a8c26c
		PUT(b, *s++);
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * center and copy comment line s to p
Packit Service a8c26c
 * if s==0 then
Packit Service a8c26c
 *	n>0	first frame line
Packit Service a8c26c
 *	n=0	blank line
Packit Service a8c26c
 *	n<0	last frame line
Packit Service a8c26c
 * if u>0 then s converted to upper case
Packit Service a8c26c
 * if u<0 then s is left justified
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static void
Packit Service a8c26c
comment(Notice_t* notice, register Buffer_t* b, register char* s, register int n, int u)
Packit Service a8c26c
{
Packit Service a8c26c
	register int	i;
Packit Service a8c26c
	register int	m;
Packit Service a8c26c
	register int	x;
Packit Service a8c26c
	int		cc;
Packit Service a8c26c
Packit Service a8c26c
	cc = notice->cc[1];
Packit Service a8c26c
	if (!s)
Packit Service a8c26c
	{
Packit Service a8c26c
		if (n)
Packit Service a8c26c
		{
Packit Service a8c26c
			PUT(b, notice->cc[n > 0 ? 0 : 1]);
Packit Service a8c26c
			for (i = 0; i < COMDATA; i++)
Packit Service a8c26c
				PUT(b, cc);
Packit Service a8c26c
			PUT(b, notice->cc[n > 0 ? 1 : 2]);
Packit Service a8c26c
		}
Packit Service a8c26c
		else
Packit Service a8c26c
			s = "";
Packit Service a8c26c
	}
Packit Service a8c26c
	if (s)
Packit Service a8c26c
	{
Packit Service a8c26c
		if (n > COMDATA)
Packit Service a8c26c
			n = COMDATA;
Packit Service a8c26c
		PUT(b, cc);
Packit Service a8c26c
		m = (u < 0) ? 1 : (COMDATA - n) / 2;
Packit Service a8c26c
		if ((x = COMDATA - m - n) < 0)
Packit Service a8c26c
			n--;
Packit Service a8c26c
		while (m-- > 0)
Packit Service a8c26c
			PUT(b, ' ');
Packit Service a8c26c
		while (n-- > 0)
Packit Service a8c26c
		{
Packit Service a8c26c
			i = *s++;
Packit Service a8c26c
			if (u > 0 && i >= 'a' && i <= 'z')
Packit Service a8c26c
				i = i - 'a' + 'A';
Packit Service a8c26c
			PUT(b, i);
Packit Service a8c26c
		}
Packit Service a8c26c
		while (x-- > 0)
Packit Service a8c26c
			PUT(b, ' ');
Packit Service a8c26c
		PUT(b, cc);
Packit Service a8c26c
	}
Packit Service a8c26c
	PUT(b, '\n');
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * expand simple ${...}
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static void
Packit Service a8c26c
expand(Notice_t* notice, register Buffer_t* b, const Item_t* item)
Packit Service a8c26c
{
Packit Service a8c26c
	register char*	t;
Packit Service a8c26c
	register char*	e;
Packit Service a8c26c
	register int	q;
Packit Service a8c26c
	register char*	x;
Packit Service a8c26c
	register char*	z;
Packit Service a8c26c
	register int	c;
Packit Service a8c26c
	int		m;
Packit Service a8c26c
	int		i;
Packit Service a8c26c
	int		k;
Packit Service a8c26c
Packit Service a8c26c
	if (t = item->data)
Packit Service a8c26c
	{
Packit Service a8c26c
		q = item->quote;
Packit Service a8c26c
		e = t + item->size;
Packit Service a8c26c
		i = 0;
Packit Service a8c26c
		while (t < e)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (*t == '$' && t < (e + 2) && *(t + 1) == '{')
Packit Service a8c26c
			{
Packit Service a8c26c
				k = m = 0;
Packit Service a8c26c
				x = t += 2;
Packit Service a8c26c
				while (t < e && (c = *t++) != '}')
Packit Service a8c26c
					if (c == '.')
Packit Service a8c26c
						x = t;
Packit Service a8c26c
					else if (c == '-')
Packit Service a8c26c
					{
Packit Service a8c26c
						k = 1;
Packit Service a8c26c
						break;
Packit Service a8c26c
					}
Packit Service a8c26c
					else if (c == '/')
Packit Service a8c26c
					{
Packit Service a8c26c
						m = 1;
Packit Service a8c26c
						break;
Packit Service a8c26c
					}
Packit Service a8c26c
				if ((c = lookup(key, x, t - x - 1)) >= 0 && (x = notice->item[c].data))
Packit Service a8c26c
				{
Packit Service a8c26c
					z = x + notice->item[c].size;
Packit Service a8c26c
					while (x < z)
Packit Service a8c26c
					{
Packit Service a8c26c
						c = *x++;
Packit Service a8c26c
						if (!m || c >= '0' && c <= '9')
Packit Service a8c26c
							PUT(b, c);
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
				else if (k)
Packit Service a8c26c
				{
Packit Service a8c26c
					k = 0;
Packit Service a8c26c
					i++;
Packit Service a8c26c
				}
Packit Service a8c26c
				if (k || m)
Packit Service a8c26c
				{
Packit Service a8c26c
					k = 1;
Packit Service a8c26c
					while (t < e)
Packit Service a8c26c
						if ((c = *t++) == '{')
Packit Service a8c26c
							k++;
Packit Service a8c26c
						else if (c == '}' && !--k)
Packit Service a8c26c
							break;
Packit Service a8c26c
				}
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (q > 0 && *t == '\\' && (*(t + 1) == q || *(t + 1) == '\\'))
Packit Service a8c26c
				t++;
Packit Service a8c26c
			else if (*t == '}' && i)
Packit Service a8c26c
			{
Packit Service a8c26c
				t++;
Packit Service a8c26c
				i--;
Packit Service a8c26c
			}
Packit Service a8c26c
			else
Packit Service a8c26c
				PUT(b, *t++);
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * generate a copright notice
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static void
Packit Service a8c26c
copyright(Notice_t* notice, register Buffer_t* b)
Packit Service a8c26c
{
Packit Service a8c26c
	register char*	x;
Packit Service a8c26c
	register char*	t;
Packit Service a8c26c
	time_t		clock;
Packit Service a8c26c
Packit Service a8c26c
	copy(b, "Copyright (c) ", -1);
Packit Service a8c26c
	if (notice->test)
Packit Service a8c26c
	{
Packit Service a8c26c
		clock = (time_t)1000212300;
Packit Service a8c26c
		t = ctime(&clock) + 20;
Packit Service a8c26c
	}
Packit Service a8c26c
	else if (!(t = notice->item[SOURCE].data))
Packit Service a8c26c
	{
Packit Service a8c26c
		time(&clock);
Packit Service a8c26c
		t = ctime(&clock) + 20;
Packit Service a8c26c
	}
Packit Service a8c26c
	if ((x = notice->item[START].data) && strncmp(t, x, 4) < 0)
Packit Service a8c26c
		t = x;
Packit Service a8c26c
	if ((x = notice->item[SINCE].data) && strncmp(x, t, 4) < 0)
Packit Service a8c26c
	{
Packit Service a8c26c
		expand(notice, b, &notice->item[SINCE]);
Packit Service a8c26c
		PUT(b, '-');
Packit Service a8c26c
	}
Packit Service a8c26c
	copy(b, t, 4);
Packit Service a8c26c
	if (notice->item[PARENT].data)
Packit Service a8c26c
	{
Packit Service a8c26c
		PUT(b, ' ');
Packit Service a8c26c
		expand(notice, b, &notice->item[PARENT]);
Packit Service a8c26c
	}
Packit Service a8c26c
	if (notice->item[CORPORATION].data)
Packit Service a8c26c
	{
Packit Service a8c26c
		PUT(b, ' ');
Packit Service a8c26c
		expand(notice, b, &notice->item[CORPORATION]);
Packit Service a8c26c
		if (notice->item[INCORPORATION].data)
Packit Service a8c26c
		{
Packit Service a8c26c
			PUT(b, ' ');
Packit Service a8c26c
			expand(notice, b, &notice->item[INCORPORATION]);
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
	else if (notice->item[COMPANY].data)
Packit Service a8c26c
	{
Packit Service a8c26c
		PUT(b, ' ');
Packit Service a8c26c
		expand(notice, b, &notice->item[COMPANY]);
Packit Service a8c26c
	}
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
typedef struct Stack_s
Packit Service a8c26c
{
Packit Service a8c26c
	char*	info;
Packit Service a8c26c
	char*	file;
Packit Service a8c26c
	int	line;
Packit Service a8c26c
	int	size;
Packit Service a8c26c
} Stack_t;
Packit Service a8c26c
Packit Service a8c26c
static int
Packit Service a8c26c
push(Stack_t* sp, char* file, char* parent, char* info, int size, Buffer_t* buf)
Packit Service a8c26c
{
Packit Service a8c26c
	char*		s;
Packit Service a8c26c
	char*		t;
Packit Service a8c26c
	int		i;
Packit Service a8c26c
	int		n;
Packit Service a8c26c
	char		path[1024];
Packit Service a8c26c
Packit Service a8c26c
	if (size <= 8)
Packit Service a8c26c
	{
Packit Service a8c26c
		copy(buf, file, -1);
Packit Service a8c26c
		copy(buf, ": no space", -1);
Packit Service a8c26c
		PUT(buf, 0);
Packit Service a8c26c
		return -1;
Packit Service a8c26c
	}
Packit Service a8c26c
	if (*file != '/' && parent && (s = strrchr(parent, '/')))
Packit Service a8c26c
	{
Packit Service a8c26c
		n = s - parent + 1;
Packit Service a8c26c
		if ((strlen(file) + n + 1) <= sizeof(path))
Packit Service a8c26c
		{
Packit Service a8c26c
			memcpy(path, parent, n);
Packit Service a8c26c
			strcpy(path + n, file);
Packit Service a8c26c
			file = path;
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
	if ((i = open(file, O_RDONLY|O_cloexec)) < 0)
Packit Service a8c26c
	{
Packit Service a8c26c
		/* this hack viewpath lookup works for default package setups */
Packit Service a8c26c
		if (file == path)
Packit Service a8c26c
			for (s = path; *s; s++)
Packit Service a8c26c
				if (s[0] == '/' && s[1] == 'a' && s[2] == 'r' && s[3] == 'c' && s[4] == 'h' && s[5] == '/')
Packit Service a8c26c
				{
Packit Service a8c26c
					t = s;
Packit Service a8c26c
					for (s += 6; *s && *s != '/'; s++);
Packit Service a8c26c
					while (*t++ = *s++);
Packit Service a8c26c
					i = open(file, O_RDONLY|O_cloexec);
Packit Service a8c26c
				}
Packit Service a8c26c
		if (i < 0)
Packit Service a8c26c
		{
Packit Service a8c26c
			copy(buf, file, -1);
Packit Service a8c26c
			copy(buf, ": cannot open", -1);
Packit Service a8c26c
			PUT(buf, 0);
Packit Service a8c26c
			return -1;
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
	n = read(i, info, size - 1);
Packit Service a8c26c
	close(i);
Packit Service a8c26c
	if (n < 0)
Packit Service a8c26c
	{
Packit Service a8c26c
		copy(buf, file, -1);
Packit Service a8c26c
		copy(buf, ": cannot read", -1);
Packit Service a8c26c
		PUT(buf, 0);
Packit Service a8c26c
		return -1;
Packit Service a8c26c
	}
Packit Service a8c26c
	info[n++] = 0;
Packit Service a8c26c
	sp->file = file;
Packit Service a8c26c
	sp->info = info;
Packit Service a8c26c
	sp->line = 0;
Packit Service a8c26c
	sp->size = n;
Packit Service a8c26c
	return 0;
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
/*
Packit Service a8c26c
 * read the license file and generate a comment in p, length size
Packit Service a8c26c
 * license length in p returned, -1 on error
Packit Service a8c26c
 * -1 return places 0 terminated error string in p
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
int
Packit Service a8c26c
astlicense(char* p, int size, char* file, char* options, int cc1, int cc2, int cc3)
Packit Service a8c26c
{
Packit Service a8c26c
	register char*	s;
Packit Service a8c26c
	register char*	v;
Packit Service a8c26c
	register char*	x;
Packit Service a8c26c
	register int	c;
Packit Service a8c26c
	int		i;
Packit Service a8c26c
	int		h;
Packit Service a8c26c
	int		k;
Packit Service a8c26c
	int		n;
Packit Service a8c26c
	int		q;
Packit Service a8c26c
	int		contributor;
Packit Service a8c26c
	int		first;
Packit Service a8c26c
	int		level;
Packit Service a8c26c
	int		quote;
Packit Service a8c26c
	char*		data;
Packit Service a8c26c
	char		tmpbuf[COMLINE];
Packit Service a8c26c
	char		info[8 * 1024];
Packit Service a8c26c
	Stack_t		input[4];
Packit Service a8c26c
	Notice_t	notice;
Packit Service a8c26c
	Item_t		item;
Packit Service a8c26c
	Buffer_t	buf;
Packit Service a8c26c
	Buffer_t	tmp;
Packit Service a8c26c
Packit Service a8c26c
	buf.end = (buf.buf = buf.nxt = p) + size;
Packit Service a8c26c
	tmp.end = (tmp.buf = tmp.nxt = tmpbuf) + sizeof(tmpbuf);
Packit Service a8c26c
	level = 0;
Packit Service a8c26c
	data = info;
Packit Service a8c26c
	level = -1;
Packit Service a8c26c
	if (options)
Packit Service a8c26c
	{
Packit Service a8c26c
		level++;
Packit Service a8c26c
		input[level].file = "<options>";
Packit Service a8c26c
		input[level].info = options;
Packit Service a8c26c
		input[level].line = 0;
Packit Service a8c26c
	}
Packit Service a8c26c
	if (file && *file)
Packit Service a8c26c
	{
Packit Service a8c26c
		if (push(&input[++level], file, 0, data, &info[sizeof(info)] - data, &buf))
Packit Service a8c26c
			return -1;
Packit Service a8c26c
		data += input[level].size;
Packit Service a8c26c
	}
Packit Service a8c26c
	if (level < 0)
Packit Service a8c26c
		return 0;
Packit Service a8c26c
	s = input[level].info;
Packit Service a8c26c
	notice.test = 0;
Packit Service a8c26c
	notice.type = NONE;
Packit Service a8c26c
	notice.verbose = 0;
Packit Service a8c26c
	notice.ids = 0;
Packit Service a8c26c
	notice.cc[0] = cc1;
Packit Service a8c26c
	notice.cc[1] = cc2;
Packit Service a8c26c
	notice.cc[2] = cc3;
Packit Service a8c26c
	for (i = 0; i < ITEMS; i++)
Packit Service a8c26c
		notice.item[i].data = 0;
Packit Service a8c26c
	notice.item[STYLE] = notice.item[CLASS] = lic[notice.type];
Packit Service a8c26c
	notice.item[STYLE].quote = notice.item[CLASS].quote = 0;
Packit Service a8c26c
	contributor = i = k = 0;
Packit Service a8c26c
	for (;;)
Packit Service a8c26c
	{
Packit Service a8c26c
		first = 1;
Packit Service a8c26c
		while (c = *s)
Packit Service a8c26c
		{
Packit Service a8c26c
			while (c == ' ' || c == '\t' || c == '\n' && ++input[level].line || c == '\r' || c == ',' || c == ';' || c == ')')
Packit Service a8c26c
				c = *++s;
Packit Service a8c26c
			if (!c)
Packit Service a8c26c
				break;
Packit Service a8c26c
			if (c == '#')
Packit Service a8c26c
			{
Packit Service a8c26c
				while (*++s && *s != '\n');
Packit Service a8c26c
				if (*s)
Packit Service a8c26c
					s++;
Packit Service a8c26c
				input[level].line++;
Packit Service a8c26c
				continue;
Packit Service a8c26c
			}
Packit Service a8c26c
			if (c == '.')
Packit Service a8c26c
			{
Packit Service a8c26c
				while ((c = *++s) && (c == ' ' || c == '\t'));
Packit Service a8c26c
				file = s;
Packit Service a8c26c
				while (c && c != ' ' && c != '\t' && c != '\r' && c != '\n')
Packit Service a8c26c
					c = *++s;
Packit Service a8c26c
				*s = 0;
Packit Service a8c26c
				while (c && c != '\n')
Packit Service a8c26c
					c = *++s;
Packit Service a8c26c
				if (*file)
Packit Service a8c26c
				{
Packit Service a8c26c
					input[level].info = s + (c != 0);
Packit Service a8c26c
					if (++level >= (sizeof(input) / sizeof(input[0])) || push(&input[level], file, input[level-1].file, data, &info[sizeof(info)] - data, &buf))
Packit Service a8c26c
						return -1;
Packit Service a8c26c
					data += input[level].size;
Packit Service a8c26c
					s = input[level].info;
Packit Service a8c26c
				}
Packit Service a8c26c
				continue;
Packit Service a8c26c
			}
Packit Service a8c26c
			if (c == '\n')
Packit Service a8c26c
			{
Packit Service a8c26c
				s++;
Packit Service a8c26c
				input[level].line++;
Packit Service a8c26c
				continue;
Packit Service a8c26c
			}
Packit Service a8c26c
			if (c == '[')
Packit Service a8c26c
				c = *++s;
Packit Service a8c26c
			x = s;
Packit Service a8c26c
			n = 0;
Packit Service a8c26c
			while (c && c != '+' && c != '=' && c != ']' && c != ')' && c != ',' && c != ' ' && c != '\t' && c != '\n' && c != '\r')
Packit Service a8c26c
				c = *++s;
Packit Service a8c26c
			n = s - x;
Packit Service a8c26c
			h = lookup(key, x, n);
Packit Service a8c26c
			if (c == '+' || c == ']')
Packit Service a8c26c
				c = *++s;
Packit Service a8c26c
			quote = 0;
Packit Service a8c26c
			if (c == '=' || first)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (c == '=')
Packit Service a8c26c
				{
Packit Service a8c26c
					q = ((c = *++s) == '"' || c == '\'') ? *s++ : 0;
Packit Service a8c26c
					if (c == '(')
Packit Service a8c26c
					{
Packit Service a8c26c
						s++;
Packit Service a8c26c
						if (h == LICENSE)
Packit Service a8c26c
							contributor = 0;
Packit Service a8c26c
						else if (h == CONTRIBUTOR)
Packit Service a8c26c
							contributor = 1;
Packit Service a8c26c
						else
Packit Service a8c26c
						{
Packit Service a8c26c
							q = 1;
Packit Service a8c26c
							i = 0;
Packit Service a8c26c
							for (;;)
Packit Service a8c26c
							{
Packit Service a8c26c
								switch (*s++)
Packit Service a8c26c
								{
Packit Service a8c26c
								case 0:
Packit Service a8c26c
									s--;
Packit Service a8c26c
									break;
Packit Service a8c26c
								case '(':
Packit Service a8c26c
									if (!i)
Packit Service a8c26c
										q++;
Packit Service a8c26c
									continue;
Packit Service a8c26c
								case ')':
Packit Service a8c26c
									if (!i && !--q)
Packit Service a8c26c
										break;
Packit Service a8c26c
									continue;
Packit Service a8c26c
								case '"':
Packit Service a8c26c
								case '\'':
Packit Service a8c26c
									if (!i)
Packit Service a8c26c
										i = *(s - 1);
Packit Service a8c26c
									else if (i == *(s - 1))
Packit Service a8c26c
										i = 0;
Packit Service a8c26c
									continue;
Packit Service a8c26c
								case '\\':
Packit Service a8c26c
									if (*s == i && i == '"')
Packit Service a8c26c
										i++;
Packit Service a8c26c
									continue;
Packit Service a8c26c
								case '\n':
Packit Service a8c26c
									input[level].line++;
Packit Service a8c26c
									continue;
Packit Service a8c26c
								default:
Packit Service a8c26c
									continue;
Packit Service a8c26c
								}
Packit Service a8c26c
								break;
Packit Service a8c26c
							}
Packit Service a8c26c
						}
Packit Service a8c26c
						continue;
Packit Service a8c26c
					}
Packit Service a8c26c
					v = s;
Packit Service a8c26c
					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 != ';'))
Packit Service a8c26c
					{
Packit Service a8c26c
						if (c == '\n')
Packit Service a8c26c
							input[level].line++;
Packit Service a8c26c
						s++;
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
				{
Packit Service a8c26c
					h = STYLE;
Packit Service a8c26c
					v = x;
Packit Service a8c26c
				}
Packit Service a8c26c
				if (c == '\n')
Packit Service a8c26c
					input[level].line++;
Packit Service a8c26c
				if (contributor)
Packit Service a8c26c
				{
Packit Service a8c26c
					for (i = 0; i < notice.ids; i++)
Packit Service a8c26c
						if (n == notice.id[i].name.size && !strncmp(x, notice.id[i].name.data, n))
Packit Service a8c26c
							break;
Packit Service a8c26c
					if (i < IDS)
Packit Service a8c26c
					{
Packit Service a8c26c
						notice.id[i].name.data = x;
Packit Service a8c26c
						notice.id[i].name.size = n;
Packit Service a8c26c
						notice.id[i].name.quote = 0;
Packit Service a8c26c
						notice.id[i].value.data = v;
Packit Service a8c26c
						notice.id[i].value.size = s - v;
Packit Service a8c26c
						notice.id[i].value.quote = quote;
Packit Service a8c26c
						if (notice.ids <= i)
Packit Service a8c26c
							notice.ids = i + 1;
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
				else if (h == QUERY)
Packit Service a8c26c
				{
Packit Service a8c26c
					if ((s - v) == 3 && v[0] == 'a' && v[1] == 'l' && v[2] == 'l')
Packit Service a8c26c
					{
Packit Service a8c26c
						for (i = 0; i < ITEMS; i++)
Packit Service a8c26c
							if (notice.item[i].size)
Packit Service a8c26c
							{
Packit Service a8c26c
								expand(&notice, &buf, &key[i]);
Packit Service a8c26c
								PUT(&buf, '=');
Packit Service a8c26c
								for (h = 0;; h++)
Packit Service a8c26c
									if (h >= notice.item[i].size)
Packit Service a8c26c
									{
Packit Service a8c26c
										h = 0;
Packit Service a8c26c
										break;
Packit Service a8c26c
									}
Packit Service a8c26c
									else if (notice.item[i].data[h] == ' ' || notice.item[i].data[h] == '\t')
Packit Service a8c26c
										break;
Packit Service a8c26c
								if (h)
Packit Service a8c26c
									PUT(&buf, '\'');
Packit Service a8c26c
								expand(&notice, &buf, &notice.item[i]);
Packit Service a8c26c
								if (h)
Packit Service a8c26c
									PUT(&buf, '\'');
Packit Service a8c26c
								PUT(&buf, '\n');
Packit Service a8c26c
							}
Packit Service a8c26c
					}
Packit Service a8c26c
					else
Packit Service a8c26c
					{
Packit Service a8c26c
						if ((h = lookup(key, v, s - v)) < 0)
Packit Service a8c26c
						{
Packit Service a8c26c
							item.data = v;
Packit Service a8c26c
							item.size = s - v;
Packit Service a8c26c
							item.quote = 0;
Packit Service a8c26c
							expand(&notice, &buf, &item);
Packit Service a8c26c
						}
Packit Service a8c26c
						else
Packit Service a8c26c
							expand(&notice, &buf, &notice.item[h]);
Packit Service a8c26c
						PUT(&buf, '\n');
Packit Service a8c26c
					}
Packit Service a8c26c
					return END(&buf;;
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
				{
Packit Service a8c26c
					if (h == STYLE)
Packit Service a8c26c
						switch (c = lookup(lic, v, s - v))
Packit Service a8c26c
						{
Packit Service a8c26c
						case NONE:
Packit Service a8c26c
							return 0;
Packit Service a8c26c
						case TEST:
Packit Service a8c26c
							notice.test = 1;
Packit Service a8c26c
							h = -1;
Packit Service a8c26c
							break;
Packit Service a8c26c
						case VERBOSE:
Packit Service a8c26c
							notice.verbose = 1;
Packit Service a8c26c
							h = -1;
Packit Service a8c26c
							break;
Packit Service a8c26c
						case USAGE:
Packit Service a8c26c
							notice.type = c;
Packit Service a8c26c
							h = -1;
Packit Service a8c26c
							break;
Packit Service a8c26c
						case -1:
Packit Service a8c26c
							c = SPECIAL;
Packit Service a8c26c
							/*FALLTHROUGH*/
Packit Service a8c26c
						default:
Packit Service a8c26c
							notice.type = c;
Packit Service a8c26c
							notice.item[CLASS].data = lic[lic[c].quote].data;
Packit Service a8c26c
							notice.item[CLASS].size = lic[lic[c].quote].size;
Packit Service a8c26c
							if (notice.item[STYLE].data != lic[NONE].data)
Packit Service a8c26c
								h = -1;
Packit Service a8c26c
							break;
Packit Service a8c26c
						}
Packit Service a8c26c
					if (h >= 0)
Packit Service a8c26c
					{
Packit Service a8c26c
						notice.item[h].data = (notice.item[h].size = s - v) ? v : (char*)0;
Packit Service a8c26c
						notice.item[h].quote = quote;
Packit Service a8c26c
						k = 1;
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
			}
Packit Service a8c26c
			else
Packit Service a8c26c
			{
Packit Service a8c26c
				if (input[level].file)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&buf, "\"", -1);
Packit Service a8c26c
					copy(&buf, input[level].file, -1);
Packit Service a8c26c
					copy(&buf, "\", line ", -1);
Packit Service a8c26c
					x = &tmpbuf[sizeof(tmpbuf)];
Packit Service a8c26c
					*--x = 0;
Packit Service a8c26c
					n = ++input[level].line;
Packit Service a8c26c
					do *--x = ("0123456789")[n % 10]; while (n /= 10);
Packit Service a8c26c
					copy(&buf, x, -1);
Packit Service a8c26c
					copy(&buf, ": ", -1);
Packit Service a8c26c
				}
Packit Service a8c26c
				copy(&buf, "option error: assignment expected", -1);
Packit Service a8c26c
				PUT(&buf, 0);
Packit Service a8c26c
				return -1;
Packit Service a8c26c
			}
Packit Service a8c26c
			if (*s)
Packit Service a8c26c
				s++;
Packit Service a8c26c
			first = 0;
Packit Service a8c26c
		}
Packit Service a8c26c
		if (!level--)
Packit Service a8c26c
			break;
Packit Service a8c26c
		s = input[level].info;
Packit Service a8c26c
	}
Packit Service a8c26c
	if (!k)
Packit Service a8c26c
		return 0;
Packit Service a8c26c
	if (notice.type == INLINE && (!notice.verbose || !notice.item[NOTICE].data))
Packit Service a8c26c
		return 0;
Packit Service a8c26c
	if (notice.type != USAGE)
Packit Service a8c26c
	{
Packit Service a8c26c
		if (!notice.type)
Packit Service a8c26c
			notice.type = SPECIAL;
Packit Service a8c26c
		comment(&notice, &buf, NiL, 1, 0);
Packit Service a8c26c
		comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		if (notice.item[PACKAGE].data)
Packit Service a8c26c
		{
Packit Service a8c26c
			copy(&tmp, "This software is part of the ", -1);
Packit Service a8c26c
			expand(&notice, &tmp, &notice.item[PACKAGE]);
Packit Service a8c26c
			copy(&tmp, " package", -1);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		if (notice.type >= OPEN)
Packit Service a8c26c
		{
Packit Service a8c26c
			copyright(&notice, &tmp);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.type >= SPECIAL)
Packit Service a8c26c
				COMMENT(&notice, &buf, "All Rights Reserved", 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		if (notice.type == CPL || notice.type == EPL)
Packit Service a8c26c
		{
Packit Service a8c26c
			copy(&tmp, notice.item[PACKAGE].data ? "and" : "This software", -1);
Packit Service a8c26c
			copy(&tmp, " is licensed under the", -1);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.type == EPL)
Packit Service a8c26c
				copy(&tmp, "Eclipse Public License", -1);
Packit Service a8c26c
			else
Packit Service a8c26c
				copy(&tmp, "Common Public License", -1);
Packit Service a8c26c
			if (notice.item[VERSION].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				copy(&tmp, ", Version ", -1);
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[VERSION]);
Packit Service a8c26c
			}
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.item[CORPORATION].data || notice.item[COMPANY].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				copy(&tmp, "by ", -1);
Packit Service a8c26c
				if (notice.item[PARENT].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[PARENT]);
Packit Service a8c26c
					copy(&tmp, " ", -1);
Packit Service a8c26c
				}
Packit Service a8c26c
				if (notice.item[CORPORATION].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[CORPORATION]);
Packit Service a8c26c
					if (notice.item[INCORPORATION].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						copy(&tmp, " ", -1);
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[INCORPORATION]);
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
				else if (notice.item[COMPANY].data)
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "A copy of the License is available at", 0);
Packit Service a8c26c
			if (notice.item[URL].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[URL]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				if (notice.item[URLMD5].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, "(with md5 checksum ", -1);
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[URLMD5]);
Packit Service a8c26c
					copy(&tmp, ")", -1);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				}
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (notice.type == EPL)
Packit Service a8c26c
				COMMENT(&notice, &buf, "http://www.eclipse.org/org/documents/epl-v10.html", 0);
Packit Service a8c26c
			else
Packit Service a8c26c
				COMMENT(&notice, &buf, "http://www.opensource.org/licenses/cpl", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else if (notice.type == OPEN)
Packit Service a8c26c
		{
Packit Service a8c26c
			copy(&tmp, notice.item[PACKAGE].data ? "and it" : "This software", -1);
Packit Service a8c26c
			copy(&tmp, " may only be used by you under license from", -1);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.item[i = CORPORATION].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (notice.item[PARENT].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[i = PARENT]);
Packit Service a8c26c
					copy(&tmp, " ", -1);
Packit Service a8c26c
				}
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[CORPORATION]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (notice.item[i = COMPANY].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (notice.item[PARENT].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[i = PARENT]);
Packit Service a8c26c
					copy(&tmp, " ", -1);
Packit Service a8c26c
				}
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			else
Packit Service a8c26c
				i = -1;
Packit Service a8c26c
			if (notice.item[URL].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				COMMENT(&notice, &buf, "A copy of the Source Code Agreement is available", 0);
Packit Service a8c26c
				copy(&tmp, "at the ", -1);
Packit Service a8c26c
				if (i >= 0)
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
				copy(&tmp, " Internet web site URL", -1);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[URL]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				if (notice.item[URLMD5].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, "(with an md5 checksum of ", -1);
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[URLMD5]);
Packit Service a8c26c
					copy(&tmp, ")", -1);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				}
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			COMMENT(&notice, &buf, "If you have copied or used this software without agreeing", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "to the terms of the license you are infringing on", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "the license and copyright and are violating", 0);
Packit Service a8c26c
			if (i >= 0)
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
			copy(&tmp, "'s", -1);
Packit Service a8c26c
			if (n >= COMLONG)
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			else
Packit Service a8c26c
				PUT(&tmp, ' ');
Packit Service a8c26c
			copy(&tmp, "intellectual property rights.", -1);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else if (notice.type == GPL)
Packit Service a8c26c
		{
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "This is free software; you can redistribute it and/or", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "modify it under the terms of the GNU General Public License", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "as published by the Free Software Foundation;", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "either version 2, or (at your option) any later version.", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "This software is distributed in the hope that it", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "will be useful, but WITHOUT ANY WARRANTY;", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "without even the implied warranty of MERCHANTABILITY", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "or FITNESS FOR A PARTICULAR PURPOSE.", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "See the GNU General Public License for more details.", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "You should have received a copy of the", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "GNU General Public License", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "along with this software (see the file COPYING.)", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "If not, a copy is available at", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "http://www.gnu.org/copyleft/gpl.html", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else if (notice.type == BSD)
Packit Service a8c26c
		{
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "Redistribution and use in source and binary forms, with or", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "without modification, are permitted provided that the following", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "conditions are met:", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "   1. Redistributions of source code must retain the above", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      copyright notice, this list of conditions and the", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      following disclaimer.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "   2. Redistributions in binary form must reproduce the above", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      copyright notice, this list of conditions and the", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      following disclaimer in the documentation and/or other", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      materials provided with the distribution.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			copy(&tmp, "   3. Neither the name of ", -1);
Packit Service a8c26c
			if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data || notice.item[i = COMPANY].data)
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
			else
Packit Service a8c26c
				copy(&tmp, "the copyright holder", -1);
Packit Service a8c26c
			copy(&tmp, " nor the", -1);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      names of its contributors may be used to endorse or", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      promote products derived from this software without", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "      specific prior written permission.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "POSSIBILITY OF SUCH DAMAGE.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else if (notice.type == ZLIB)
Packit Service a8c26c
		{
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "This software is provided 'as-is', without any express or implied", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "warranty. In no event will the authors be held liable for any", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "damages arising from the use of this software.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "Permission is granted to anyone to use this software for any", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "purpose, including commercial applications, and to alter it and", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "redistribute it freely, subject to the following restrictions:", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, " 1. The origin of this software must not be misrepresented;", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    you must not claim that you wrote the original software. If", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    you use this software in a product, an acknowledgment in the", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    product documentation would be appreciated but is not", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    required.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, " 2. Altered source versions must be plainly marked as such,", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    and must not be misrepresented as being the original", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    software.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, " 3. This notice may not be removed or altered from any source", -1);
Packit Service a8c26c
			COMMENT(&notice, &buf, "    distribution.", -1);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else if (notice.type == MIT)
Packit Service a8c26c
		{
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "Permission is hereby granted, free of charge, to any person", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "obtaining a copy of this software and associated", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "documentation files (the \"Software\"), to deal in the", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "Software without restriction, including without limitation", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "the rights to use, copy, modify, merge, publish, distribute,", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "sublicense, and/or sell copies of the Software, and to", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "permit persons to whom the Software is furnished to do so,", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "subject to the following conditions:", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "The above copyright notice and this permission notice shall", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "be included in all copies or substantial portions of the", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "Software.", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE", 0);
Packit Service a8c26c
			COMMENT(&notice, &buf, "SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", 0);
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		else
Packit Service a8c26c
		{
Packit Service a8c26c
			if (notice.type == PROPRIETARY)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data || notice.item[i = COMPANY].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
					copy(&tmp, " - ", -1);
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
					i = -1;
Packit Service a8c26c
				copy(&tmp, "Proprietary", -1);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
				if (notice.item[URL].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, "This is proprietary source code", -1);
Packit Service a8c26c
					if (i >= 0)
Packit Service a8c26c
						copy(&tmp, " licensed by", -1);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
					if (notice.item[PARENT].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[PARENT]);
Packit Service a8c26c
						copy(&tmp, " ", -1);
Packit Service a8c26c
					}
Packit Service a8c26c
					if (notice.item[CORPORATION].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[CORPORATION]);
Packit Service a8c26c
						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
					}
Packit Service a8c26c
					else if (notice.item[COMPANY].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
					}
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, "This is unpublished proprietary source code", -1);
Packit Service a8c26c
					if (i >= 0)
Packit Service a8c26c
						copy(&tmp, " of", -1);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
					if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
					if (notice.item[COMPANY].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						if (SIZ(&tmp))
Packit Service a8c26c
							PUT(&tmp, ' ');
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
					}
Packit Service a8c26c
					if (SIZ(&tmp))
Packit Service a8c26c
						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 1);
Packit Service a8c26c
					COMMENT(&notice, &buf, "and is not to be disclosed or used except in", 1);
Packit Service a8c26c
					COMMENT(&notice, &buf, "accordance with applicable agreements", 1);
Packit Service a8c26c
				}
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (notice.type == NONEXCLUSIVE)
Packit Service a8c26c
			{
Packit Service a8c26c
				COMMENT(&notice, &buf, "For nonexclusive individual use", 1);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (notice.type == NONCOMMERCIAL)
Packit Service a8c26c
			{
Packit Service a8c26c
				COMMENT(&notice, &buf, "For noncommercial use", 1);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			if (notice.type >= PROPRIETARY && !notice.item[URL].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				COMMENT(&notice, &buf, "Unpublished & Not for Publication", 0);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			if (notice.item[URL].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				copy(&tmp, "This software is licensed", -1);
Packit Service a8c26c
				if (notice.item[CORPORATION].data || notice.item[COMPANY].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, " by", -1);
Packit Service a8c26c
					if ((notice.item[PARENT].size + (notice.item[CORPORATION].data ? (notice.item[CORPORATION].size + notice.item[INCORPORATION].size) : notice.item[COMPANY].size)) >= (COMLONG - 6))
Packit Service a8c26c
						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
					else
Packit Service a8c26c
						PUT(&tmp, ' ');
Packit Service a8c26c
					if (notice.item[PARENT].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[PARENT]);
Packit Service a8c26c
						copy(&tmp, " ", -1);
Packit Service a8c26c
					}
Packit Service a8c26c
					if (notice.item[CORPORATION].data)
Packit Service a8c26c
					{
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[CORPORATION]);
Packit Service a8c26c
						if (notice.item[INCORPORATION].data)
Packit Service a8c26c
						{
Packit Service a8c26c
							copy(&tmp, " ", -1);
Packit Service a8c26c
							expand(&notice, &tmp, &notice.item[INCORPORATION]);
Packit Service a8c26c
						}
Packit Service a8c26c
					}
Packit Service a8c26c
					else if (notice.item[COMPANY].data)
Packit Service a8c26c
						expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
				}
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				COMMENT(&notice, &buf, "under the terms and conditions of the license in", 0);
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[URL]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				if (notice.item[URLMD5].data)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&tmp, "(with an md5 checksum of ", -1);
Packit Service a8c26c
					expand(&notice, &tmp, &notice.item[URLMD5]);
Packit Service a8c26c
					copy(&tmp, ")", -1);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				}
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			else if (notice.type == PROPRIETARY)
Packit Service a8c26c
			{
Packit Service a8c26c
				COMMENT(&notice, &buf, "The copyright notice above does not evidence any", 0);
Packit Service a8c26c
				COMMENT(&notice, &buf, "actual or intended publication of such source code", 0);
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
			}
Packit Service a8c26c
		}
Packit Service a8c26c
		if (v = notice.item[NOTICE].data)
Packit Service a8c26c
		{
Packit Service a8c26c
			x = v + notice.item[NOTICE].size;
Packit Service a8c26c
			if (*v == '\n')
Packit Service a8c26c
				v++;
Packit Service a8c26c
			item.quote = notice.item[NOTICE].quote;
Packit Service a8c26c
			do
Packit Service a8c26c
			{
Packit Service a8c26c
				for (item.data = v; v < x && *v != '\n'; v++);
Packit Service a8c26c
				if ((item.size = v - item.data) && *item.data == '\t')
Packit Service a8c26c
				{
Packit Service a8c26c
					item.data++;
Packit Service a8c26c
					item.size--;
Packit Service a8c26c
					h = 0;
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
					h = -1;
Packit Service a8c26c
				expand(&notice, &tmp, &item);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), h);
Packit Service a8c26c
			} while (v++ < x);
Packit Service a8c26c
			if (item.size)
Packit Service a8c26c
				comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
		if (notice.item[ORGANIZATION].data)
Packit Service a8c26c
		{
Packit Service a8c26c
			expand(&notice, &tmp, &notice.item[ORGANIZATION]);
Packit Service a8c26c
			comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.item[i = PARENT].data || notice.item[i = CORPORATION].data)
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[i]);
Packit Service a8c26c
			if (notice.item[COMPANY].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (SIZ(&tmp))
Packit Service a8c26c
					PUT(&tmp, ' ');
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[COMPANY]);
Packit Service a8c26c
			}
Packit Service a8c26c
			if (SIZ(&tmp))
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			if (notice.item[LOCATION].data)
Packit Service a8c26c
			{
Packit Service a8c26c
				expand(&notice, &tmp, &notice.item[LOCATION]);
Packit Service a8c26c
				comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
			}
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
	if (v = notice.item[AUTHOR].data)
Packit Service a8c26c
	{
Packit Service a8c26c
		x = v + notice.item[AUTHOR].size;
Packit Service a8c26c
		q = (x - v) == 1 && (*v == '*' || *v == '-');
Packit Service a8c26c
		k = q && notice.type != USAGE ? -1 : 0;
Packit Service a8c26c
		for (;;)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (!q)
Packit Service a8c26c
			{
Packit Service a8c26c
				while (v < x && (*v == ' ' || *v == '\t' || *v == '\r' || *v == '\n' || *v == ',' || *v == '+'))
Packit Service a8c26c
					v++;
Packit Service a8c26c
				if (v >= x)
Packit Service a8c26c
					break;
Packit Service a8c26c
				item.data = v;
Packit Service a8c26c
				while (v < x && *v != ',' && *v != '+' && *v++ != '>');
Packit Service a8c26c
				item.size = v - item.data;
Packit Service a8c26c
				item.quote = notice.item[AUTHOR].quote;
Packit Service a8c26c
			}
Packit Service a8c26c
			h = 0;
Packit Service a8c26c
			for (i = 0; i < notice.ids; i++)
Packit Service a8c26c
				if (q || item.size == notice.id[i].name.size && !strncmp(item.data, notice.id[i].name.data, item.size))
Packit Service a8c26c
				{
Packit Service a8c26c
					h = 1;
Packit Service a8c26c
					if (notice.type == USAGE)
Packit Service a8c26c
					{
Packit Service a8c26c
						copy(&buf, "[-author?", -1);
Packit Service a8c26c
						expand(&notice, &buf, &notice.id[i].value);
Packit Service a8c26c
						PUT(&buf, ']');
Packit Service a8c26c
					}
Packit Service a8c26c
					else
Packit Service a8c26c
					{
Packit Service a8c26c
						if (k < 0)
Packit Service a8c26c
						{
Packit Service a8c26c
							COMMENT(&notice, &buf, "CONTRIBUTORS", 0);
Packit Service a8c26c
							comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
						}
Packit Service a8c26c
						k = 1;
Packit Service a8c26c
						expand(&notice, &tmp, &notice.id[i].value);
Packit Service a8c26c
						comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
					}
Packit Service a8c26c
					if (!q)
Packit Service a8c26c
						break;
Packit Service a8c26c
				}
Packit Service a8c26c
			if (q)
Packit Service a8c26c
				break;
Packit Service a8c26c
			if (!h)
Packit Service a8c26c
			{
Packit Service a8c26c
				if (notice.type == USAGE)
Packit Service a8c26c
				{
Packit Service a8c26c
					copy(&buf, "[-author?", -1);
Packit Service a8c26c
					expand(&notice, &buf, &item);
Packit Service a8c26c
					PUT(&buf, ']');
Packit Service a8c26c
				}
Packit Service a8c26c
				else
Packit Service a8c26c
				{
Packit Service a8c26c
					if (k < 0)
Packit Service a8c26c
					{
Packit Service a8c26c
						COMMENT(&notice, &buf, "CONTRIBUTORS", 0);
Packit Service a8c26c
						comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
					}
Packit Service a8c26c
					k = 1;
Packit Service a8c26c
					expand(&notice, &tmp, &item);
Packit Service a8c26c
					comment(&notice, &buf, BUF(&tmp), USE(&tmp), 0);
Packit Service a8c26c
				}
Packit Service a8c26c
			}
Packit Service a8c26c
		}
Packit Service a8c26c
		if (k > 0)
Packit Service a8c26c
			comment(&notice, &buf, NiL, 0, 0);
Packit Service a8c26c
	}
Packit Service a8c26c
	if (notice.type == USAGE)
Packit Service a8c26c
	{
Packit Service a8c26c
		copy(&buf, "[-copyright?", -1);
Packit Service a8c26c
		copyright(&notice, &buf;;
Packit Service a8c26c
		PUT(&buf, ']');
Packit Service a8c26c
		if (notice.item[URL].data)
Packit Service a8c26c
		{
Packit Service a8c26c
			copy(&buf, "[-license?", -1);
Packit Service a8c26c
			expand(&notice, &buf, &notice.item[URL]);
Packit Service a8c26c
			PUT(&buf, ']');
Packit Service a8c26c
		}
Packit Service a8c26c
		PUT(&buf, '\n');
Packit Service a8c26c
	}
Packit Service a8c26c
	else
Packit Service a8c26c
		comment(&notice, &buf, NiL, -1, 0);
Packit Service a8c26c
	return END(&buf;;
Packit Service a8c26c
}