|
|
1.1 ! root 1: /* $Header: bits.c,v 4.3.1.4 86/10/31 15:23:53 lwall Exp $ ! 2: * ! 3: * $Log: bits.c,v $ ! 4: * Revision 4.3.1.4 86/10/31 15:23:53 lwall ! 5: * Separated firstart into two variables so KILL on new articles won't ! 6: * accidentally mark articles read. ! 7: * ! 8: * Revision 4.3.1.3 86/09/09 16:01:43 lwall ! 9: * Fixed 'n more articles' bug. ! 10: * ! 11: * Revision 4.3.1.2 86/07/24 14:40:23 lwall ! 12: * Gets host name from path instead of relay-version for news 2.10.3. ! 13: * ! 14: * Revision 4.3.1.1 85/05/10 11:31:41 lwall ! 15: * Branch for patches. ! 16: * ! 17: * Revision 4.3 85/05/01 11:36:15 lwall ! 18: * Baseline for release with 4.3bsd. ! 19: * ! 20: */ ! 21: ! 22: #include "EXTERN.h" ! 23: #include "common.h" ! 24: #include "rcstuff.h" ! 25: #include "head.h" ! 26: #include "util.h" ! 27: #include "final.h" ! 28: #include "rn.h" ! 29: #include "cheat.h" ! 30: #include "ng.h" ! 31: #include "artio.h" ! 32: #include "intrp.h" ! 33: #include "ngdata.h" ! 34: #include "rcln.h" ! 35: #include "kfile.h" ! 36: #include "INTERN.h" ! 37: #include "bits.h" ! 38: ! 39: #ifdef DBM ! 40: # ifdef NULL ! 41: # undef NULL ! 42: # endif NULL ! 43: # include <dbm.h> ! 44: #endif DBM ! 45: MEM_SIZE ctlsize; /* size of bitmap in bytes */ ! 46: ! 47: void ! 48: bits_init() ! 49: { ! 50: #ifdef DELAYMARK ! 51: dmname = savestr(filexp(RNDELNAME)); ! 52: #else ! 53: ; ! 54: #endif ! 55: } ! 56: ! 57: /* checkpoint the .newsrc */ ! 58: ! 59: void ! 60: checkpoint_rc() ! 61: { ! 62: #ifdef DEBUGGING ! 63: if (debug & DEB_CHECKPOINTING) { ! 64: fputs("(ckpt)",stdout); ! 65: fflush(stdout); ! 66: } ! 67: #endif ! 68: if (doing_ng) ! 69: restore_ng(); /* do not restore M articles */ ! 70: if (rc_changed) ! 71: write_rc(); ! 72: #ifdef DEBUGGING ! 73: if (debug & DEB_CHECKPOINTING) { ! 74: fputs("(done)",stdout); ! 75: fflush(stdout); ! 76: } ! 77: #endif ! 78: } ! 79: ! 80: /* reconstruct the .newsrc line in a human readable form */ ! 81: ! 82: void ! 83: restore_ng() ! 84: { ! 85: register char *s, *mybuf = buf; ! 86: register ART_NUM i; ! 87: ART_NUM count=0; ! 88: int safelen = LBUFLEN - 16; ! 89: ! 90: strcpy(buf,rcline[ng]); /* start with the newsgroup name */ ! 91: s = buf + rcnums[ng] - 1; /* use s for buffer pointer */ ! 92: *s++ = rcchar[ng]; /* put the requisite : or !*/ ! 93: *s++ = ' '; /* put the not-so-requisite space */ ! 94: for (i=1; i<=lastart; i++) { /* for each article in newsgroup */ ! 95: if (s-mybuf > safelen) { /* running out of room? */ ! 96: safelen *= 2; ! 97: if (mybuf == buf) { /* currently static? */ ! 98: *s = '\0'; ! 99: mybuf = safemalloc((MEM_SIZE)safelen + 16); ! 100: strcpy(mybuf,buf); /* so we must copy it */ ! 101: s = mybuf + (s-buf); ! 102: /* fix the pointer, too */ ! 103: } ! 104: else { /* just grow in place, if possible */ ! 105: char *newbuf; ! 106: ! 107: newbuf = saferealloc(mybuf,(MEM_SIZE)safelen + 16); ! 108: s = newbuf + (s-mybuf); ! 109: mybuf = newbuf; ! 110: } ! 111: } ! 112: if (!was_read(i)) /* still unread? */ ! 113: count++; /* then count it */ ! 114: else { /* article was read */ ! 115: ART_NUM oldi; ! 116: ! 117: sprintf(s,"%ld",(long)i); /* put out the min of the range */ ! 118: s += strlen(s); /* keeping house */ ! 119: oldi = i; /* remember this spot */ ! 120: do i++; while (i <= lastart && was_read(i)); ! 121: /* find 1st unread article or end */ ! 122: i--; /* backup to last read article */ ! 123: if (i > oldi) { /* range of more than 1? */ ! 124: sprintf(s,"-%ld,",(long)i); ! 125: /* then it out as a range */ ! 126: s += strlen(s); /* and housekeep */ ! 127: } ! 128: else ! 129: *s++ = ','; /* otherwise, just a comma will do */ ! 130: } ! 131: } ! 132: if (*(s-1) == ',') /* is there a final ','? */ ! 133: s--; /* take it back */ ! 134: *s++ = '\0'; /* and terminate string */ ! 135: #ifdef DEBUGGING ! 136: if (debug & DEB_NEWSRC_LINE && !panic) { ! 137: printf("%s: %s\n",rcline[ng],rcline[ng]+rcnums[ng]) FLUSH; ! 138: printf("%s\n",mybuf) FLUSH; ! 139: } ! 140: #endif ! 141: free(rcline[ng]); /* return old rc line */ ! 142: if (mybuf == buf) { ! 143: rcline[ng] = safemalloc((MEM_SIZE)(s-buf)+1); ! 144: /* grab a new rc line */ ! 145: strcpy(rcline[ng], buf); /* and load it */ ! 146: } ! 147: else { ! 148: mybuf = saferealloc(mybuf,(MEM_SIZE)(s-mybuf)+1); ! 149: /* be nice to the heap */ ! 150: rcline[ng] = mybuf; ! 151: } ! 152: *(rcline[ng] + rcnums[ng] - 1) = '\0'; ! 153: if (rcchar[ng] == NEGCHAR) { /* did they unsubscribe? */ ! 154: printf(unsubto,ngname) FLUSH; ! 155: toread[ng] = TR_UNSUB; /* make line invisible */ ! 156: } ! 157: else ! 158: /*NOSTRICT*/ ! 159: toread[ng] = (ART_UNREAD)count; /* remember how many unread there are */ ! 160: } ! 161: ! 162: /* mark an article unread, keeping track of toread[] */ ! 163: ! 164: void ! 165: onemore(artnum) ! 166: ART_NUM artnum; ! 167: { ! 168: #ifdef DEBUGGING ! 169: if (debug && artnum < firstbit) { ! 170: printf("onemore: %d < %d\n",artnum,firstbit) FLUSH; ! 171: return; ! 172: } ! 173: #endif ! 174: if (ctl_read(artnum)) { ! 175: ctl_clear(artnum); ! 176: ++toread[ng]; ! 177: } ! 178: } ! 179: ! 180: /* mark an article read, keeping track of toread[] */ ! 181: ! 182: void ! 183: oneless(artnum) ! 184: ART_NUM artnum; ! 185: { ! 186: #ifdef DEBUGGING ! 187: if (debug && artnum < firstbit) { ! 188: printf("oneless: %d < %d\n",artnum,firstbit) FLUSH; ! 189: return; ! 190: } ! 191: #endif ! 192: if (!ctl_read(artnum)) { ! 193: ctl_set(artnum); ! 194: if (toread[ng] > TR_NONE) ! 195: --toread[ng]; ! 196: } ! 197: } ! 198: ! 199: /* mark an article as unread, making sure that firstbit is properly handled */ ! 200: /* cross-references are left as read in the other newsgroups */ ! 201: ! 202: void ! 203: unmark_as_read(artnum) ! 204: ART_NUM artnum; ! 205: { ! 206: check_first(artnum); ! 207: onemore(artnum); ! 208: #ifdef MCHASE ! 209: if (!parse_maybe(artnum)) ! 210: chase_xrefs(artnum,FALSE); ! 211: #endif ! 212: } ! 213: ! 214: #ifdef DELAYMARK ! 215: /* temporarily mark article as read. When newsgroup is exited, articles */ ! 216: /* will be marked as unread. Called via M command */ ! 217: ! 218: void ! 219: delay_unmark(artnum) ! 220: ART_NUM artnum; ! 221: { ! 222: if (dmfp == Nullfp) { ! 223: dmfp = fopen(dmname,"w"); ! 224: if (dmfp == Nullfp) { ! 225: printf(cantcreate,dmname) FLUSH; ! 226: sig_catcher(0); ! 227: } ! 228: } ! 229: oneless(artnum); /* set the correct bit */ ! 230: dmcount++; ! 231: fprintf(dmfp,"%ld\n",(long)artnum); ! 232: } ! 233: #endif ! 234: ! 235: /* mark article as read. If article is cross referenced to other */ ! 236: /* newsgroups, mark them read there also. */ ! 237: ! 238: void ! 239: mark_as_read(artnum) ! 240: ART_NUM artnum; ! 241: { ! 242: oneless(artnum); /* set the correct bit */ ! 243: checkcount++; /* get more worried about crashes */ ! 244: chase_xrefs(artnum,TRUE); ! 245: } ! 246: ! 247: /* make sure we have bits set correctly down to firstbit */ ! 248: ! 249: void ! 250: check_first(min) ! 251: ART_NUM min; ! 252: { ! 253: register ART_NUM i = firstbit; ! 254: ! 255: if (min < absfirst) ! 256: min = absfirst; ! 257: if (min < i) { ! 258: for (i--; i>=min; i--) ! 259: ctl_set(i); /* mark as read */ ! 260: firstart = firstbit = min; ! 261: } ! 262: } ! 263: ! 264: /* bring back articles marked with M */ ! 265: ! 266: #ifdef DELAYMARK ! 267: void ! 268: yankback() ! 269: { ! 270: register ART_NUM anum; ! 271: ! 272: if (dmfp) { /* delayed unmarks pending? */ ! 273: #ifdef VERBOSE ! 274: printf("\nReturning %ld Marked article%s...\n",(long)dmcount, ! 275: dmcount == 1 ? nullstr : "s") FLUSH; ! 276: #endif ! 277: fclose(dmfp); ! 278: if (dmfp = fopen(dmname,"r")) { ! 279: while (fgets(buf,sizeof buf,dmfp) != Nullch) { ! 280: anum = (ART_NUM)atol(buf); ! 281: /*NOSTRICT*/ ! 282: onemore(anum); /* then unmark them */ ! 283: #ifdef MCHASE ! 284: chase_xrefs(anum,FALSE); ! 285: #endif ! 286: } ! 287: fclose(dmfp); ! 288: dmfp = Nullfp; ! 289: UNLINK(dmname); /* and be tidy */ ! 290: } ! 291: else { ! 292: printf(cantopen,dmname) FLUSH; ! 293: sig_catcher(0); ! 294: } ! 295: } ! 296: dmcount = 0; ! 297: } ! 298: #endif ! 299: ! 300: /* run down xref list and mark as read or unread */ ! 301: ! 302: int ! 303: chase_xrefs(artnum,markread) ! 304: ART_NUM artnum; ! 305: int markread; ! 306: { ! 307: #ifdef ASYNC_PARSE ! 308: if (parse_maybe(artnum)) /* make sure we have right header */ ! 309: return -1; ! 310: #endif ! 311: #ifdef DBM ! 312: { ! 313: datum lhs, rhs; ! 314: datum fetch(); ! 315: register char *idp; ! 316: char *ident_buf; ! 317: static FILE * hist_file = Nullfp; ! 318: #else ! 319: if ( ! 320: #ifdef DEBUGGING ! 321: debug & DEB_FEED_XREF || ! 322: #endif ! 323: htype[XREF_LINE].ht_minpos >= 0) { ! 324: /* are there article# xrefs? */ ! 325: #endif DBM ! 326: char *xref_buf, *curxref; ! 327: register char *xartnum; ! 328: char *rver_buf = Nullch; ! 329: static char *inews_site = Nullch; ! 330: register ART_NUM x; ! 331: char tmpbuf[128]; ! 332: ! 333: #ifdef DBM ! 334: rver_buf = fetchlines(artnum,NGS_LINE); ! 335: /* get Newsgroups */ ! 336: if (!index(rver_buf,',')) /* if no comma, no Xref! */ ! 337: return 0; ! 338: if (hist_file == Nullfp) { /* Init. file accesses */ ! 339: #ifdef DEBUGGING ! 340: if (debug) ! 341: printf ("chase_xref: opening files\n"); ! 342: #endif ! 343: dbminit(filexp(ARTFILE)); ! 344: if ((hist_file = fopen (filexp(ARTFILE), "r")) == Nullfp) ! 345: return 0; ! 346: } ! 347: xref_buf = safemalloc((MEM_SIZE)BUFSIZ); ! 348: ident_buf = fetchlines(artnum,MESSID_LINE); ! 349: /* get Message-ID */ ! 350: #ifdef DEBUGGING ! 351: if (debug) ! 352: printf ("chase_xref: Message-ID: %s\n", ident_buf); ! 353: #endif ! 354: idp = ident_buf; ! 355: while (*++idp) /* make message-id case insensitive */ ! 356: if (isupper(*idp)) ! 357: *idp = tolower (*idp); ! 358: lhs.dptr = ident_buf; /* look up article by id */ ! 359: lhs.dsize = strlen(lhs.dptr) + 1; ! 360: rhs = fetch(lhs); /* fetch the record */ ! 361: if (rhs.dptr == NULL) /* if null, nothing there */ ! 362: goto wild_goose; ! 363: fseek (hist_file, *((long *)rhs.dptr), 0); ! 364: /* datum returned is position in hist file */ ! 365: fgets (xref_buf, BUFSIZ, hist_file); ! 366: #ifdef DEBUGGING ! 367: if (debug) ! 368: printf ("Xref from history: %s\n", xref_buf); ! 369: #endif ! 370: curxref = cpytill(tmpbuf, xref_buf, '\t') + 1; ! 371: curxref = cpytill(tmpbuf, curxref, '\t') + 1; ! 372: #ifdef DEBUGGING ! 373: if (debug) ! 374: printf ("chase_xref: curxref: %s\n", curxref); ! 375: #endif ! 376: #else !DBM ! 377: #ifdef DEBUGGING ! 378: if (htype[XREF_LINE].ht_minpos >= 0) ! 379: #endif ! 380: xref_buf = fetchlines(artnum,XREF_LINE); ! 381: /* get xrefs list */ ! 382: #ifdef DEBUGGING ! 383: else { ! 384: xref_buf = safemalloc((MEM_SIZE)100); ! 385: printf("Give Xref: ") FLUSH; ! 386: gets(xref_buf); ! 387: } ! 388: #endif ! 389: #ifdef DEBUGGING ! 390: if (debug & DEB_XREF_MARKER) ! 391: printf("Xref: %s\n",xref_buf) FLUSH; ! 392: #endif ! 393: curxref = cpytill(tmpbuf,xref_buf,' ') + 1; ! 394: ! 395: /* Make sure site name on Xref matches what inews thinks site is. ! 396: * Check first against last inews_site. If it matches, fine. ! 397: * If not, fetch inews_site from current Relay-Version line and ! 398: * check again. This is so that if the new administrator decides ! 399: * to change the system name as known to inews, rn will still do ! 400: * Xrefs correctly--each article need only match itself to be valid. ! 401: */ ! 402: if (inews_site == Nullch || strNE(tmpbuf,inews_site)) { ! 403: char *t; ! 404: ! 405: if (inews_site != Nullch) ! 406: free(inews_site); ! 407: #ifndef NORELAY ! 408: rver_buf = fetchlines(artnum,RVER_LINE); ! 409: if ((t = instr(rver_buf,"; site ")) == Nullch) ! 410: #else NORELAY ! 411: /* In version 2.10.3 of news or afterwards, the Relay-Version ! 412: * and Posting-Version header lines have been removed. For ! 413: * the code below to work as intended, I have modified it to ! 414: * extract the first component of the Path header line. This ! 415: * should give the same effect as did the old code with respect ! 416: * to the use of the Relay-Version site name. ! 417: */ ! 418: rver_buf = fetchlines(artnum,PATH_LINE); ! 419: if ((t = instr(rver_buf,"!")) == Nullch) ! 420: #endif NORELAY ! 421: inews_site = savestr(nullstr); ! 422: else { ! 423: char new_site[128]; ! 424: ! 425: #ifndef NORELAY ! 426: cpytill(new_site,t + 7,'.'); ! 427: #else NORELAY ! 428: cpytill(new_site,rver_buf,'!'); ! 429: #endif NORELAY ! 430: inews_site = savestr(new_site); ! 431: } ! 432: if (strNE(tmpbuf,inews_site)) { ! 433: #ifdef DEBUGGING ! 434: if (debug) ! 435: printf("Xref not from %s--ignoring\n",inews_site) FLUSH; ! 436: #endif ! 437: goto wild_goose; ! 438: } ! 439: } ! 440: #endif DBM ! 441: while (*curxref) { ! 442: /* for each newsgroup */ ! 443: curxref = cpytill(tmpbuf,curxref,' '); ! 444: #ifdef DBM ! 445: xartnum = index(tmpbuf,'/'); ! 446: #else ! 447: xartnum = index(tmpbuf,':'); ! 448: #endif DBM ! 449: if (!xartnum) /* probably an old-style Xref */ ! 450: break; ! 451: *xartnum++ = '\0'; ! 452: if (strNE(tmpbuf,ngname)) {/* not the current newsgroup? */ ! 453: x = atol(xartnum); ! 454: if (x) ! 455: if (markread) { ! 456: if (addartnum(x,tmpbuf)) ! 457: goto wild_goose; ! 458: } ! 459: #ifdef MCHASE ! 460: else ! 461: subartnum(x,tmpbuf); ! 462: #endif ! 463: } ! 464: while (*curxref && isspace(*curxref)) ! 465: curxref++; ! 466: } ! 467: wild_goose: ! 468: free(xref_buf); ! 469: #ifdef DBM ! 470: free(ident_buf); ! 471: #endif DBM ! 472: if (rver_buf != Nullch) ! 473: free(rver_buf); ! 474: } ! 475: return 0; ! 476: } ! 477: ! 478: int ! 479: initctl() ! 480: { ! 481: char *mybuf = buf; /* place to decode rc line */ ! 482: register char *s, *c, *h; ! 483: register long i; ! 484: register ART_NUM unread; ! 485: ! 486: #ifdef DELAYMARK ! 487: dmcount = 0; ! 488: #endif ! 489: if ((lastart = getngsize(ng)) < 0) /* this cannot happen (laugh here) */ ! 490: return -1; ! 491: ! 492: absfirst = getabsfirst(ng,lastart); /* remember first existing article */ ! 493: if (!absfirst) /* no articles at all? */ ! 494: absfirst = 1; /* pretend there is one */ ! 495: #ifndef lint ! 496: ctlsize = (MEM_SIZE)(OFFSET(lastart)/BITSPERBYTE+20); ! 497: #endif lint ! 498: ctlarea = safemalloc(ctlsize); /* allocate control area */ ! 499: ! 500: /* now modify ctlarea to reflect what has already been read */ ! 501: ! 502: for (s = rcline[ng] + rcnums[ng]; *s == ' '; s++) ; ! 503: /* find numbers in rc line */ ! 504: i = strlen(s); ! 505: #ifndef lint ! 506: if (i >= LBUFLEN-2) /* bigger than buf? */ ! 507: mybuf = safemalloc((MEM_SIZE)(i+2)); ! 508: #endif lint ! 509: strcpy(mybuf,s); /* make scratch copy of line */ ! 510: mybuf[i++] = ','; /* put extra comma on the end */ ! 511: mybuf[i] = '\0'; ! 512: s = mybuf; /* initialize the for loop below */ ! 513: if (strnEQ(s,"1-",2)) { /* can we save some time here? */ ! 514: firstbit = atol(s+2)+1; /* ignore first range thusly */ ! 515: s=index(s,',') + 1; ! 516: } ! 517: else ! 518: firstbit = 1; /* all the bits are valid for now */ ! 519: if (absfirst > firstbit) { /* do we know already? */ ! 520: firstbit = absfirst; /* no point calling getngmin again */ ! 521: } ! 522: else if (artopen(firstbit) == Nullfp) { ! 523: /* first unread article missing? */ ! 524: i = getngmin(".",firstbit); /* see if expire has been busy */ ! 525: if (i) { /* avoid a bunch of extra opens */ ! 526: firstbit = i; ! 527: } ! 528: } ! 529: firstart = firstbit; /* firstart > firstbit in KILL */ ! 530: #ifdef PENDING ! 531: # ifdef CACHESUBJ ! 532: subj_to_get = firstbit; ! 533: # endif ! 534: #endif ! 535: unread = lastart - firstbit + 1; /* assume this range unread */ ! 536: for (i=OFFSET(firstbit)/BITSPERBYTE; i<ctlsize; i++) ! 537: ctlarea[i] = 0; /* assume unread */ ! 538: #ifdef DEBUGGING ! 539: if (debug & DEB_CTLAREA_BITMAP) { ! 540: printf("\n%s\n",mybuf) FLUSH; ! 541: for (i=1; i <= lastart; i++) ! 542: if (! was_read(i)) ! 543: printf("%ld ",(long)i) FLUSH; ! 544: } ! 545: #endif ! 546: for ( ; (c = index(s,',')) != Nullch; s = ++c) { ! 547: /* for each range */ ! 548: ART_NUM min, max; ! 549: ! 550: *c = '\0'; /* do not let index see past comma */ ! 551: if ((h = index(s,'-')) != Nullch) { /* is there a -? */ ! 552: min = atol(s); ! 553: max = atol(h+1); ! 554: if (min < firstbit) /* make sure range is in range */ ! 555: min = firstbit; ! 556: if (max > lastart) ! 557: max = lastart; ! 558: if (min <= max) /* non-null range? */ ! 559: unread -= max - min + 1;/* adjust unread count */ ! 560: for (i=min; i<=max; i++) /* for all articles in range */ ! 561: ctl_set(i); /* mark them read */ ! 562: } ! 563: else if ((i = atol(s)) >= firstbit && i <= lastart) { ! 564: /* is single number reasonable? */ ! 565: ctl_set(i); /* mark it read */ ! 566: unread--; /* decrement articles to read */ ! 567: } ! 568: #ifdef DEBUGGING ! 569: if (debug & DEB_CTLAREA_BITMAP) { ! 570: printf("\n%s\n",s) FLUSH; ! 571: for (i=1; i <= lastart; i++) ! 572: if (! was_read(i)) ! 573: printf("%ld ",(long)i) FLUSH; ! 574: } ! 575: #endif ! 576: } ! 577: #ifdef DEBUGGING ! 578: if (debug & DEB_CTLAREA_BITMAP) { ! 579: fputs("\n(hit CR)",stdout) FLUSH; ! 580: gets(cmd_buf); ! 581: } ! 582: #endif ! 583: if (mybuf != buf) ! 584: free(mybuf); ! 585: toread[ng] = unread; ! 586: return 0; ! 587: } ! 588: ! 589: void ! 590: grow_ctl() ! 591: { ! 592: ART_NUM newlast; ! 593: ART_NUM tmpfirst; ! 594: MEM_SIZE newsize; ! 595: register ART_NUM i; ! 596: ! 597: forcegrow = FALSE; ! 598: newlast = getngsize(ng); ! 599: if (newlast > lastart) { ! 600: ART_NUM tmpart = art; ! 601: #ifndef lint ! 602: newsize = (MEM_SIZE)(OFFSET(newlast)/BITSPERBYTE+2); ! 603: #else ! 604: newsize = Null(MEM_SIZE); ! 605: #endif lint ! 606: if (newsize > ctlsize) { ! 607: newsize += 20; ! 608: ctlarea = saferealloc(ctlarea,newsize); ! 609: ctlsize = newsize; ! 610: } ! 611: toread[ng] += (ART_UNREAD)(newlast-lastart); ! 612: for (i=lastart+1; i<=newlast; i++) ! 613: ctl_clear(i); /* these articles are unread */ ! 614: #ifdef CACHESUBJ ! 615: if (subj_list != Null(char**)) { ! 616: #ifndef lint ! 617: subj_list = (char**)saferealloc((char*)subj_list, ! 618: (MEM_SIZE)((OFFSET(newlast)+2)*sizeof(char *)) ); ! 619: #endif lint ! 620: for (i=lastart+1; i<=newlast; i++) ! 621: subj_list[OFFSET(i)] = Nullch; ! 622: } ! 623: #endif ! 624: tmpfirst = lastart+1; ! 625: lastart = newlast; ! 626: #ifdef KILLFILES ! 627: #ifdef VERBOSE ! 628: IF(verbose) ! 629: sprintf(buf, ! 630: "%ld more article%s arrived--looking for more to kill...\n\n", ! 631: (long)(lastart - tmpfirst + 1), ! 632: (lastart > tmpfirst ? "s have" : " has" ) ); ! 633: ELSE /* my, my, how clever we are */ ! 634: #endif ! 635: #ifdef TERSE ! 636: strcpy(buf, "More news--killing...\n\n"); ! 637: #endif ! 638: kill_unwanted(tmpfirst,buf,TRUE); ! 639: #endif ! 640: art = tmpart; ! 641: } ! 642: } ! 643:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.