BSD 3 development
[unix-history] / usr / src / cmd / refer / refer5.c
CommitLineData
42d6e430
BJ
1# include "refer..c"
2# define SAME 0
3# define NFLAB 2000
4# define NLABC 100
5static char sig[NLABC];
6
7static char bflab[NFLAB];
8static char *labtab[NLABC];
9static char *lbp = bflab;
10static char labc[NLABC];
11static char stbuff[50];
12static int prevsig;
13
14putsig (nf, flds, nref, nstline, endline)
15 char *flds[], *nstline, *endline;
16{
17/* choose signal style */
18char t[100], t1[100], t2[100], format[10], *sd;
19int another = 0;
20int addon;
21char *stline;
22static FILE *fhide = 0;
23if (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 }
60else
61 {
62 if (sort)
63 sprintf(t, "%c%d%c", FLAG, nref, FLAG);
64 else
65 sprintf(t, "%d", nref);
66 }
67another = prefix (".[", sd=lookat());
68if (another && (strcmp(".[\n", sd) != SAME))
69 fprintf(stderr, "File %s, line %d- punctuation ignored from: %s", Ifile, Iline, sd);
70strcat (sig, t);
71# if D1
72fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
73# endif
74trimnl(nstline);
75trimnl(endline);
76stline=stbuff;
77if (prevsig==0)
78 {
79 strcpy (stline, nstline);
80 prevsig=1;
81 }
82if (stline[2] || endline[2])
83 {
84 stline += 2;
85 endline += 2;
86 }
87else
88 {
89 stline = "\\*([.";
90 endline = "\\*(.]";
91 }
92if (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
120fprintf(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 }
128if (bare<2)
129 if (nf>0) fprintf(fo,".ds [F %s%c",t,sep);
130if (bare>0)
131 flout();
132# if D1
133fprintf(stderr, "sig is now %s\n",sig);
134# endif
135}
136char *
137fpar (nf, flds, out, c, seq, prepend)
138 char *flds[], *out;
139{
140char *p, *s;
141int i, fnd = 0;
142for(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 }
169return(0);
170}
171putkey(nf, flds, nref, keystr)
172 char *flds[], *keystr;
173{
174char t1[50], *sf;
175int ctype, i, count;
176fprintf(fo, ".\\\"");
177if (nf <= 0)
178 fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
179else
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}
198keylet(t, nref)
199 char *t;
200{
201int i;
202int x = 'a'-1;
203for(i=1; i<nref;i++)
204 {
205 if (strcmp(labtab[i], t) == 0)
206 x = labc[i];
207 }
208strcpy(labtab[nref]=lbp, t);
209while (*lbp++);
210if (lbp-bflab >NFLAB)
211 err("bflab overflow (%d)", NFLAB);
212if (nref >NLABC)
213 err ("nref in labc overflow (%d)", NLABC);
214# ifdef D1
215fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab);
216# endif
217return (labc[nref] = x+1);
218}
219mycpy(s,t)
220 char *s, *t;
221{
222while (*t && *t != ',' && *t != ' ')
223 *s++ = *t++;
224*s=0;
225}
226mycpy2 (s, t, n)
227 char *s, *t;
228{
229int c;
230while (n-- && (c= *t++)>0)
231 {
232 if (c==' ')c= '-';
233 *s++ = c;
234 }
235*s=0;
236}
237initadd(to, from, stop)
238 char *to, *from, *stop;
239{
240 int c, nalph = 1;
241while (*to) to++;
242while (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
258static char *articles[] = {"the ", "an ", "a ", 0};
259char *
260artskp(s)
261 char *s;
262{
263/* skips over initial "a ", "an ", or "the " in s */
264 char **p, *r1, *r2;
265for(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 }
273return(s);
274}