xref: /csrg-svn/contrib/bib/src/bibargs.c (revision 12910)
1*12910Sgarrison /*
2*12910Sgarrison         read argument strings for bib and listrefs
3*12910Sgarrison         do name formatting, printing lines, other actions common to both
4*12910Sgarrison                                                         */
5*12910Sgarrison # include <stdio.h>
6*12910Sgarrison # include <ctype.h>
7*12910Sgarrison # include "bib.h"
8*12910Sgarrison # define LINELENGTH 1024
9*12910Sgarrison # define MAXDEFS     500             /* maximum number of defined words */
10*12910Sgarrison 
11*12910Sgarrison /* global variables */
12*12910Sgarrison    int  abbrev       = false;   /* automatically abbreviate names            */
13*12910Sgarrison    int  capsmcap     = false;   /* print names in caps small caps (CACM form)*/
14*12910Sgarrison    int  numrev       = 0;       /* number of authors names to reverse        */
15*12910Sgarrison    int  edabbrev     = false;   /* abbreviate editors names ?                */
16*12910Sgarrison    int  edcapsmcap   = false;   /* print editors in cap small caps           */
17*12910Sgarrison    int  ednumrev     = 0;       /* number of editors to reverse              */
18*12910Sgarrison    int  sort         = false;   /* sort references ? (default no)            */
19*12910Sgarrison    int  foot         = false;   /* footnoted references ? (default endnotes) */
20*12910Sgarrison    int  hyphen       = false;   /* hypenate contiguous references            */
21*12910Sgarrison    int  ordcite      = true;    /* order multiple citations                  */
22*12910Sgarrison    char sortstr[80]  = "1";     /* sorting template                          */
23*12910Sgarrison    char trailstr[80] = "";      /* trailing characters to output             */
24*12910Sgarrison    char pfile[120];             /* private file name                         */
25*12910Sgarrison    int  personal = false;       /* personal file given ? (default no)        */
26*12910Sgarrison    char citetemplate[80] = "1"; /* citation template                         */
27*12910Sgarrison    char *words[MAXDEFS];        /* defined words                             */
28*12910Sgarrison    char *defs[MAXDEFS];         /* defined word definitions                  */
29*12910Sgarrison    int  wordtop = -1;           /* top of defined words array                */
30*12910Sgarrison 
31*12910Sgarrison /* where output goes */
32*12910Sgarrison    extern FILE *tfd;
33*12910Sgarrison 
34*12910Sgarrison /* doargs - read command argument line for both bib and listrefs
35*12910Sgarrison             set switch values
36*12910Sgarrison             call rdtext on file arguments, after dumping
37*12910Sgarrison             default style file if no alternative style is given
38*12910Sgarrison */
39*12910Sgarrison    int doargs(argc, argv, defstyle)
40*12910Sgarrison    int argc;
41*12910Sgarrison    char **argv, defstyle[];
42*12910Sgarrison {  int numfiles, i, style;
43*12910Sgarrison    char *p, *q, *walloc();
44*12910Sgarrison    FILE *fd;
45*12910Sgarrison 
46*12910Sgarrison    numfiles = 0;
47*12910Sgarrison    style = true;
48*12910Sgarrison    words[0] = walloc("BMACLIB");
49*12910Sgarrison    defs[0]  = walloc(BMACLIB);
50*12910Sgarrison    wordtop++;
51*12910Sgarrison    fputs(".ds l] ",tfd);
52*12910Sgarrison    fputs(BMACLIB, tfd);
53*12910Sgarrison    fputs("\n", tfd);
54*12910Sgarrison 
55*12910Sgarrison    for (i = 1; i < argc; i++)
56*12910Sgarrison       if (argv[i][0] == '-')
57*12910Sgarrison          switch(argv[i][1]) {
58*12910Sgarrison 
59*12910Sgarrison             case 'a':  abbrev = true;
60*12910Sgarrison                        break;
61*12910Sgarrison 
62*12910Sgarrison             case 'c':  if (argv[i][2] == 0)
63*12910Sgarrison                           error("citation string expected");
64*12910Sgarrison                        else
65*12910Sgarrison                           for (p = citetemplate,q = &argv[i][2]; *p++ = *q++; );
66*12910Sgarrison                        break;
67*12910Sgarrison 
68*12910Sgarrison             case 'e':  for (p = &argv[i][2]; *p; p++)
69*12910Sgarrison                           if (*p == 'a')
70*12910Sgarrison                              edabbrev = true;
71*12910Sgarrison                            else if (*p == 'x')
72*12910Sgarrison                              edcapsmcap = true;
73*12910Sgarrison                            else if (*p == 'r') {
74*12910Sgarrison                              if (*(p+1))
75*12910Sgarrison                                 ednumrev = atoi(p+1);
76*12910Sgarrison                               else
77*12910Sgarrison                                 ednumrev = 1000;
78*12910Sgarrison                               break;
79*12910Sgarrison                               }
80*12910Sgarrison                        break;
81*12910Sgarrison 
82*12910Sgarrison             case 'f':  foot = true;
83*12910Sgarrison                        hyphen = false;
84*12910Sgarrison                        break;
85*12910Sgarrison 
86*12910Sgarrison             case 'h':  hyphen = ordcite = true;
87*12910Sgarrison                        break;
88*12910Sgarrison 
89*12910Sgarrison             case 'n':  for (p = &argv[i][2]; *p; p++)
90*12910Sgarrison                           if (*p == 'a')
91*12910Sgarrison                              abbrev = false;
92*12910Sgarrison                           else if (*p == 'f')
93*12910Sgarrison                              foot = false;
94*12910Sgarrison                           else if (*p == 'h')
95*12910Sgarrison                              hyphen = false;
96*12910Sgarrison                           else if (*p == 'o')
97*12910Sgarrison                              ordcite = false;
98*12910Sgarrison                           else if (*p == 'r')
99*12910Sgarrison                              numrev = 0;
100*12910Sgarrison                           else if (*p == 's')
101*12910Sgarrison                              sort = false;
102*12910Sgarrison                           else if (*p == 'x')
103*12910Sgarrison                              capsmcap = false;
104*12910Sgarrison                        break;
105*12910Sgarrison 
106*12910Sgarrison             case 'o':  ordcite = true;
107*12910Sgarrison                        break;
108*12910Sgarrison 
109*12910Sgarrison             case 'p':  if (argv[i][2])
110*12910Sgarrison                           p = &argv[i][2];
111*12910Sgarrison                        else {  /* take next arg */
112*12910Sgarrison                           i++;
113*12910Sgarrison                           p = argv[i];
114*12910Sgarrison                           }
115*12910Sgarrison                        strcpy(pfile, p);
116*12910Sgarrison                        personal = true;
117*12910Sgarrison                        break;
118*12910Sgarrison 
119*12910Sgarrison             case 'r':  if (argv[i][2] == 0)
120*12910Sgarrison                           numrev = 1000;
121*12910Sgarrison                        else
122*12910Sgarrison                           numrev = atoi(&argv[i][2]);
123*12910Sgarrison                        break;
124*12910Sgarrison 
125*12910Sgarrison             case 's':  sort = true;
126*12910Sgarrison                        if (argv[i][2])
127*12910Sgarrison                           for (p = sortstr,q = &argv[i][2]; *p++ = *q++; );
128*12910Sgarrison                        break;
129*12910Sgarrison 
130*12910Sgarrison             case 'i':
131*12910Sgarrison             case 't':  if (argv[i][1] == 't')
132*12910Sgarrison                           style = false;
133*12910Sgarrison                        if (argv[i][2])
134*12910Sgarrison                           p = &argv[i][2];
135*12910Sgarrison                        else { /* take next arg */
136*12910Sgarrison                           i++;
137*12910Sgarrison                           p = argv[i];
138*12910Sgarrison                           }
139*12910Sgarrison                        incfile(p);
140*12910Sgarrison                        break;
141*12910Sgarrison 
142*12910Sgarrison             case 'x':  capsmcap = true;
143*12910Sgarrison                        break;
144*12910Sgarrison 
145*12910Sgarrison             case 0:    if (style) {  /* no style command given, take default */
146*12910Sgarrison                           style = false;
147*12910Sgarrison                           incfile( defstyle );
148*12910Sgarrison                           }
149*12910Sgarrison                        rdtext(stdin);
150*12910Sgarrison                        numfiles++;
151*12910Sgarrison                        break;
152*12910Sgarrison 
153*12910Sgarrison             default:   fputs(argv[i], stderr);
154*12910Sgarrison                        error(": invalid switch");
155*12910Sgarrison             }
156*12910Sgarrison       else { /* file name */
157*12910Sgarrison          numfiles++;
158*12910Sgarrison          if (style) {
159*12910Sgarrison             style = false;
160*12910Sgarrison             incfile( defstyle );
161*12910Sgarrison             }
162*12910Sgarrison          fd = fopen(argv[i], "r");
163*12910Sgarrison          if (fd == NULL) {
164*12910Sgarrison             fputs(argv[i], stderr);
165*12910Sgarrison             error(": can't open");
166*12910Sgarrison             }
167*12910Sgarrison          else {
168*12910Sgarrison             rdtext(fd);
169*12910Sgarrison             fclose(fd);
170*12910Sgarrison             }
171*12910Sgarrison          }
172*12910Sgarrison 
173*12910Sgarrison    if (style) incfile( defstyle );
174*12910Sgarrison    return(numfiles);
175*12910Sgarrison 
176*12910Sgarrison }
177*12910Sgarrison 
178*12910Sgarrison /* incfile - read in an included file  */
179*12910Sgarrison incfile(np)
180*12910Sgarrison    char *np;
181*12910Sgarrison {  char name[120];
182*12910Sgarrison    FILE *fd;
183*12910Sgarrison 
184*12910Sgarrison    fd = fopen(np, "r");
185*12910Sgarrison    if (fd == NULL && *np != '/') {
186*12910Sgarrison       strcpy(name, "bib.");
187*12910Sgarrison       strcat(name, np);
188*12910Sgarrison       fd = fopen(name, "r");
189*12910Sgarrison       }
190*12910Sgarrison    if (fd == NULL && *np != '/') {
191*12910Sgarrison       strcpy(name,BMACLIB);
192*12910Sgarrison       strcat(name, "/bib.");
193*12910Sgarrison       strcat(name, np);
194*12910Sgarrison       fd = fopen(name, "r");
195*12910Sgarrison       }
196*12910Sgarrison    if (fd == NULL) {
197*12910Sgarrison       fprintf(stderr,"%s", np);
198*12910Sgarrison       error(": can't open");
199*12910Sgarrison       }
200*12910Sgarrison    setswitch(fd);
201*12910Sgarrison    fclose(fd);
202*12910Sgarrison }
203*12910Sgarrison 
204*12910Sgarrison /* error - report unrecoverable error message */
205*12910Sgarrison   error(str)
206*12910Sgarrison   char str[];
207*12910Sgarrison {
208*12910Sgarrison   fputs(str, stderr);
209*12910Sgarrison   putc('\n', stderr);
210*12910Sgarrison   exit(1);
211*12910Sgarrison }
212*12910Sgarrison 
213*12910Sgarrison /* tfgets - fgets which trims off newline */
214*12910Sgarrison    char *tfgets(line, n, ptr)
215*12910Sgarrison    char line[];
216*12910Sgarrison    int  n;
217*12910Sgarrison    FILE *ptr;
218*12910Sgarrison {  char *p;
219*12910Sgarrison 
220*12910Sgarrison    p = fgets(line, n, ptr);
221*12910Sgarrison    if (p == NULL)
222*12910Sgarrison       return(NULL);
223*12910Sgarrison    else
224*12910Sgarrison       for (p = line; *p; p++)
225*12910Sgarrison          if (*p == '\n')
226*12910Sgarrison             *p = 0;
227*12910Sgarrison    return(line);
228*12910Sgarrison }
229*12910Sgarrison 
230*12910Sgarrison /* getwrd - place next word from in[i] into out */
231*12910Sgarrison int getwrd(in, i, out)
232*12910Sgarrison    char in[], out[];
233*12910Sgarrison    int i;
234*12910Sgarrison {  int j;
235*12910Sgarrison 
236*12910Sgarrison    j = 0;
237*12910Sgarrison    while (in[i] == ' ' || in[i] == '\n' || in[i] == '\t')
238*12910Sgarrison       i++;
239*12910Sgarrison    if (in[i])
240*12910Sgarrison       while (in[i] && in[i] != ' ' && in[i] != '\t' && in[i] != '\n')
241*12910Sgarrison          out[j++] = in[i++];
242*12910Sgarrison    else
243*12910Sgarrison       i = 0;    /* signals end of in[i..]   */
244*12910Sgarrison    out[j] = 0;
245*12910Sgarrison    return (i);
246*12910Sgarrison }
247*12910Sgarrison 
248*12910Sgarrison /* walloc - allocate enough space for a word */
249*12910Sgarrison char *walloc(word)
250*12910Sgarrison    char *word;
251*12910Sgarrison {  char *i, *malloc();
252*12910Sgarrison    i = malloc(1 + strlen(word));
253*12910Sgarrison    if (i == NULL)
254*12910Sgarrison       error("out of storage");
255*12910Sgarrison    strcpy(i, word);
256*12910Sgarrison    return(i);
257*12910Sgarrison }
258*12910Sgarrison 
259*12910Sgarrison /* setswitch - set document switch settings from format file */
260*12910Sgarrison    setswitch(fp)
261*12910Sgarrison    FILE *fp;
262*12910Sgarrison {  char *p, line[LINELENGTH], dline[LINELENGTH], word[80];
263*12910Sgarrison    int  i, j, getwrd();
264*12910Sgarrison 
265*12910Sgarrison    while (tfgets(line, LINELENGTH, fp) != NULL)
266*12910Sgarrison       switch(line[0]) {
267*12910Sgarrison 
268*12910Sgarrison          case '#': break;
269*12910Sgarrison 
270*12910Sgarrison          case 'A': abbrev = true;
271*12910Sgarrison                    break;
272*12910Sgarrison 
273*12910Sgarrison          case 'C': for (p = &line[1]; *p == ' '; p++) ;
274*12910Sgarrison                    strcpy(citetemplate, p);
275*12910Sgarrison                    break;
276*12910Sgarrison 
277*12910Sgarrison          case 'D': if ((i = getwrd(line, 1, word)) == 0)
278*12910Sgarrison                       error("word expected in definition");
279*12910Sgarrison                    for (j = 0; j <= wordtop; j++)
280*12910Sgarrison                       if (strcmp(word, words[j]) == 0)
281*12910Sgarrison                          break;
282*12910Sgarrison                    if (j > wordtop) {
283*12910Sgarrison                       if ((j = ++wordtop) > MAXDEFS)
284*12910Sgarrison                          error("too many defintions");
285*12910Sgarrison                       words[wordtop] = walloc(word);
286*12910Sgarrison                       }
287*12910Sgarrison                    for (p = &line[i]; *p == ' '; p++) ;
288*12910Sgarrison                    for (strcpy(dline, p); dline[strlen(dline)-1] == '\\'; ){
289*12910Sgarrison                        dline[strlen(dline)-1] = '\n';
290*12910Sgarrison                        if (tfgets(line, LINELENGTH, fp) == NULL) break;
291*12910Sgarrison                        strcat(dline, line);
292*12910Sgarrison                        }
293*12910Sgarrison                    defs[j] = walloc(dline);
294*12910Sgarrison                    break;
295*12910Sgarrison 
296*12910Sgarrison          case 'E': for (p = &line[1]; *p; p++)
297*12910Sgarrison                       if (*p == 'A')
298*12910Sgarrison                          edabbrev = true;
299*12910Sgarrison                       else if (*p == 'X')
300*12910Sgarrison                          edcapsmcap = true;
301*12910Sgarrison                       else if (*p == 'R') {
302*12910Sgarrison                          if (*(p+1))
303*12910Sgarrison                             ednumrev = atoi(p+1);
304*12910Sgarrison                          else
305*12910Sgarrison                             ednumrev = 1000;
306*12910Sgarrison                          break;
307*12910Sgarrison                          }
308*12910Sgarrison                    break;
309*12910Sgarrison 
310*12910Sgarrison          case 'F': foot = true;
311*12910Sgarrison                    hyphen = false;
312*12910Sgarrison                    break;
313*12910Sgarrison 
314*12910Sgarrison          case 'I': for (p = &line[1]; *p == ' '; p++);
315*12910Sgarrison                    expand(p);
316*12910Sgarrison                    incfile(p);
317*12910Sgarrison                    break;
318*12910Sgarrison 
319*12910Sgarrison          case 'H': hyphen = ordcite = true;
320*12910Sgarrison                    break;
321*12910Sgarrison 
322*12910Sgarrison          case 'O': ordcite = true;
323*12910Sgarrison                    break;
324*12910Sgarrison 
325*12910Sgarrison          case 'R': if (line[1] == 0)
326*12910Sgarrison                       numrev = 1000;
327*12910Sgarrison                    else
328*12910Sgarrison                       numrev = atoi(&line[1]);
329*12910Sgarrison                    break;
330*12910Sgarrison 
331*12910Sgarrison          case 'S': sort = true;
332*12910Sgarrison                    for (p = &line[1]; *p == ' '; p++) ;
333*12910Sgarrison                    strcpy(sortstr, p);
334*12910Sgarrison                    break;
335*12910Sgarrison 
336*12910Sgarrison          case 'T': for (p = &line[1]; *p == ' '; p++) ;
337*12910Sgarrison                    strcpy(trailstr, p);
338*12910Sgarrison                    break;
339*12910Sgarrison 
340*12910Sgarrison          case 'X': capsmcap = true;
341*12910Sgarrison                    break;
342*12910Sgarrison 
343*12910Sgarrison          default:  fprintf(tfd,"%s\n",line);
344*12910Sgarrison                    while (fgets(line, LINELENGTH, fp) != NULL)
345*12910Sgarrison                       fputs(line, tfd);
346*12910Sgarrison                    return;
347*12910Sgarrison          }
348*12910Sgarrison    return;
349*12910Sgarrison }
350*12910Sgarrison 
351*12910Sgarrison /* isword - see if character is legit word char */
352*12910Sgarrison int iswordc(c)
353*12910Sgarrison char c;
354*12910Sgarrison {
355*12910Sgarrison    if (isalnum(c) || c == '&' || c == '_')
356*12910Sgarrison       return(true);
357*12910Sgarrison    return(false);
358*12910Sgarrison }
359*12910Sgarrison 
360*12910Sgarrison /* expand - expand reference, replacing defined words */
361*12910Sgarrison    expand(line)
362*12910Sgarrison    char *line;
363*12910Sgarrison {  char line2[REFSIZE], word[LINELENGTH], *p, *q, *w;
364*12910Sgarrison    int  replaced, i;
365*12910Sgarrison 
366*12910Sgarrison    replaced  = true;
367*12910Sgarrison    while (replaced) {
368*12910Sgarrison       replaced = false;
369*12910Sgarrison       p = line;
370*12910Sgarrison       q = line2;
371*12910Sgarrison       while (*p) {
372*12910Sgarrison          if (isalnum(*p)) {
373*12910Sgarrison             for (w = word; *p && iswordc(*p); )
374*12910Sgarrison                *w++ = *p++;
375*12910Sgarrison             *w = 0;
376*12910Sgarrison             for (i = 0; i <= wordtop; i++)
377*12910Sgarrison                if (strcmp(word, words[i]) == 0) {
378*12910Sgarrison                   strcpy(word, defs[i]);
379*12910Sgarrison                   replaced = true;
380*12910Sgarrison                   break;
381*12910Sgarrison                   }
382*12910Sgarrison             for (w = word; *w; )
383*12910Sgarrison                *q++ = *w++;
384*12910Sgarrison             }
385*12910Sgarrison          else
386*12910Sgarrison             *q++ = *p++;
387*12910Sgarrison          }
388*12910Sgarrison       *q = 0;
389*12910Sgarrison       p = line;
390*12910Sgarrison       q = line2;
391*12910Sgarrison       while (*p++ = *q++);
392*12910Sgarrison       }
393*12910Sgarrison }
394*12910Sgarrison 
395*12910Sgarrison /* breakname - break a name into first and last name */
396*12910Sgarrison    breakname(line, first, last)
397*12910Sgarrison    char line[], first[], last[];
398*12910Sgarrison {  char *p, *q, *r, *t, *f;
399*12910Sgarrison 
400*12910Sgarrison    for (t = line; *t != '\n'; t++);
401*12910Sgarrison    for (t--; isspace(*t); t--);
402*12910Sgarrison 
403*12910Sgarrison    /* now strip off last name */
404*12910Sgarrison    for (q = t; isspace(*q) == 0 || ((*q == ' ') & (*(q-1) == '\\')); q--)
405*12910Sgarrison       if (q == line)
406*12910Sgarrison          break;
407*12910Sgarrison    f = q;
408*12910Sgarrison    if (q != line)
409*12910Sgarrison       q++;
410*12910Sgarrison 
411*12910Sgarrison    for (; isspace(*f); f--);
412*12910Sgarrison 
413*12910Sgarrison    /* first name is start to f, last name is q to t */
414*12910Sgarrison 
415*12910Sgarrison    for (r = first, p = line, f++; p != f; )
416*12910Sgarrison       *r++ = *p++;
417*12910Sgarrison    *r = 0;
418*12910Sgarrison    for (r = last, p = q, t++; q != t; )
419*12910Sgarrison       *r++ = *q++;
420*12910Sgarrison    *r = 0;
421*12910Sgarrison }
422*12910Sgarrison 
423*12910Sgarrison /* match - see if string1 is a substring of string2 (case independent)*/
424*12910Sgarrison    int match(str1, str2)
425*12910Sgarrison    char str1[], str2[];
426*12910Sgarrison {  int  i, j;
427*12910Sgarrison    char a, b;
428*12910Sgarrison 
429*12910Sgarrison    for (i = 0; str2[i]; i++) {
430*12910Sgarrison       for (j = 0; str1[j]; j++) {
431*12910Sgarrison          if (isupper(a = str2[i+j]))
432*12910Sgarrison             a = (a - 'A') + 'a';
433*12910Sgarrison          if (isupper(b = str1[j]))
434*12910Sgarrison             b = (b - 'A') + 'a';
435*12910Sgarrison          if (a != b)
436*12910Sgarrison             break;
437*12910Sgarrison          }
438*12910Sgarrison       if (str1[j] == 0)
439*12910Sgarrison          return(true);
440*12910Sgarrison       }
441*12910Sgarrison    return(false);
442*12910Sgarrison }
443*12910Sgarrison 
444*12910Sgarrison /* scopy - append a copy of one string to another */
445*12910Sgarrison    char *scopy(p, q)
446*12910Sgarrison    char *p, *q;
447*12910Sgarrison {
448*12910Sgarrison    while (*p++ = *q++)
449*12910Sgarrison       ;
450*12910Sgarrison    return(--p);
451*12910Sgarrison }
452*12910Sgarrison 
453*12910Sgarrison /* bldname - build a name field
454*12910Sgarrison              doing abbreviations, reversals, and caps/small caps
455*12910Sgarrison */
456*12910Sgarrison    bldname(first, last, name, reverse)
457*12910Sgarrison    char *first, *last, name[];
458*12910Sgarrison    int reverse;
459*12910Sgarrison {
460*12910Sgarrison    char newfirst[120], newlast[120], *p, *q, *f, *l, *scopy();
461*12910Sgarrison    int  flag;
462*12910Sgarrison 
463*12910Sgarrison    if (abbrev) {
464*12910Sgarrison       p = first;
465*12910Sgarrison       q = newfirst;
466*12910Sgarrison       flag = false;
467*12910Sgarrison       while (*p) {
468*12910Sgarrison          while (*p == ' ')
469*12910Sgarrison             p++;
470*12910Sgarrison          if (*p == 0)
471*12910Sgarrison             break;
472*12910Sgarrison          if (isupper(*p)) {
473*12910Sgarrison             if (flag)
474*12910Sgarrison                q = scopy(q, "\\*(a]");
475*12910Sgarrison             flag = true;
476*12910Sgarrison             *q++ = *p;
477*12910Sgarrison             *q++ = '.';
478*12910Sgarrison             }
479*12910Sgarrison          if (*++p == '.')
480*12910Sgarrison             p++;
481*12910Sgarrison          else while (*p != 0 && ! isspace(*p))
482*12910Sgarrison             p++;
483*12910Sgarrison          }
484*12910Sgarrison       *q = 0;
485*12910Sgarrison       f = newfirst;
486*12910Sgarrison       }
487*12910Sgarrison    else
488*12910Sgarrison       f = first;
489*12910Sgarrison 
490*12910Sgarrison    if (capsmcap) {
491*12910Sgarrison       p = last;
492*12910Sgarrison       q = newlast;
493*12910Sgarrison       flag = 0;  /* 1 - printing cap, 2 - printing small */
494*12910Sgarrison       while (*p)
495*12910Sgarrison          if (islower(*p)) {
496*12910Sgarrison             if (flag != 2)
497*12910Sgarrison                q = scopy(q, "\\s-2");
498*12910Sgarrison             flag = 2;
499*12910Sgarrison             *q++ = (*p++ - 'a') + 'A';
500*12910Sgarrison             }
501*12910Sgarrison          else {
502*12910Sgarrison             if (flag == 2)
503*12910Sgarrison                q = scopy(q,"\\s+2");
504*12910Sgarrison             flag = 1;
505*12910Sgarrison             *q++ = *p++;
506*12910Sgarrison             }
507*12910Sgarrison       if (flag == 2)
508*12910Sgarrison          q = scopy(q, "\\s+2");
509*12910Sgarrison       *q = 0;
510*12910Sgarrison       l = newlast;
511*12910Sgarrison       }
512*12910Sgarrison    else
513*12910Sgarrison       l = last;
514*12910Sgarrison 
515*12910Sgarrison    if (reverse)
516*12910Sgarrison       sprintf(name, "%s, %s\n", l, f);
517*12910Sgarrison    else
518*12910Sgarrison       sprintf(name, "%s %s\n", f, l);
519*12910Sgarrison }
520*12910Sgarrison 
521*12910Sgarrison /* prtauth - print author or editor field */
522*12910Sgarrison    prtauth(c, line, num, max, ofd, abbrev, capsmcap, numrev)
523*12910Sgarrison    char c, *line;
524*12910Sgarrison    int  num, max, abbrev, capsmcap, numrev;
525*12910Sgarrison    FILE *ofd;
526*12910Sgarrison {  char first[LINELENGTH], last[LINELENGTH];
527*12910Sgarrison 
528*12910Sgarrison    if (num <= numrev || abbrev || capsmcap) {
529*12910Sgarrison       breakname(line, first, last);
530*12910Sgarrison       bldname(first, last, line, num <= numrev);
531*12910Sgarrison       }
532*12910Sgarrison    if (num == 1)
533*12910Sgarrison       fprintf(ofd,".ds [%c %s", c, line);
534*12910Sgarrison    else if (num < max)
535*12910Sgarrison       fprintf(ofd,".as [%c \\*(c]%s", c, line);
536*12910Sgarrison    else if (max == 2)
537*12910Sgarrison       fprintf(ofd,".as [%c \\*(n]%s", c, line);
538*12910Sgarrison    else
539*12910Sgarrison       fprintf(ofd,".as [%c \\*(m]%s", c, line);
540*12910Sgarrison    if (num == max && index(trailstr, c))
541*12910Sgarrison       fprintf(ofd,".ds ]%c %c\n", c, line[strlen(line)-2]);
542*12910Sgarrison }
543*12910Sgarrison 
544*12910Sgarrison /* doline - actually print out a line of reference information */
545*12910Sgarrison    doline(c, line, numauths, maxauths, numeds, maxeds, ofd)
546*12910Sgarrison    char c, *line;
547*12910Sgarrison    int numauths, maxauths, numeds, maxeds;
548*12910Sgarrison    FILE *ofd;
549*12910Sgarrison {
550*12910Sgarrison 
551*12910Sgarrison    switch(c) {
552*12910Sgarrison       case 'A':
553*12910Sgarrison           prtauth(c, line, numauths, maxauths, ofd, abbrev, capsmcap, numrev);
554*12910Sgarrison           break;
555*12910Sgarrison 
556*12910Sgarrison        case 'E':
557*12910Sgarrison           prtauth(c, line, numeds, maxeds, ofd, edabbrev, edcapsmcap, ednumrev);
558*12910Sgarrison           if (numeds == maxeds)
559*12910Sgarrison              fprintf(ofd,".nr [E %d\n", maxeds);
560*12910Sgarrison           break;
561*12910Sgarrison 
562*12910Sgarrison        case 'P':
563*12910Sgarrison           if (index(line, '-'))
564*12910Sgarrison              fprintf(ofd,".nr [P 1\n");
565*12910Sgarrison           else
566*12910Sgarrison              fprintf(ofd,".nr [P 0\n");
567*12910Sgarrison           fprintf(ofd,".ds [P %s",line);
568*12910Sgarrison           if (index(trailstr, 'P'))
569*12910Sgarrison              fprintf(ofd,".ds ]P %c\n",line[strlen(line)-2]);
570*12910Sgarrison           break;
571*12910Sgarrison 
572*12910Sgarrison        case 'F':
573*12910Sgarrison        case 'K': break;
574*12910Sgarrison 
575*12910Sgarrison        default:
576*12910Sgarrison           fprintf(ofd,".ds [%c %s", c, line);
577*12910Sgarrison           if (index(trailstr, c))
578*12910Sgarrison              fprintf(ofd,".ds ]%c %c\n", c, line[strlen(line)-2]);
579*12910Sgarrison           }
580*12910Sgarrison }
581*12910Sgarrison 
582