| 1 | # include "refer..c" |
| 2 | # define SAME 0 |
| 3 | # define NFLAB 2000 |
| 4 | # define NLABC 100 |
| 5 | static char sig[NLABC]; |
| 6 | |
| 7 | static char bflab[NFLAB]; |
| 8 | static char *labtab[NLABC]; |
| 9 | static char *lbp = bflab; |
| 10 | static char labc[NLABC]; |
| 11 | static char stbuff[50]; |
| 12 | static int prevsig; |
| 13 | |
| 14 | putsig (nf, flds, nref, nstline, endline) |
| 15 | char *flds[], *nstline, *endline; |
| 16 | { |
| 17 | /* choose signal style */ |
| 18 | char t[100], t1[100], t2[100], format[10], *sd; |
| 19 | int another = 0; |
| 20 | int addon; |
| 21 | char *stline; |
| 22 | static FILE *fhide = 0; |
| 23 | if (labels) |
| 24 | { |
| 25 | if (nf==0) /* old */ |
| 26 | sprintf(t, "%s%c", labtab[nref], labc[nref]); |
| 27 | else |
| 28 | { |
| 29 | *t=0; |
| 30 | if (keywant) |
| 31 | sprintf(t, "%s", fpar(nf, flds, t1, keywant, 1, 0)); |
| 32 | if (t[0]==0) |
| 33 | { |
| 34 | sprintf(format, nmlen>0 ? "%%.%ds%%s" : "%%s%%s", nmlen); |
| 35 | /* format is %s%s for default labels or %.3s%s eg if wanted */ |
| 36 | sd = fpar(nf, flds, t2, 'D', 1, 0); |
| 37 | if (dtlen>0) |
| 38 | { |
| 39 | char *sdb; |
| 40 | for(sdb=sd; *sd; sd++); |
| 41 | sd = sd-dtlen; |
| 42 | if (sd<sdb) sd=sdb; |
| 43 | } |
| 44 | sprintf(t, format, fpar(nf, flds, t1, 'A', 1, 0), sd); |
| 45 | } |
| 46 | if (keywant) |
| 47 | { |
| 48 | addon=0; |
| 49 | for(sd=t; *sd; sd++); |
| 50 | if (*--sd == '-') |
| 51 | { |
| 52 | addon=1; |
| 53 | *sd=0; |
| 54 | } |
| 55 | } |
| 56 | if (!keywant || addon) |
| 57 | addch( t, keylet(t, nref)); |
| 58 | } |
| 59 | } |
| 60 | else |
| 61 | { |
| 62 | if (sort) |
| 63 | sprintf(t, "%c%d%c", FLAG, nref, FLAG); |
| 64 | else |
| 65 | sprintf(t, "%d", nref); |
| 66 | } |
| 67 | another = prefix (".[", sd=lookat()); |
| 68 | if (another && (strcmp(".[\n", sd) != SAME)) |
| 69 | fprintf(stderr, "File %s, line %d- punctuation ignored from: %s", Ifile, Iline, sd); |
| 70 | strcat (sig, t); |
| 71 | # if D1 |
| 72 | fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig)); |
| 73 | # endif |
| 74 | trimnl(nstline); |
| 75 | trimnl(endline); |
| 76 | stline=stbuff; |
| 77 | if (prevsig==0) |
| 78 | { |
| 79 | strcpy (stline, nstline); |
| 80 | prevsig=1; |
| 81 | } |
| 82 | if (stline[2] || endline[2]) |
| 83 | { |
| 84 | stline += 2; |
| 85 | endline += 2; |
| 86 | } |
| 87 | else |
| 88 | { |
| 89 | stline = "\\*([."; |
| 90 | endline = "\\*(.]"; |
| 91 | } |
| 92 | if (bare==0) |
| 93 | { |
| 94 | if (another==0) |
| 95 | { |
| 96 | sprintf(t1, "%s%s\%s\n", stline, sig, endline); |
| 97 | append(t1); |
| 98 | flout(); |
| 99 | sig[0]=0; |
| 100 | prevsig=0; |
| 101 | if (fo == fhide) |
| 102 | { |
| 103 | int ch; |
| 104 | fclose(fhide); fhide= fopen(hidenam, "r"); |
| 105 | fo= ftemp; |
| 106 | while ((ch = getc(fhide)) != EOF) |
| 107 | putc(ch, fo); |
| 108 | fclose(fhide); |
| 109 | unlink(hidenam); |
| 110 | } |
| 111 | } |
| 112 | else |
| 113 | { |
| 114 | strcat (sig, ",\\|"); |
| 115 | /* hide if need be */ |
| 116 | if (fo == ftemp) |
| 117 | { |
| 118 | sprintf(hidenam, "/tmp/rj%dc", getpid()); |
| 119 | # if D1 |
| 120 | fprintf(stderr, "hiding in %s\n", hidenam); |
| 121 | # endif |
| 122 | fhide= fopen(hidenam, "w"); |
| 123 | if (fhide==NULL) err("Can't get scratch file %s", hidenam); |
| 124 | fo = fhide; |
| 125 | } |
| 126 | } |
| 127 | } |
| 128 | if (bare<2) |
| 129 | if (nf>0) fprintf(fo,".ds [F %s%c",t,sep); |
| 130 | if (bare>0) |
| 131 | flout(); |
| 132 | # if D1 |
| 133 | fprintf(stderr, "sig is now %s\n",sig); |
| 134 | # endif |
| 135 | } |
| 136 | char * |
| 137 | fpar (nf, flds, out, c, seq, prepend) |
| 138 | char *flds[], *out; |
| 139 | { |
| 140 | char *p, *s; |
| 141 | int i, fnd = 0; |
| 142 | for(i=0; i<nf; i++) |
| 143 | if (flds[i][1]==c && ++fnd >= seq) |
| 144 | { |
| 145 | if (c=='T' || c == 'J') /* for titles use first word otherwise last */ |
| 146 | { |
| 147 | p=flds[i]+3; |
| 148 | if (prefix("A ", p)) p +=2; |
| 149 | if (prefix("An ", p)) p +=3; |
| 150 | if (prefix("The ", p)) p+= 4; |
| 151 | mycpy2(out, p, 20); |
| 152 | return(out); |
| 153 | } |
| 154 | for(s=p= flds[i]+2; *p; p++); |
| 155 | while (p>s && *p != ' ') p--; |
| 156 | /* special wart for authors */ |
| 157 | if (c=='A' && (p[-1] == ',' || p[1] =='(')) |
| 158 | { |
| 159 | p--; |
| 160 | while (p>s && *p != ' ') p--; |
| 161 | mycpy (out, p+1); |
| 162 | } |
| 163 | else |
| 164 | strcpy (out, p+1); |
| 165 | if (c=='A' && prepend) |
| 166 | initadd(out, flds[i]+2, p); |
| 167 | return(out); |
| 168 | } |
| 169 | return(0); |
| 170 | } |
| 171 | putkey(nf, flds, nref, keystr) |
| 172 | char *flds[], *keystr; |
| 173 | { |
| 174 | char t1[50], *sf; |
| 175 | int ctype, i, count; |
| 176 | fprintf(fo, ".\\\""); |
| 177 | if (nf <= 0) |
| 178 | fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep); |
| 179 | else |
| 180 | { |
| 181 | while (ctype= *keystr++) |
| 182 | { |
| 183 | count = atoi(keystr); |
| 184 | if (*keystr=='+') count=999; |
| 185 | if (count<=0) count=1; |
| 186 | for(i=1; i<=count; i++) |
| 187 | { |
| 188 | sf= fpar(nf, flds, t1, ctype, i, 1); |
| 189 | if (sf==0) |
| 190 | break; |
| 191 | sf = artskp(sf); |
| 192 | fprintf(fo, "%s%c", sf, '-'); |
| 193 | } |
| 194 | } |
| 195 | fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep); |
| 196 | } |
| 197 | } |
| 198 | keylet(t, nref) |
| 199 | char *t; |
| 200 | { |
| 201 | int i; |
| 202 | int x = 'a'-1; |
| 203 | for(i=1; i<nref;i++) |
| 204 | { |
| 205 | if (strcmp(labtab[i], t) == 0) |
| 206 | x = labc[i]; |
| 207 | } |
| 208 | strcpy(labtab[nref]=lbp, t); |
| 209 | while (*lbp++); |
| 210 | if (lbp-bflab >NFLAB) |
| 211 | err("bflab overflow (%d)", NFLAB); |
| 212 | if (nref >NLABC) |
| 213 | err ("nref in labc overflow (%d)", NLABC); |
| 214 | # ifdef D1 |
| 215 | fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab); |
| 216 | # endif |
| 217 | return (labc[nref] = x+1); |
| 218 | } |
| 219 | mycpy(s,t) |
| 220 | char *s, *t; |
| 221 | { |
| 222 | while (*t && *t != ',' && *t != ' ') |
| 223 | *s++ = *t++; |
| 224 | *s=0; |
| 225 | } |
| 226 | mycpy2 (s, t, n) |
| 227 | char *s, *t; |
| 228 | { |
| 229 | int c; |
| 230 | while (n-- && (c= *t++)>0) |
| 231 | { |
| 232 | if (c==' ')c= '-'; |
| 233 | *s++ = c; |
| 234 | } |
| 235 | *s=0; |
| 236 | } |
| 237 | initadd(to, from, stop) |
| 238 | char *to, *from, *stop; |
| 239 | { |
| 240 | int c, nalph = 1; |
| 241 | while (*to) to++; |
| 242 | while (from<stop) |
| 243 | { |
| 244 | c = *from++; |
| 245 | if (!isalpha(c)) |
| 246 | { |
| 247 | if (nalph) |
| 248 | *to++ = '.'; |
| 249 | nalph=0; |
| 250 | continue; |
| 251 | } |
| 252 | if (nalph++ ==0) |
| 253 | *to++ = c; |
| 254 | } |
| 255 | *to=0; |
| 256 | } |
| 257 | |
| 258 | static char *articles[] = {"the ", "an ", "a ", 0}; |
| 259 | char * |
| 260 | artskp(s) |
| 261 | char *s; |
| 262 | { |
| 263 | /* skips over initial "a ", "an ", or "the " in s */ |
| 264 | char **p, *r1, *r2; |
| 265 | for(p=articles; *p; p++) |
| 266 | { |
| 267 | r2 = s; |
| 268 | for (r1= *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++) |
| 269 | r2++; |
| 270 | if (*r1==0 && *r2 != 0) |
| 271 | return(r2); |
| 272 | } |
| 273 | return(s); |
| 274 | } |