# include "refer..c"
# define NFLAB 3000
# define NLABC 1000
# define SIGLEN 400
static char sig[SIGLEN];

static char bflab[NFLAB];
static char *labtab[NLABC];
char *lookat(), *artskp();
static char *lbp = bflab;
static char labc[NLABC];
static char stbuff[50];
static int  prevsig;

putsig (nf, flds, nref, nstline, endline)
	char *flds[], *nstline, *endline;
{
/* choose signal style */
char t[200], t1[200], t2[200], format[10], *sd;
char *fpar();
int another = 0;
int addon, addlet;
char *stline, *pr;
static FILE *fhide = 0;
# if D1
fprintf(stderr, "in putsig, bare %d labels %o nf %d nref %d\n", bare, labels, nf, nref);
# endif
if (labels)
	{
	if (nf==0) /* old */
		sprintf(t, "%s%c", labtab[nref], labc[nref]);
	else
		{
		*t=0;
		if (keywant)
			{
			pr = fpar(nf, flds, t1, keywant, 1, 0);
			if (pr) strcpy(t, pr);
			}
		if (t[0]==0)
			{
			if (labblkflg)
			{
			if (nmlen>0)
			sprintf(format, "%%.%ds%s%%s", nmlen, labblkflg);
			else
			sprintf(format, "%%s%s%%s", labblkflg);
			}
			else
			sprintf(format, nmlen>0 ? "%%.%ds%%s" : "%%s%%s", nmlen);
# if D1
			fprintf(stderr, "format is /%s/\n", format);
# endif
			/* format is %s%s for default labels or %.3s%s eg if wanted */
			sd = fpar(nf, flds, t2, 'D', 1, 0);
			if (sd==NULL) sd = "";
			if (dtlen>0)
				{
				char *sdb;
				for(sdb=sd; *sd; sd++);
				sd = sd-dtlen;
				if (sd<sdb) sd=sdb;
				}
			sprintf(t, format, fpar(nf, flds, t1, 'A', 1, 0), sd);
# if D1
			fprintf(stderr, "tag is /%s/\n",t);
# endif
			}
		if (keywant)
			{
			addon=0;
			for(sd=t; *sd; sd++);
			if (*--sd == '-')
				{
				addon=1;
				*sd=0;
				}
			}
		addlet = keylet(t, nref);
		if (!keywant || addon)
			addch( t, addlet);
		}
	if (sort)
		sprintf(t, "%c%d%c", FLAG, nref, FLAG);
	}
else 
	{
	if (sort)
		sprintf(t, "%c%d%c", FLAG, nref, FLAG);
	else
		sprintf(t, "%d", nref);
	}
another = prefix (".[", sd=lookat());
# if D1
fprintf(stderr, "t leng %d another %d\n",strlen(t), another);
# endif
if (another && (strcmp(".[\n", sd) != SAME))
	fprintf(stderr, "File %s, line %d- punctuation ignored from: %s", Ifile, Iline, sd);
if (bare==0)
strcat (sig, t);
# if D1
fprintf(stderr, "past strcat\n");
# endif
if (strlen(sig) >SIGLEN)
	err("signal length exceeds %d chars", SIGLEN);
# if D1
fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
# endif
trimnl(nstline);
trimnl(endline);
stline=stbuff;
if (prevsig==0)
	{
	strcpy (stline, nstline);
	prevsig=1;
	}
if (stline[2] || endline[2])
	{
	stline += 2;
	endline += 2;
	}
else
	{
	stline  = "\\*([.";
	endline = "\\*(.]";
	}
# if D1
fprintf(stderr, "bare %d fhide %o fo %o another %d\n",bare, fhide, fo, another);
# endif
if (bare==0)
	{
	if (another==0)
		{
		sprintf(t1, "%s%s\%s\n", stline, sig, endline);
		append(t1);
		flout();
		sig[0]=0;
		prevsig=0;
		if (fo != NULL && fo == fhide)
			{
			int ch;
# if D1
fprintf(stderr, "more hiding\n");
# endif
			fclose(fhide); fhide= fopen(hidenam, "r");
			fo= ftemp;
			while ((ch = getc(fhide)) != EOF)
				putc(ch, fo);
			fclose(fhide);
			unlink(hidenam);
# if D1
fprintf(stderr, "past this stuff\n");
# endif
			}
		}
	else
		{
		if (labsepstr)
			strcat(sig, labsepstr);
		else
		strcat (sig, (labels ? ", " : ",\\|"));
		/* hide if need be */
		if (fo == ftemp)
			{
			sprintf(hidenam, "/tmp/rj%dc", getpid());
# if D1
fprintf(stderr, "hiding in %s\n", hidenam);
# endif
			fhide= fopen(hidenam, "w");
			if (fhide==NULL) err("Can't get scratch file %s", hidenam);
			fo = fhide;
			}
		}
	}
if (bare<2)
	if (nf>0)
		{
		fprintf(fo, ".ds [F %s%c", t, sep);
		biglab(t);
		}
if (bare>0)
	flout();
# if D1
fprintf(stderr, "sig is now %s\n",sig);
# endif
}
char *
fpar (nf, flds, out, c, seq, prepend)
	char *flds[], *out;
{
char *p, *s;
int i, fnd = 0;
for(i=0; i<nf; i++)
	if (control(flds[i][0]) &&flds[i][1]==c && ++fnd >= seq)
		{
		if (c== 'L')
			{
			p = flds[i]+3;
			strcpy(out, p);
			return(out);
			}
		if (c!= 'A' && c != 'D') /* if not author, date use first word */
			{
			p=flds[i]+3;
			p = artskp (p);
			mycpy2(out, p, 20);
			return(out);
			}
		if (c=='A' && lfirst(p=flds[i]+3)) /* author in style Jones, A. */
			{
			for(s=out; *p!=','; p++)
				*s++ = *p;
			*s++ = 0;
			if (prepend)
				{
				while (isspace(*p))p++;
				*s++ = *p;
				*s=0;
				}
			return(out);
			}
		for(s=p= flds[i]+2; *p; p++);
		while (p>s && *p != ' ') p--;
		/* special wart for authors */
		if (c=='A' && (p[-1] == ',' || p[1] =='('))
			{
			p--;
			while (p>s && *p != ' ') p--;
			mycpy (out, p+1);
			}
		else
			strcpy (out, p+1);
		if (c=='A' && prepend)
			initadd(out, flds[i]+2, p);
		return(out);
		}
return(0);
}
putkey(nf, flds, nref, keystr)
	char *flds[], *keystr;
{
char t1[50], *sf;
int ctype, i, count;
# if D1
int klim=0;
fprintf(stderr, "in putkey, nf %d nref %d keystr %.20s\n",nf, nref, keystr);
# endif
# if D5
return;
# endif
fprintf(fo, ".\\\"");
if (nf <= 0)
	fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
else
	{
	while (ctype= *keystr++)
		{
# if D1
		if (++klim>100) err("keystring ridiculous", 0);
# endif
		count = atoi(keystr);
		if (*keystr=='+') count=999;
		if (count<=0) count=1;
		for(i=1; i<=count; i++)
			{
			sf= fpar(nf, flds, t1, ctype, i, 1);
			if (sf==0)
				break;
			sf = artskp(sf);
			fprintf(fo, "%s%c", sf, '-');
			}
		}
	fprintf(fo, "%d%c", nref, sep);
	}
# if D1
fprintf(stderr, "returning from putkey\n");
# endif
}
keylet(t, nref)
	char *t;
{
int i;
int x = 'a'-1;
for(i=1; i<nref;i++)
	{
	if (strcmp(labtab[i], t) == 0)
		x = labc[i];
	}
strcpy(labtab[nref]=lbp, t);
while (*lbp++);
if (lbp-bflab >NFLAB)
	err("bflab overflow (%d)", NFLAB);
if (nref >NLABC)
	err ("nref in labc overflow (%d)", NLABC);
# ifdef D1
fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab);
# endif
return (labc[nref] = x+1);
}
mycpy(s,t)
	char *s, *t;
{
while (*t && *t != ',' && *t != ' ')
	*s++ = *t++;
*s=0;
}
mycpy2 (s, t, n)
	char *s, *t;
{
int c;
while (n-- && (c= *t++)>0)
	{
	if (c==' ')c= '-';
	*s++ = c;
	}
*s=0;
}
initadd(to, from, stop)
	char *to, *from, *stop;
{
	int c, nalph= 1;
while (*to) to++;
while (from<stop)
	{
	c = *from++;
	if (!isalpha(c))
		{
		if (nalph)
			*to++ = '.';
		nalph=0;
		continue;
		}
	if (nalph++ ==0)
		*to++ = c;
	}
*to=0;
}

