Annotation of researchv10no/cmd/town/apmem.c, revision 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.