Annotation of researchv10no/cmd/town/apmem.c, revision 1.1.1.1

1.1       root        1: # include "stdio.h"
                      2: # include "ctype.h"
                      3: # include "assert.h"
                      4: # include "cbt.h"
                      5: # define SAME 0
                      6: bfile *townfile;
                      7: bfile *happened;
                      8: main(argc,argv)
                      9:        char *argv[];
                     10: {
                     11: char x[100], y[500], z[100];
                     12: char city[100];
                     13: int dbgflg=0;
                     14: if (isatty(1)) dbgflg=1;
                     15: argc--; argv++;
                     16: townfile = bopen("/usr/spool/town/ustowns", 0);
                     17: happened = bopen("/usr/spool/town/happen", 2);
                     18: assert(townfile!=NULL);
                     19: while (argc--)
                     20:        {
                     21:        if (dbgflg) printf("story %s\n",*argv);
                     22:        if (getstory(*argv++, x, y, z)==0)
                     23:                continue;
                     24:        if (dbgflg) printf("got story from %s, len %d start %.20s\n", x, strlen(y), y);
                     25:        where (x, city);
                     26:        if (nothing(y)) continue;
                     27:        if (dbgflg) printf("approaching update city %s\n",city);
                     28:        update (city, z, y);
                     29:        if (dbgflg) printf("past update\n");
                     30:        }
                     31: bclose(happened);
                     32: }
                     33: getstory(name, dateline, sentence, date)
                     34:        char *name, *dateline, *sentence, *date;
                     35: {
                     36: char *s, line[100], *p, *t, *strchr(), *ctime();
                     37: int k;
                     38: long tn, time();
                     39: FILE *f;
                     40: f = fopen(name, "r");
                     41: if (f==NULL) return(0);
                     42: fgets(line, 100, f);
                     43: if (line[2]!='a')
                     44:        {
                     45:        fclose(f);
                     46:        return(0);
                     47:        }
                     48: while (fgets(line, 100, f))
                     49:        if (line[0]=='\t') break;
                     50: for(p=line; isspace(*p); p++)
                     51:        ;
                     52: sentence[0]=0;
                     53: s = strchr(p, '-');
                     54: if (s==NULL) return(0);
                     55: t = strchr(p, '(');
                     56: if (t==NULL || t>s) t=s;
                     57: *--t=0;
                     58: while (isspace(*--t))
                     59:        *t=0;
                     60: strcpy(dateline, p);
                     61: while (isspace(*++s));
                     62: do {
                     63:        trimnl(s);
                     64:        k = sentend(s);
                     65:        strcat(sentence, s);
                     66:        if (k>0) break;
                     67:        strcat(sentence, " ");
                     68:        } while (fgets(s=line, 100, f));
                     69: tn = time(0);
                     70: p = ctime(&tn);
                     71: sprintf(date, "%.6s %.4s", p+4, p+20);
                     72: fclose(f);
                     73: return(1);
                     74: }
                     75: sentend(s)
                     76:        char *s;
                     77: {
                     78: for( s+=2; *s; s++)
                     79:        if (s[0]=='.')
                     80:                {
                     81:                char *p = s;
                     82:                if (s[-2]=='.' || s[-2]==' ')
                     83:                        continue;
                     84:                if (s[-3]==' ' &&strncase(s-2, "st", 2)==0)
                     85:                        continue;
                     86:                if (strncase(s-2, "Mr", 2)==0)
                     87:                        continue;
                     88:                if (strncase(s-3, "Mrs", 3)==0)
                     89:                        continue;
                     90:                if (strncase(s-2, "Ms", 2)==0)
                     91:                        continue;
                     92:                if (strncase(s-3, "Sen", 3)==0)
                     93:                        continue;
                     94:                if (strncase(s-4, "Capt", 4)==0)
                     95:                        continue;
                     96:                if (strncase(s-3, "Col", 3)==0)
                     97:                        continue;
                     98:                if (strncase(s-3, "Gov", 3)==0)
                     99:                        continue;
                    100:                if (strncase(s-3, "Rep", 3)==0)
                    101:                        continue;
                    102:                if (strncase(s-2, "Co", 2)==0)
                    103:                        continue;
                    104:                if (strncase(s-2, "Dr", 2)==0)
                    105:                        continue;
                    106:                if (strncase (s-3, "Rev", 3)==0)
                    107:                        continue;
                    108:                while (*++p ==' ' || *p == '\t');
                    109:                if (p[0]=='\'' && p[1]=='\'')
                    110:                        {
                    111:                        p[2]=0;
                    112:                        return(1);
                    113:                        }
                    114:                if (*p==0 || isupper(*p) )
                    115:                        {
                    116:                        s[1]=0;
                    117:                        return(1);
                    118:                        }
                    119:                }
                    120: return(0);
                    121: }
                    122: strncase(s, t, n)
                    123:        char *s, *t;
                    124: {
                    125: while (n--)
                    126:        {
                    127:        if ( (*s ^ *t) & 0337)
                    128:                return(1);
                    129:        if (*s==0) return(0);
                    130:        s++; t++;
                    131:        }
                    132: return(0);
                    133: }
                    134: trimnl(s)
                    135:        char *s;
                    136: {
                    137: while (*s)s++;
                    138: if (*--s=='\n') *s=0;
                    139: }
                    140: struct {
                    141:        char *old, *new;
                    142:        } *st, stnames [] = {
                    143: {"Ala.", "al"},
                    144: {"Alaska", "ak"},
                    145: {"Ariz.", "az"},
                    146: {"Ark.", "ak"},
                    147: {"Calif.", "ca"},
                    148: {"Colo.", "co"},
                    149: {"Conn.", "ct"},
                    150: {"Del.", "de"},
                    151: {"Fla.", "fl"},
                    152: {"Ga.", "ga"},
                    153: {"Hawaii", "hi"},
                    154: {"Ida.", "id"},
                    155: {"Idaho", "id"},
                    156: {"Ill.", "il"},
                    157: {"Ind.", "in"},
                    158: {"Iowa", "ia"},
                    159: {"Kan.", "ks"},
                    160: {"Ky.", "ky"},
                    161: {"La.", "la"},
                    162: {"Mass.", "ma"},
                    163: {"Mass", "ma"},
                    164: {"Md.", "md"},
                    165: {"Me.", "me"},
                    166: {"Maine", "me"},
                    167: {"Mich.", "mi"},
                    168: {"Mich", "mi"},
                    169: {"Minn.", "mn"},
                    170: {"Miss.", "ms"},
                    171: {"Mo.", "mo"},
                    172: {"Mont.", "mt"},
                    173: {"N.C.", "nc"},
                    174: {"N.D.", "nd"},
                    175: {"N.H.", "nh"},
                    176: {"N.J.", "nj"},
                    177: {"N.M.", "nm"},
                    178: {"N.Y.", "ny"},
                    179: {"Neb.", "ne"},
                    180: {"Nev.", "nv"},
                    181: {"Ohio", "oh"},
                    182: {"OHIO", "oh"},
                    183: {"Okla.", "ok"},
                    184: {"Ore.", "or"},
                    185: {"Pa.", "pa"},
                    186: {"R.I.", "ri"},
                    187: {"S.C.", "sc"},
                    188: {"S.D.", "sd"},
                    189: {"Puerto Rico", "pr"},
                    190: {"Tenn.", "tn"},
                    191: {"Texas", "tx"},
                    192: {"Utah", "ut"},
                    193: {"Va.", "va"},
                    194: {"Vt.", "vt"},
                    195: {"W.Va.", "wv"},
                    196: {"Wash.", "wa"},
                    197: {"Wis.", "wi"},
                    198: {"Wyo.", "wy"},
                    199: {NULL, NULL},
                    200: };
                    201: where (dateline, city)
                    202:        char *dateline, *city;
                    203: {
                    204: char *state, *p, *s;
                    205: state = strchr(dateline, ',');
                    206: if (state!=NULL)
                    207:        {
                    208:        *state++=0;
                    209:        while (isspace(*state))state++;
                    210:        for(st=stnames; st->old; st++)
                    211:                if (strcmp(state, st->old)==0)
                    212:                        break;
                    213:        if (st->old)
                    214:                strcpy(state, st->new);
                    215:        else
                    216:                fprintf(stderr, "State? %s\n",state);
                    217:        }
                    218: lcase(dateline);
                    219: find (dateline, state, city);
                    220: }
                    221: find (request, state, city)
                    222:        char *request, *state, *city;
                    223: {
                    224: mbuf key, rkey, rrec;
                    225: int btype, bsize;
                    226: char rka[100], rra[100], best[100], *s;
                    227:        best[0]=0;
                    228:        btype='3'; bsize=' ';
                    229:        key.mdata = request; key.mlen = strlen(request);
                    230:        bseek(townfile, key);
                    231:        rkey.mdata = rka; rrec.mdata = rra;
                    232:        while (bread(townfile, &rkey, &rrec)==NULL)
                    233:                {
                    234:                rkey.mdata[rkey.mlen]=0;
                    235:                rrec.mdata[rrec.mlen]=0;
                    236:                if (strncmp(rkey.mdata, request, key.mlen)!=SAME)
                    237:                        break;
                    238:                if (state)
                    239:                        {
                    240:                        s = strchr(rkey.mdata, ',');
                    241:                        if (strncmp(state, s+2, 2))
                    242:                                continue;
                    243:                        }
                    244:                for(s=rrec.mdata; *s; s++)
                    245:                        ;
                    246:                --s;
                    247:                if (*s < btype || (*s == btype && s[-2] > bsize) )
                    248:                        {
                    249:                        if (state || (s[-2]>'7'))/* don't take small
                    250:                                american cities for Ottawa, Toronto...*/
                    251:                                {
                    252:                                btype = *s;
                    253:                                bsize = s[-2];
                    254:                                strcpy(best, rkey.mdata);
                    255:                                }
                    256:                        }
                    257:                }
                    258:        strcpy(city, best);
                    259: }
                    260: lcase(s)
                    261:        char *s;
                    262: {
                    263: for (; *s; s++)
                    264:        if (isupper(*s))
                    265:                *s = tolower(*s);
                    266: }
                    267: update (city, date, text)
                    268:        char *city, *date, *text;
                    269: {
                    270: mbuf key, val;
                    271: char buff[1000];
                    272: if (city[0]==0 || city[0]==' '|| city[0]=='\t') return;
                    273: sprintf(buff, "(%s) %s", date, text);
                    274: val.mdata = buff;
                    275: val.mlen = strlen(buff);
                    276: key.mdata = city;
                    277: key.mlen = strlen(city);
                    278: bwrite(happened, key, val);
                    279: printf("%s\n", city);
                    280: }
                    281: nothing(s)
                    282:        char *s;
                    283: {
                    284: while (isspace(*s)) s++;
                    285: if (strlen(s)<20) return(1);
                    286: return(0);
                    287: }

unix.superglobalmegacorp.com

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