static char *articles[] ={"the ", "an ", "a ", 0};
char *
artskp(s)
	char *s;
{
/* skips over initial "a ", "an ", or "the " in s */
	char **p, *r1, *r2;
for(p=articles; *p; p++)
	{
	r2 = s;
	for (r1= *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
		r2++;
	if (*r1==0 && *r2 != 0)
		return(r2);
	}
return(s);
}
expkey (or, nr, fwrite)
	FILE *fwrite;
{
int uniq, less, i;
char *s, temp[100];
# if D1
fprintf(stderr, "old %d key %s: '%c' new %d\n",or, labtab[or],labc[or],nr);
# endif
/* is this unique? how many are before it ? */
uniq=1; less= 'a';
s = labtab[or];
for(i=0; i <= refnum; i++)
	{
	if (i==or) continue;
	if (strcmp(labtab[i], s)!=SAME)
		continue;
	uniq=0;
	if (newr[i] != 0 && newr[i] < nr)
		less++;
	}
if (uniq)
	sprintf(temp, "%s", s);
else
	sprintf(temp,"%s%c", s, less);
biglab(temp);
fprintf(fwrite, "%s", temp);
}
lfirst(s)
	char *s;
{
/* decides if s is name of format Jones, A */
char *strchr(), *p;
p = strchr(s, ',');
if (p==NULL) return(0);
while (isspace(*++p)) ;
if (strncmp(p, "Jr", 2)==0)
	return(0);
if (strncmp(p, "II", 2)==0)
	return(0);
if (isupper(*p))
	return(1);
return(0);
}

static char longlab[100]="";
biglab(s)
	char *s;
{
if (strlen(s)>strlen(longlab))
	strcpy(longlab, s);
}

widelab()
{
printf(".nr [W \\w'%s'\n", longlab);
}
