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