|
|
1.1 ! root 1: # include "stdio.h" ! 2: # include "ctype.h" ! 3: # include "assert.h" ! 4: # include "signal.h" ! 5: # include "sys/types.h" ! 6: # include "sys/stat.h" ! 7: # include "cbt.h" ! 8: # include "time.h" ! 9: char names[20][14]; ! 10: char heads[20][50]; ! 11: # define NST 200 ! 12: char storylist[NST][12]; ! 13: int stc=0; ! 14: int intr(); ! 15: char *getlogin(), *ctime(); ! 16: struct tm *localtime(); ! 17: int day, yesterday; ! 18: int stp=0; ! 19: int inolim=0; ! 20: int inodes[NST+5]; ! 21: char *getenv(), *getpwd(); ! 22: char nowfile[20]=""; ! 23: char nowhead[50]; ! 24: char pwdir[50]; ! 25: long filtim(); ! 26: char *storydir = "/usr/spool/ap"; ! 27: ! 28: /* logging */ ! 29: char *apnlog = "/usr/spool/ap/apnlog"; ! 30: long tmstart, tmend; ! 31: int nslug, nstory, nsearch; ! 32: ! 33: main(argc,argv) ! 34: char *argv[]; ! 35: { ! 36: char line[100]; ! 37: int i, lc=1; ! 38: long l; ! 39: char *ctp, *userp; ! 40: char forcebuf[BUFSIZ]; ! 41: setbuf(stdout, forcebuf); ! 42: for (argc--,argv++; argc>0 && argv[0][0]=='-'; argc--,argv++) ! 43: switch(argv[0][1]) ! 44: { ! 45: case 'f': ! 46: storydir = argv[1]; ! 47: argv++; argc--; ! 48: break; ! 49: } ! 50: tmstart = l = time(0); ! 51: day = localtime(&l)->tm_mday; ! 52: l -= 86400; /* go back one day */ ! 53: yesterday = localtime(&l)->tm_mday; ! 54: signal (SIGINT, intr); ! 55: strcpy(pwdir, getpwd()); ! 56: i = chdir(storydir); ! 57: if (i!=0) ! 58: { ! 59: fprintf(stderr, "no directory %s\n",storydir); ! 60: exit(1); ! 61: } ! 62: top(); ! 63: extend(20); ! 64: display(); ! 65: menu(lc); ! 66: fflush(stdout); ! 67: extend(30); ! 68: while (gets(line)) ! 69: { ! 70: tpos(0,0); ! 71: if (line[0]!=0) ! 72: rate(); ! 73: switch(line[0]) ! 74: { ! 75: case '0': case '1': case '2': case '3': case '4': ! 76: case '5': case '6': case '7': case '8': case '9': ! 77: i = atoi(line)-1; ! 78: if (i<0 || i>19) continue; ! 79: pr(names[i], heads[i]); ! 80: nstory++; ! 81: lc=0; ! 82: break; ! 83: case 0: /* continue this story */ ! 84: if (lc==0) ! 85: pr(0,0); ! 86: else if (lc==1) ! 87: display(); ! 88: else if (lc==2) ! 89: sums(); ! 90: if (lc>0) menu(lc); ! 91: break; ! 92: case '?': ! 93: menu(0); ! 94: break; ! 95: case '!': ! 96: system(line+1); ! 97: break; ! 98: case '.': ! 99: disprint(); ! 100: break; ! 101: case 'a': ! 102: pr(line, ""); ! 103: nstory++; ! 104: lc=0; ! 105: break; ! 106: case '+': ! 107: case 'm': ! 108: shorten(line+1); ! 109: display(); ! 110: lc=1; ! 111: break; ! 112: case 'M': ! 113: sums(); ! 114: menu(lc=2); ! 115: break; ! 116: case 't': ! 117: top(); ! 118: extend(20); ! 119: shorten(line+1); ! 120: display(); ! 121: menu(lc=1); ! 122: break; ! 123: case 'T': ! 124: top(); ! 125: extend(20); ! 126: sums(); ! 127: menu(lc=2); ! 128: break; ! 129: case 'c': ! 130: case 'C': /* copy file to my directory */ ! 131: i = atoi(line+1); ! 132: if (i>0) ! 133: strcpy(nowfile, names[i-1]); ! 134: copyto(line+1, nowfile); ! 135: break; ! 136: case 'D': /* delete file*/ ! 137: i = atoi(line+1); ! 138: if (i>0) ! 139: strcpy(nowfile, names[i-1]); ! 140: printf("Deleting /%s/\n",nowfile); ! 141: unlink(nowfile); ! 142: break; ! 143: case 'Y': ! 144: case 'y': /* must get keyword list */ ! 145: getkeys(line[0]=='Y'); ! 146: break; ! 147: case 'S': ! 148: case 's': /* search for words */ ! 149: wdsearch (line+1, line[0]=='S'); ! 150: nsearch++; ! 151: break; ! 152: case 'q': ! 153: tpos(23,0); ! 154: wrap(); ! 155: } ! 156: fflush(stdout); ! 157: } ! 158: tpos(23,0); ! 159: wrap(); ! 160: } ! 161: intr() ! 162: { ! 163: tpos(23,0); ! 164: wrap(); ! 165: exit(0); ! 166: } ! 167: int llens[10] ={70,70,70,70,70,70,70,70,70,70}; ! 168: pr (s, h) ! 169: char *s, *h; ! 170: { ! 171: static FILE *f=NULL; ! 172: char line[120]; ! 173: int i, k, k1; ! 174: if (s && s[0]==0) ! 175: return; ! 176: if (s!=0) ! 177: { ! 178: if (f!= NULL) fclose(f); ! 179: f = fopen(s, "r"); ! 180: if (f==NULL) ! 181: { ! 182: printf("No file %s\n", s); ! 183: return; ! 184: } ! 185: strcpy(nowfile, s); ! 186: strcpy(nowhead, h); ! 187: } ! 188: else ! 189: if (f==NULL) return; ! 190: tpos(12,0); ! 191: if (ifclear()) ! 192: clr2end(); ! 193: for(i=0; i<10; i++) ! 194: { ! 195: if(fgets(line, 100, f)==0) ! 196: break; ! 197: trimnl(line); ! 198: k = strlen(line); ! 199: if (line[0]=='\t') k+= 7; ! 200: if (!ifclear() &&ifclrline()) ! 201: clrline(); ! 202: fputs(line, stdout); ! 203: if (!ifclear() && !ifclrline()) ! 204: for(k1=llens[i]; k1>k; k1--) ! 205: putchar(' '); ! 206: printf("\n"); ! 207: llens[i]=k+1; ! 208: } ! 209: } ! 210: trimnl(s) ! 211: char *s; ! 212: { ! 213: while (*s) s++; ! 214: if (*--s == '\n') *s=0; ! 215: } ! 216: static hfgate=0; ! 217: static char hfbuff[5000]; ! 218: static char *hflab[400]; ! 219: static int hftop=0; ! 220: hfast (out, snam) ! 221: char *out, *snam; ! 222: { ! 223: char *s; ! 224: int i; ! 225: if (hfgate==0) ! 226: { ! 227: int f, n; ! 228: char fn[40], *index(); ! 229: sprintf(fn, "%s/.S%d", storydir, day); ! 230: f = open(fn, 0); ! 231: if (f<0) return(0); ! 232: n= read (f, hfbuff, 5000); ! 233: hfbuff[n]=0; ! 234: close(f); ! 235: hfgate=1; ! 236: s = hfbuff; ! 237: for(hftop=0; hftop<400; hftop++) ! 238: { ! 239: if (*s==0) break; ! 240: hflab[hftop] = s; ! 241: s = index(s, '\n'); ! 242: if (s==NULL) break; ! 243: *s++ = 0; ! 244: } ! 245: } ! 246: for(i=0; i<hftop; i++) ! 247: { ! 248: if (strncmp(snam, hflab[i], 5)==0 && hflab[i][6] !=0) ! 249: { ! 250: strcpy(out, hflab[i]+6); ! 251: return(1); ! 252: } ! 253: } ! 254: return(0); ! 255: } ! 256: hget(s, f) ! 257: char s[]; ! 258: FILE *f; ! 259: { ! 260: int i, c, nw; ! 261: char line[100], *wv[40], *p; ! 262: if (f==NULL) ! 263: { ! 264: *s=0; ! 265: return; ! 266: } ! 267: fgets(line, 100, f); ! 268: trimnl(line); ! 269: if (line[1]==' ' && line[3]==' ' && line[6]=='-') /* their heading */ ! 270: { ! 271: for(p=line+7; (c = *p) && c!=' '; p++) ! 272: *s++ = c; ! 273: *s=0; ! 274: return; ! 275: } ! 276: nw = getargs(line, wv); ! 277: strcpy(s, wv[i=pickbig(wv, nw)]); ! 278: wv[i]=""; ! 279: strcat(s, wv[pickbig(wv,nw)]); ! 280: return; ! 281: } ! 282: notnew(i, inodes, fname) ! 283: char *fname; ! 284: int *inodes; ! 285: { ! 286: int ino, j; ! 287: struct stat stbuff; ! 288: stat (fname, &stbuff); ! 289: ino = stbuff.st_ino; ! 290: for(j=0; j<i; j++) ! 291: if (ino==inodes[j]) ! 292: return(1); ! 293: inodes[i]=ino; ! 294: return(0); ! 295: } ! 296: display() ! 297: { ! 298: getnam(20); ! 299: disprint(); ! 300: nslug += 20; ! 301: } ! 302: disprint() ! 303: { ! 304: int i, kl, a; ! 305: char bform[30]; ! 306: FILE *fl; ! 307: startsc(); ! 308: for(i=0; i<20; i++) ! 309: { ! 310: if (names[i][0]== '\0') ! 311: break; ! 312: if (hfast(heads[i], names[i])) ! 313: continue; ! 314: fl = fopen(names[i], "r"); ! 315: if (fl!=NULL) ! 316: { ! 317: hget(heads[i],fl); ! 318: fclose(fl); ! 319: } ! 320: else ! 321: heads[i][0]=names[i][0]=0; ! 322: } ! 323: for(kl=i=0; i<10; i++) ! 324: { ! 325: a = strlen(heads[i]); ! 326: if (a>kl) kl=a; ! 327: } ! 328: kl += 6; ! 329: if (kl>30) kl=30; ! 330: sprintf(bform, "%%3d: (%%5s) %%-%d.%ds ", kl, kl); ! 331: for(i=0; i<10; i++) ! 332: { ! 333: char xheads[50], yheads[50]; ! 334: clrline(); ! 335: ! 336: sprintf(xheads, "%s [%c]", heads[i], scr(names[i])); ! 337: sprintf(yheads, "%s [%c]", heads[i+10], scr(names[i+10])); ! 338: if (strlen(names[i])<=5) ! 339: printf(bform, i+1, names[i], xheads); ! 340: else ! 341: printf("%3d: (%11s) %-19.19s ",i+1,names[i],xheads); ! 342: printf("%3d: (%5s) %.30s\n",i+11,names[i+10],yheads); ! 343: } ! 344: nowfile[0]=0; ! 345: } ! 346: top() ! 347: { ! 348: char tstories[NST][6]; ! 349: int f, n, i, j; ! 350: stc = inolim = stp = 0; ! 351: f = open("..tlist", 0); ! 352: if (f<0) return; ! 353: n = read(f, tstories, NST*6); ! 354: stc = n/6; ! 355: /* reverse tstories */ ! 356: for(i=0, j=stc-1; i<j; i++,j--) ! 357: { ! 358: char x[6]; ! 359: strncpy(x,tstories[i],6); ! 360: strncpy(tstories[i],tstories[j],6); ! 361: strncpy(tstories[j],x,6); ! 362: } ! 363: close(f); ! 364: for(i=0; i<stc; i++) ! 365: { ! 366: strncpy(storylist[i],tstories[i],6); ! 367: storylist[i][6]= 0; ! 368: } ! 369: } ! 370: getnam(n) ! 371: { ! 372: int i; ! 373: for (i=0; i<n; i++) ! 374: heads[i][0]= names[i][0]= '\0'; ! 375: for (i=0; i<n; i++) ! 376: { ! 377: try: ! 378: if (stp>=stc) break; ! 379: strcpy(names[i], storylist[stp++]); ! 380: ! 381: if (!interest(names[i])) goto try; ! 382: if (names[i][0]=='a' && isdigit(names[i][1])) ! 383: continue; ! 384: if (names[i][5]=='.' && names[i][6]=='a' && ! 385: isdigit(names[i][7])) ! 386: continue; ! 387: goto try; ! 388: } ! 389: } ! 390: sums() ! 391: { ! 392: int i; ! 393: startsc(); ! 394: getnam(10); ! 395: for (i=0; i<10; i++) ! 396: { ! 397: printf("%d ",i+1); ! 398: prsum(names[i]); ! 399: } ! 400: } ! 401: wrap() ! 402: { ! 403: FILE *f; ! 404: tmend = time(0); ! 405: f = fopen(apnlog, "a"); ! 406: if (f!=NULL) ! 407: { ! 408: fprintf(f, ! 409: "%s slugs %d stories %d searches %d dir %s %.16s %d secs\n", ! 410: getlogin(), nslug, nstory, nsearch, storydir, ! 411: ctime(&tmstart), tmend-tmstart); ! 412: fclose(f); ! 413: } ! 414: exit(0); ! 415: } ! 416: rate() ! 417: { ! 418: char line[100]; int r; ! 419: if (nowfile[0]==0) return; ! 420: tpos(12,0); ! 421: if (ifclear()) ! 422: clr2end(); ! 423: else ! 424: if (ifclrline()) ! 425: {clrline(); tpos(13,0); clrline();} ! 426: tpos(12,0); ! 427: printf("Please rate story %s: 1 bad, 5 good: ", nowhead); ! 428: fflush(stdout); ! 429: gets(line); ! 430: r = atoi(line); ! 431: if (r<0) r=0; ! 432: if (r>5) r=5; ! 433: upd(nowfile, r); ! 434: } ! 435: ! 436: short nread[1000]; ! 437: short neval[1000]; ! 438: short tscor[1000]; ! 439: short sqscr[1000]; ! 440: static char * scname = "Scores"; ! 441: short nvl[1000]; ! 442: int ngate=0; ! 443: upd(nm, r) ! 444: { ! 445: int f, n; ! 446: n = atoi(nm+1); ! 447: if (n<=0 || n>999) return; ! 448: f = open(scname, 0); ! 449: if (f>0) ! 450: { ! 451: ngate=1; ! 452: read(f, nread, 2000); ! 453: read(f, neval, 2000); ! 454: read(f, tscor, 2000); ! 455: read(f, sqscr, 2000); ! 456: close(f); ! 457: } ! 458: if (r>10) return; ! 459: nread[n]++; ! 460: if (r>0) ! 461: { ! 462: neval[n]++; ! 463: tscor[n]+=r; ! 464: sqscr[n]+= r*r; ! 465: } ! 466: f = creat(scname, 0666); ! 467: if (f>0) ! 468: { ! 469: write(f, nread, 2000); ! 470: write (f, neval, 2000); ! 471: write (f, tscor, 2000); ! 472: write (f, sqscr, 2000); ! 473: close(f); ! 474: } ! 475: } ! 476: scr(s) ! 477: char *s; ! 478: { ! 479: int n; ! 480: double x; ! 481: if (ngate==0) upd (" 100", 100); ! 482: n = atoi(s+1); ! 483: if (neval[n]==0) ! 484: return(' '); ! 485: x = (double) tscor[n]; ! 486: x /= neval[n]; ! 487: x += 0.5; ! 488: n = (int) x; ! 489: return(n+'0'); ! 490: } ! 491: ctr(s) ! 492: char *s; ! 493: { ! 494: int n; ! 495: n = atoi(s+1); ! 496: return(nread[n]); ! 497: } ! 498: int intlevel=0; ! 499: shorten(s) ! 500: char *s; ! 501: { ! 502: if (*s!='>') intlevel=0; ! 503: else ! 504: intlevel = atoi(s+1); ! 505: if (intlevel>5) intlevel=5; ! 506: } ! 507: interest(s) ! 508: char *s; ! 509: { ! 510: int n; ! 511: if (intlevel<=0) return(1); ! 512: n = atoi(s+1); ! 513: upd("", 100); ! 514: if (neval[n]==0) return(0); ! 515: if ( (double)tscor[n]/neval[n] > intlevel) return(1); ! 516: return(0); ! 517: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.