Annotation of researchv10no/cmd/weather/xcomp.c, revision 1.1

1.1     ! root        1: # include "stdio.h"
        !             2: # include "ctype.h"
        !             3: # include "assert.h"
        !             4: # include "cbt.h"
        !             5: # include "weath.h"
        !             6: # include "time.h"
        !             7: struct tm *gmtime();
        !             8: # define SURFACE 1
        !             9: # define LFMFORE 2
        !            10: # define FORECAST 3
        !            11: # define MARINE 4
        !            12: mbuf key, rec, rkey;
        !            13: char kb[100], rb[100], rkb[100];
        !            14: int day;
        !            15: bfile *bf;
        !            16: char *index(), *vis(), *airport();
        !            17: double atof();
        !            18: 
        !            19: main()
        !            20: {
        !            21: char line[400], line2[400];
        !            22: int kind=0, k;
        !            23: long clock;
        !            24: time(&clock);
        !            25: day = gmtime(&clock)->tm_yday;
        !            26: chdir ("/usr/spool/weather");
        !            27: bf = bopen("airn", 0);
        !            28: assert(bf!=NULL);
        !            29: while (gets(line))
        !            30:        {
        !            31:        k = strlen(line);
        !            32:        if (k==0) continue;
        !            33:        if (k==8 && strncmp(line+3, "00", 2)==0)
        !            34:                {
        !            35: printf("found something, line %s\n",line);
        !            36:                unfore();
        !            37:                switch(atoi(line+5))
        !            38:                        {
        !            39:                        case 200: /* new england */
        !            40:                        case 201: /* eastern states */
        !            41:                        case 202: /* midatlantic */
        !            42:                        case 203: /* southeastern */
        !            43:                        case 204: /* great lakes */
        !            44:                        case 205: /* ohio valley */
        !            45:                        case 206: /* northern plains */
        !            46:                        case 207: /* great plains */
        !            47:                        case 208: /* gulf coast */
        !            48:                        case 209: /* northern rockies */
        !            49:                        case 210: /* southwestern */
        !            50:                        case 211: /* pacific northwest */
        !            51:                        case 212: /* pacific */
        !            52:                        case 290: /* alaska */
        !            53:                        case 291: /* hawaii */
        !            54:                                kind = SURFACE;
        !            55:                                continue;
        !            56:                        case 431:
        !            57:                                kind = LFMFORE; continue;
        !            58:                        case 307:
        !            59:                        case 308:
        !            60:                        case 309:
        !            61:                                kind = FORECAST; continue;
        !            62:                        case 313:
        !            63:                                kind = MARINE; continue;
        !            64:                        }
        !            65:                kind=0;
        !            66:                continue;
        !            67:                }
        !            68:        switch(kind)
        !            69:                {
        !            70:                case SURFACE:
        !            71:                        surf(line); break;
        !            72:                case LFMFORE:
        !            73:                        if (strlen(line)>5 && line[3]==' ' &&
        !            74:                                isupper(line[0]) && isupper(line[1]))
        !            75:                        {
        !            76:                                gets(line2);
        !            77:                                if (startwith(line2, "POF"))
        !            78:                                        gets(line2);
        !            79:                                lfmfore(line, line2);
        !            80:                        }
        !            81:                        else
        !            82:                        if (strncmp(line, "DATE/GMT", 8)==0)
        !            83:                                lfmtimeset(line);
        !            84:                        break;
        !            85:                case FORECAST:
        !            86:                case MARINE:
        !            87:                        realfore(line, kind); break;
        !            88:                }
        !            89:        }
        !            90: }
        !            91: surf(line)
        !            92:        char *line;
        !            93: {
        !            94: int nv, nw, i, cloud; char *v[50], *w[50], *s, *p, *aname;
        !            95: double north, west;
        !            96: printf("surface lin %s\n",line);
        !            97: if (strlen(line)<10) return;
        !            98: if (!isalpha(line[0])) return;
        !            99: s=line;
        !           100: while ( (s=index (s, '/')) && !hasnxt(s))
        !           101:        s++;
        !           102: if (s==NULL) return;
        !           103: while (s>line && *s!= ' ')s--;
        !           104: *s++ = 0;
        !           105: nv = getargs(line, v);
        !           106: nw = getargs(s, w);
        !           107: aname = airport(v[0]);
        !           108: printf("airport %s aname %s\n", v[0], aname? aname: "NULL");
        !           109: if (aname==NULL) return;
        !           110: for(i=0; i<nw; i++)
        !           111:        { int q;
        !           112:        q = strlen(w[i]);
        !           113:        if (q==4 && isdigit(w[i][0])) break;
        !           114:        if (q>4 && isdigit(w[i][0]) && w[i][4]=='G') break;
        !           115:        }
        !           116: if (i==nw || i<2) return;
        !           117: p = vis(v[nv-1]);
        !           118: if (p==NULL ) return;
        !           119: north = atof(aname);
        !           120: west = atof(index(aname, ' '));
        !           121: s= v[nv-2]; /* last kind of cloud cover */
        !           122: while (isdigit(*s) || *s=='-') s++;
        !           123: if (strcmp(s, "OVC")==0)
        !           124:        cloud = 'O';
        !           125: else
        !           126: if (strcmp(s, "BKN")==0)
        !           127:        cloud = 'P';
        !           128: else
        !           129: if (strcmp(s, "SCT")==0)
        !           130:        cloud = 'P';
        !           131: else
        !           132: if (strcmp(s, "CLR")==0)
        !           133:        cloud = 'C';
        !           134: else
        !           135:        cloud = 'X';
        !           136: if (nottime(v[2])) return;
        !           137: if (!alldigs(w[i-2])) return; /* temp must be digits */
        !           138: if (!alldigs(w[i-1])) return; /* dewpoint must be digits */
        !           139: update( v[0], north, west, v[2], w[i-2], w[i-1], v[nv-1], w[i], cloud, w[i+1]);
        !           140: }
        !           141: char *
        !           142: vis(s)
        !           143:        char *s;
        !           144: {
        !           145: int d;
        !           146: static char temp[50];
        !           147: d= atoi(s);
        !           148: while (isdigit(*s)) s++;
        !           149: if (*s==0)
        !           150:        {
        !           151:        sprintf(temp, " ordinary, visibility %d miles", d);
        !           152:        return(temp);
        !           153:        }
        !           154: temp[0]=0;
        !           155: for( ; *s; s++)
        !           156: switch(*s)
        !           157:        {
        !           158:        case 'A': strcat(temp, " hail"); break;
        !           159:        case 'D': strcat(temp, " dust"); break;
        !           160:        case 'F': strcat(temp, " fog"); break;
        !           161:        case 'H': strcat(temp, " haze"); break;
        !           162:        case 'I': if (s[1]=='P') strcat(temp, " sleet"); break;
        !           163:        case 'K': strcat(temp, " smoke"); break;
        !           164:        case 'L': strcat(temp, " drizzle"); break;
        !           165:        case 'R': strcat(temp, " rain"); break;
        !           166:        case 'W': strcat(temp, " showers"); break;
        !           167:        case 'S': strcat(temp, " snow"); break;
        !           168:        case 'T': strcat(temp, " thunderstorms"); break;
        !           169:        case 'Z': strcat(temp, " freezing"); break;
        !           170:        case '-': break;
        !           171:        default: return(NULL);
        !           172:        }
        !           173: return(temp);
        !           174: }
        !           175: char lfmt1[10], lfmt2[10];
        !           176: lfmfore( l1, l2)
        !           177:        char *l1, *l2;
        !           178: {
        !           179: char *s, fname[100], xl[20], *p, *t;
        !           180: FILE *tf;
        !           181: int p1, p2, p3, p4, max1, min1, max2, min2;
        !           182: l1[3]=0;
        !           183: s=airport(l1);
        !           184: if(s==NULL) return;
        !           185: sscanf(l1+4, "%*s %d %d %d %d", &p1, &p2, &p3, &p4);
        !           186: sscanf(l2, "%s %d %d %d %d", xl, &max1, &min1, &max2, &min2);
        !           187: if (p1<0 || p1>100) return;
        !           188: if (p2<0 || p2>100) return;
        !           189: if (p3<0 || p3>100) return;
        !           190: if (p4<0 || p4>100) return;
        !           191: if (max1>150 || max2>150 || min1>150 || min2>150) return;
        !           192: if (strncmp(xl, "MN", 2)==0)
        !           193:        {
        !           194:        int t;
        !           195:        t = max1; max1 = min1; min1 = t;
        !           196:        t = max2; max2 = min2; min2 = t;
        !           197:        }
        !           198: sprintf(fname, "lfm/%s", l1);
        !           199: tf = fopen(fname, "w");
        !           200: if (tf)
        !           201:        {
        !           202:        p = index(s, '\t');
        !           203:        if (p==NULL) return;
        !           204:        fprintf(tf, "%s\n", p+1);
        !           205:        fprintf(tf, "%s %d %d %d %d\n", lfmt1, max1, min1, p1, p2);
        !           206:        fprintf(tf, "%s %d %d %d %d\n", lfmt2, max2, min2, p3, p4);
        !           207:        fclose(tf);
        !           208:        airmark ("lfm/", l1);
        !           209:        }
        !           210: return;
        !           211: }
        !           212: lfmtimeset(s)
        !           213:        char *s;
        !           214: {
        !           215: sscanf(s, "%*s %s %*s %s", lfmt1, lfmt2);
        !           216: }
        !           217: char *
        !           218: airport(s)
        !           219:        char *s;
        !           220: {
        !           221: int i;
        !           222: key.mdata = s;
        !           223: key.mlen = strlen(s);
        !           224: i=bseek(bf, key);
        !           225: if (i!=1) return(NULL);
        !           226: rkey.mdata =rkb; rec.mdata = rb;
        !           227: bread(bf, &rkey, &rec);
        !           228: assert(strcmp(rkey.mdata, key.mdata)==0);
        !           229: rkey.mdata[rkey.mlen]=0;
        !           230: rec.mdata[rec.mlen]=0;
        !           231: return(rec.mdata);
        !           232: }
        !           233: update (acode, north, west, wtime, temp, humid, weath, wind, cloud, press)
        !           234:        double north, west;
        !           235:        char *acode, *temp, *weath, *wind, *humid, *wtime, *press;
        !           236: {
        !           237: char fname[30], odata[2000], *p, *s, wtt[100];
        !           238: struct wline *wp;
        !           239: int n, w, f;
        !           240: n = north;
        !           241: n = n-n%4;
        !           242: w = west;
        !           243: w = w-w%4;
        !           244: sprintf(fname, "obs/%.2d.%.2d", n, w);
        !           245: f = open(fname, 2);
        !           246: if (f>=0)
        !           247:        {
        !           248:        n=read(f, odata, 2000);
        !           249:        assert(n<2000);
        !           250:        for(wp=(struct wline *)odata; ( (char *)wp ) <odata+n; wp++)
        !           251:                {
        !           252:                if (atoi(wp->wday)+1<day)
        !           253:                        strncpy(wp->anam, "---", 3);
        !           254:                }
        !           255:        for(wp=(struct wline *)odata; ( (char *)wp ) <odata+n; wp++)
        !           256:                {
        !           257:                if (strncmp(wp->anam, acode, 3)==0)
        !           258:                        break;
        !           259:                }
        !           260:        if ((char *)wp >=odata+n)
        !           261:        for(wp=(struct wline *)odata; ( (char *)wp ) <odata+n; wp++)
        !           262:                {
        !           263:                if (strncmp(wp->anam, "---", 3)==0)
        !           264:                        break;
        !           265:                }
        !           266:        }
        !           267: else
        !           268:        {
        !           269:        f = creat(fname, 0666);
        !           270:        wp =  (struct wline *)odata;
        !           271:        n=0;
        !           272:        }
        !           273: sprintf(wtt, "%.3s%5.2f%6.2f%4.4s%3.3s%3.3s%-6.6s%-7.7s%c%3.3s%03d\n",
        !           274:        acode, north, west, wtime, temp, humid, weath, wind, cloud, press, day);
        !           275: strncpy(wp->anam, wtt, sizeof(*wp));
        !           276: lseek (f, 0L, 0);
        !           277: if (n<= ( (char *)wp - odata )) n+= sizeof(*wp);
        !           278: write(f, odata, n);
        !           279: close(f);
        !           280: }
        !           281: nottime(s)
        !           282:        char *s;
        !           283: {
        !           284: int c;
        !           285: if (strlen(s)!=4) return(1);
        !           286: while ( c = *s++ )
        !           287:        if (!isdigit(c)) return(1);
        !           288: return(0);
        !           289: }
        !           290: static FILE *ff = NULL;
        !           291: realfore(line, kind)
        !           292:        char *line;
        !           293: {
        !           294: char fname[50];
        !           295: if (kind==FORECAST && strncmp(line+3, " FP", 3)==0)
        !           296:        {
        !           297:        unfore();
        !           298:        line[3]=0;
        !           299:        sprintf(fname, "fore/f_%s", line);
        !           300:        ff = fopen(fname, "w");
        !           301:        airmark ("fore/f_", line);
        !           302:        }
        !           303: if (kind==FORECAST && strncmp(line, "FPUS", 4)==0)
        !           304:        {
        !           305:        unfore();
        !           306:        line[10]=0;
        !           307:        sprintf(fname, "fore/f_%s", line+7);
        !           308:        ff = fopen(fname, "w");
        !           309:        airmark ("fore/f_", line+7);
        !           310:        }
        !           311: if (kind==MARINE && strncmp(line+3, " FZ", 3)==0)
        !           312:        {
        !           313:        unfore();
        !           314:        line[3]=0;
        !           315:        sprintf(fname, "fore/m_%s", line);
        !           316:        ff = fopen(fname, "w");
        !           317:        airmark ("fore/f_", line);
        !           318:        }
        !           319: if (ff!=NULL)
        !           320:        fprintf(ff, "%s\n", line);
        !           321: }
        !           322: unfore()
        !           323: {
        !           324: if (ff!=NULL) fclose(ff);
        !           325: }
        !           326: airmark(code, aname)
        !           327:        char *code, *aname;
        !           328: {
        !           329: char fname[100], *s, xl[30];
        !           330: double nor, wes; int n, w;
        !           331: FILE *tf;
        !           332: s=airport(aname);
        !           333: if (s==NULL) return;
        !           334: sscanf(s, "%lfN %lfW", &nor, &wes);
        !           335:        n = nor; n = n - n%4;
        !           336:        w = wes; w = w - w%4;
        !           337:        sprintf(fname, "%s%.2d.%.2d", code, n, w);
        !           338:        tf = fopen(fname, "r");
        !           339:        if (tf!=NULL)
        !           340:                {
        !           341:                while (fgets(xl, 20, tf))
        !           342:                        {
        !           343:                        xl[3]=0;
        !           344:                        if (strcmp(xl, aname)==0)
        !           345:                                {
        !           346:                                fclose(tf);
        !           347:                                return;
        !           348:                                }
        !           349:                        }
        !           350:                fclose(tf);
        !           351:                }
        !           352:        tf = fopen(fname, "a");
        !           353:        if (tf==NULL) return;
        !           354:        fprintf(tf, "%3.3s %5.2f %6.2f\n", aname, nor, wes);
        !           355:        fclose(tf);
        !           356: }
        !           357: hasnxt(s)
        !           358:        char *s;
        !           359: { /* checks for more than one slash */
        !           360: if (s==NULL) return(1);
        !           361: s++;
        !           362: while (*s && !isspace(*s))
        !           363:        if (*s=='/')
        !           364:                return(1);
        !           365:        else
        !           366:                s++;
        !           367: return(0);
        !           368: }
        !           369: alldigs(s)
        !           370:        char *s;
        !           371: {
        !           372: int c;
        !           373: while (c = *s++)
        !           374:        if (!isdigit(c) && c!='-')
        !           375:                return(0);
        !           376: return(1);
        !           377: }
        !           378: startwith(s, t)
        !           379:        char *s, *t;
        !           380: {/* true if s starts with t*/
        !           381: while (isspace(*s)) s++;
        !           382: if (strncmp(s, t, strlen(t)) == 0)
        !           383:        return(1);
        !           384: return(0);
        !           385: }

unix.superglobalmegacorp.com

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