|
|
1.1 root 1: # include "stdio.h"
2: # include "assert.h"
3: # include "ctype.h"
4: # define SEP 001
5: # define MAXLIN 100
6: # define MAXCH 4000
7: # define control(s) ((s)=='%')
8: int authsplit =1; /* separate line for each author */
9: char *lasbl(), *artskip(), *lmin();
10: int typesplit =1; /* separate line for each type */
11: int nlines =0;
12: char *ln[MAXLIN];
13: char date[20], mdate[20];
14: int beenhere[5];
15: char *kdate, stitle[50], *auth;
16: char *keys= "A%D.T"; /* key to be author, kind of pub, date, title */
17: main (argc,argv)
18: char *argv[];
19: {
20: FILE *f;
21: char bf[MAXCH], *p, *r;
22: int j, k, m,d, type, skip, comment;
23: /* type: 1 TM 2 RP 3 Patent 4 Pat. applc */
24: assert (argc>0);
25: argc--; argv++;
26: while (argc-->0)
27: {
28: assert(*argv!=0);
29: if (argv[0][0] == '-')
30: switch ( (*argv++)[1])
31: {
32: case 's': /* no split */
33: authsplit=0; continue;
34: case 't': /* no type split */
35: typesplit= 0; continue;
36: case 'k': /* key string */
37: keys = *argv++; argc--; continue;
38: default: continue;
39: }
40: f = fopen(*argv++, "r");
41: assert (f!=NULL);
42: for(;;)
43: {
44: /* read this input file */
45: ln[nlines=0] = bf;
46: comment=0;
47: for(;;)
48: /* obtain item */
49: {
50: m=(int)fgets(p=ln[nlines], bf+MAXCH-p, f);
51: if (m==NULL)break;
52: if (*p=='\n') break;
53: if (control(p[0]) && p[1]=='X')
54: {
55: comment=1;
56: continue;
57: }
58: if (comment && !control(p[0]))
59: continue;
60: comment = 0;
61: while (*p++);
62: if (p[-2]=='\n') p[-2] = 0;
63: assert(nlines<MAXLIN);
64: assert(p<bf+MAXCH);
65: ln [ ++nlines ] = p;
66: }
67: if (nlines==0 && m==NULL) break;
68: /* item read */
69: if (nlines==0) continue;
70: /* now get date, etc. */
71: strcpy(date,"1980");
72: stitle[0]=0;
73: for(d=0; d<nlines; d++)
74: {
75: p = ln[d];
76: if (!control(p[0])) continue;
77: switch(p[1])
78: {
79: case 'D':
80: r = lasbl(p, 'D');
81: if (isdigit(*r))
82: sprintf(date, "%s.%02d", r, mon(p+3));
83: break;
84: case 'M':
85: for (p=p+2;*p;p++)
86: if (isdigit(*p))
87: {
88: sprintf(mdate, "19%c%c.%02d", p[0],p[1], atoi(lmin(p)));
89: break;
90: }
91: break;
92: case 'T':
93: sprintf(stitle,"%.10s", artskip(p+3));
94: break;
95: }
96: }
97: for(d=0; d<5; d++)
98: beenhere[d]=0;
99: if (typesplit)
100: for(d=0; d<nlines; d++)
101: {
102: p=ln[d];
103: if (control(p[0]))switch(p[1])
104: {
105: case 'B':
106: case 'J': case 'I':
107: case 'R': type = 2; doit(type); break;
108: case 'M': type =1; doit(type); break;
109: case 'p': type = 3; doit(type); break;
110: case 'a': type = 4; doit(type); break;
111: }
112: }
113: else
114: doit(0);
115: if (m==NULL) break;
116: }
117: fclose(f);
118: }
119: }
120: doit(type)
121: {
122: int j; char *p;
123: if (beenhere[type]) return;
124: beenhere[type]=1;
125: kdate = (type==1) ? mdate: date;
126: j= atoi(kdate);
127: if (type==1 && (j<1960 || j >1990)) kdate=date;
128: for(j=0; j<nlines; j++)
129: {
130: p=ln[j];
131: if (!control(p[0]) || p[1] != 'A') continue;
132: auth=p;
133: pline(type);
134: if (authsplit==0) break;
135: }
136: }
137: pline(type)
138: {
139: char *pk, *p, *s;
140: int j, c;
141: for (pk=keys; c= *pk; pk++)
142: {
143: switch(c)
144: {
145: case 'A':
146: auprint(auth); break;
147: case '%':
148: printf("*%d_", type); break;
149: case 'T':
150: /* printf("%s_", stitle); break; */ fputs(stitle, stdout); putchar('_'); break;
151: case 'M':
152: for(j=0; j<nlines; j++)
153: {
154: p=ln[j];
155: if (control(p[0]))
156: if (p[1]=='M')
157: {
158: printf("%s_",p+3);
159: break;
160: }
161: }
162: break;
163: case 'D':
164: /* if D is followed by . we want month otherwise not. */
165: c = pk[1];
166: if (c=='.') pk++;
167: else
168: {
169: for(s=kdate; *s && *s != '.'; s++)
170: ;
171: *s=0;
172: }
173: /* printf("%s_", kdate); */ fputs(kdate, stdout); putchar('_'); break;
174: }
175: }
176: itdump(type);
177: putchar('\n');
178: }
179: static char xxx[50];
180: char *
181: lasbl(pin, fl)
182: char *pin;
183: {
184: char *s, *p, px[100];
185: char *t;
186: int inparen=0, normal;
187: strcpy (s=p=px, pin);
188: while (*p)p++;
189: p--;
190: for (; p>s; p--)
191: {
192: normal = (p[-1] != '\\');
193: if (p[0]==')' && normal) inparen++;
194: if (*p=='(' && normal) inparen--;
195: if (*p=='(' && normal)
196: while (*--p == ' ');
197: if (inparen==0 && *p==' ')
198: {
199: if (p[-1]==',' && fl =='A') /* Jr or II */
200: {
201: *--p=0;
202: continue;
203: }
204: t=xxx; p++;
205: while (*p && *p!=' ') *t++ = *p++;
206: *t=0; return(xxx);
207: }
208: }
209: fprintf(stderr, "s is %s\n",s);
210: assert(0);
211: }
212: static char *mp[12] ={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
213: "Aug", "Sep", "Oct", "Nov", "Dec"};
214: mon (s)
215: char *s;
216: {
217: int i;
218: for(i=0; i<12; i++)
219: if (mat3(s, mp[i])) return(i+1);
220: return(0);
221: }
222: mat3(s,t)
223: char *s, *t;
224: {
225: int k;
226: for(k=0; k<3; k++)
227: if (s[k] != t[k]) return(0);
228: return(1);
229: }
230: char *
231: lmin(s)
232: char *s;
233: {
234: char *p;
235: for(p=s; *p; p++);
236: while (*--p != '-' && p>s);
237: return(p+1);
238: }
239: char *
240: artskip(s)
241: char *s;
242: {
243: if (s[0]=='A' && s[1]== 'n' && s[2] == ' ')
244: return(s+3);
245: if (s[0]=='A' && s[1]==' ')
246: return(s+2);
247: if (s[0]=='T' && s[1]=='h' && s[2]=='e' && s[3] == ' ')
248: return(s+4);
249: return(s);
250: }
251: itdump(type) /* print item */
252: {
253: int k, skip=0;
254: char *p;
255: for(k=0; k<nlines; k++)
256: {
257: p = ln[k];
258: if (skip && !control(p[0])) continue;
259: if (type==1 && control(p[0]))
260: switch(p[1])
261: {
262: case 'J': case 'D':
263: case 'R': case 'I':
264: case 'K': case 'B':
265: skip=1;
266: continue;
267: }
268: if (control(p[0]))
269: switch(p[1])
270: {
271: case 'X': case ']': case '[':
272: skip=1;
273: continue;
274: }
275: skip=0;
276: /* printf("%c%s", SEP, p); */
277: putchar(SEP);
278: fputs(p, stdout);
279: }
280: }
281: auprint(p) /* dump author */
282: char *p;
283: {
284: int k;
285: printf("%s_%c_", lasbl(p, 'A'), p[3]);
286: for(k=7; p[k] == '.'; p += 3) /* lots of initials */
287: printf("%c_", p[k-1]);
288: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.