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