Annotation of researchv10no/cmd/refer/ml1.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.