# include "refer.h"
# include "error.h"
# define NFLAB 3000
# define NLABC 1000
#if SMALL
# define SIGLEN 400
#else
# define SIGLEN 2000
#endif
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;
void putsig(int nf, char *flds[], int nref, char *nstline, char *endline)
{
/* choose signal style */
char t[200], t1[200], t2[200], format[10], *sd;
int another;
int addon = 0, 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 != INF_LENGTH)
sprintf(format, "%%.%ds%s%%s", nmlen, labblkflg);
else
sprintf(format, "%%s%s%%s", labblkflg);
} else
sprintf(format, (nmlen == INF_LENGTH) ? "%%s%%s" : "%%.%ds%%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 != INF_LENGTH) {
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 = (sd = lookat()) != NULL && prefix (".[", sd);
# 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 = efopen(hidenam, "r");
fo = ftemp;
while ((ch = getc(fhide)) != EOF)
putc(ch, fo);
fclose(fhide);
remove(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 = efopen(hidenam, "w");
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(int nf, char *flds[], char *out, int c, int seq, int prepend)
{
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 != 'E' && c != 'D') /* if not author, editor, date use first word */ {
p = flds[i] + 3;
p = artskp (p);
mycpy2(out, p, 20);
return out;
}
if ((c == 'A' || c == 'E') && lfirst(p = flds[i] + 3)) /* author/editor 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/editors */
if ((c == 'A' || c == 'E') && (p[-1] == ',' || p[1] == '(')) {
p--;
while (p > s && *p != ' ')
p--;
mycpy (out, p + 1);
} else
strcpy (out, p + 1);
if ((c == 'A' || c == 'E') && prepend)
initadd(out, flds[i] + 2, p);
return out;
}
return 0;
}
void putkey(int nf, char *flds[], int nref, char *keystr)
{
char t1[50], *sf;
int ctype, i, count, hit, ed = 0;
# 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 (; ; ) {
hit = 0;
for (i = 1; i <= count; i++) {
sf = fpar(nf, flds, t1, ctype, i, 1);
if (sf == 0)
break;
hit++;
sf = artskp(sf);
fprintf(fo, "%s%c", sf, '-');
}
if (ctype != 'A' || hit)
break;
ed++;
ctype = 'E';
}
}
fprintf(fo, "%s-%c%d%c", ed ? "ed." : "", hsep, nref, sep);
}
# if D1
fprintf(stderr, "returning from putkey\n");
#endif
}
int keylet(char *t, int nref)
{
int i;
int x = 'a' - 1;
for (i = 1; i < nref; i++) {
if (strcmp(labtab[i], t) == 0)
x = labc[i];
}
if ((lbp - bflab)+strlen(t)+1 >= NFLAB)
errline("bflab overflow (%d); %.20s...", Iline, NFLAB, t);
if (nref >= NLABC)
err ("nref in labc overflow (%d)", NLABC);
strcpy(labtab[nref] = lbp, t);
while (*lbp++)
;
#if D1
fprintf(stderr, "lbp up to %d of 2000\n", lbp - bflab);
#endif
return labc[nref] = x + 1;
}
void mycpy(char *s, char *t)
{
while (*t && *t != ',' && *t != ' ')
*s++ = *t++;
*s = 0;
}
void mycpy2(char *s, char *t, int n)
{
int c;
while (n-- && (c = *t++) > 0) {
if (c == ' ')
c = '-';
*s++ = c;
}
*s = 0;
}
void initadd(char *to, char *from, char *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(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;
}
void expkey(int or, int nr, FILE *fout)
{
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 = 1; 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);
/* order = -R flag and is for wierdo reference lableling */
if (order)
fprintf(fout, "%d", nr);
else
fprintf(fout, "%s", temp);
}
int lfirst(char *s)
{
/* decides if s is name of format Jones, A */
char *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] = "";
void biglab(char *s)
{
if (strlen(s) > strlen(longlab))
strcpy(longlab, s);
}
void widelab(void)
{
/* order = -R flag and is for wierdo reference lableling */
if (order)
printf(".nr [W \\w'1.'\n");
else
printf(".nr [W \\w'%s'\n", longlab);
}
|