|
|
1.1 ! root 1: /* $Header: rcstuff.c,v 4.3.1.5 86/07/24 14:09:10 lwall Exp $ ! 2: * ! 3: * $Log: rcstuff.c,v $ ! 4: * Revision 4.3.1.5 86/07/24 14:09:10 lwall ! 5: * Removed check for spool directory existence in get_ng. ! 6: * ! 7: * Revision 4.3.1.4 85/09/10 11:04:44 lwall ! 8: * Improved %m in in_char(). ! 9: * ! 10: * Revision 4.3.1.3 85/05/29 09:13:25 lwall ! 11: * %d that should be %ld. ! 12: * ! 13: * Revision 4.3.1.2 85/05/17 11:40:08 lwall ! 14: * Sped up "rn -c" by not mallocing unnecessarily. ! 15: * ! 16: * Revision 4.3.1.1 85/05/10 11:37:18 lwall ! 17: * Branch for patches. ! 18: * ! 19: * Revision 4.3 85/05/01 11:45:56 lwall ! 20: * Baseline for release with 4.3bsd. ! 21: * ! 22: */ ! 23: ! 24: #include "EXTERN.h" ! 25: #include "common.h" ! 26: #include "util.h" ! 27: #include "ngdata.h" ! 28: #include "term.h" ! 29: #include "final.h" ! 30: #include "rn.h" ! 31: #include "intrp.h" ! 32: #include "only.h" ! 33: #include "rcln.h" ! 34: #include "INTERN.h" ! 35: #include "rcstuff.h" ! 36: ! 37: char *rcname INIT(Nullch); /* path name of .newsrc file */ ! 38: char *rctname INIT(Nullch); /* path name of temp .newsrc file */ ! 39: char *rcbname INIT(Nullch); /* path name of backup .newsrc file */ ! 40: char *softname INIT(Nullch); /* path name of .rnsoft file */ ! 41: FILE *rcfp INIT(Nullfp); /* .newsrc file pointer */ ! 42: ! 43: #ifdef HASHNG ! 44: short hashtbl[HASHSIZ]; ! 45: #endif ! 46: ! 47: bool ! 48: rcstuff_init() ! 49: { ! 50: register NG_NUM newng; ! 51: register char *s; ! 52: register int i; ! 53: register bool foundany = FALSE; ! 54: char *some_buf; ! 55: long length; ! 56: ! 57: #ifdef HASHNG ! 58: for (i=0; i<HASHSIZ; i++) ! 59: hashtbl[i] = -1; ! 60: #endif ! 61: ! 62: /* make filenames */ ! 63: ! 64: rcname = savestr(filexp(RCNAME)); ! 65: rctname = savestr(filexp(RCTNAME)); ! 66: rcbname = savestr(filexp(RCBNAME)); ! 67: softname = savestr(filexp(SOFTNAME)); ! 68: ! 69: /* make sure the .newsrc file exists */ ! 70: ! 71: newsrc_check(); ! 72: ! 73: /* open .rnsoft file containing soft ptrs to active file */ ! 74: ! 75: tmpfp = fopen(softname,"r"); ! 76: if (tmpfp == Nullfp) ! 77: writesoft = TRUE; ! 78: ! 79: /* read in the .newsrc file */ ! 80: ! 81: for (nextrcline = 0; ! 82: (some_buf = get_a_line(buf,LBUFLEN,rcfp)) != Nullch; ! 83: nextrcline++) { ! 84: /* for each line in .newsrc */ ! 85: char tmpbuf[10]; ! 86: ! 87: newng = nextrcline; /* get it into a register */ ! 88: length = len_last_line_got; /* side effect of get_a_line */ ! 89: if (length <= 1) { /* only a newline??? */ ! 90: nextrcline--; /* compensate for loop increment */ ! 91: continue; ! 92: } ! 93: if (newng >= MAXRCLINE) { /* check for overflow */ ! 94: fputs("Too many lines in .newsrc\n",stdout) FLUSH; ! 95: finalize(1); ! 96: } ! 97: if (tmpfp != Nullfp && fgets(tmpbuf,10,tmpfp) != Nullch) ! 98: softptr[newng] = atoi(tmpbuf); ! 99: else ! 100: softptr[newng] = 0; ! 101: some_buf[--length] = '\0'; /* wipe out newline */ ! 102: if (checkflag) /* no extra mallocs for -c */ ! 103: rcline[newng] = some_buf; ! 104: else if (some_buf == buf) { ! 105: rcline[newng] = savestr(some_buf); ! 106: /* make a semipermanent copy */ ! 107: } ! 108: else { ! 109: /*NOSTRICT*/ ! 110: #ifndef lint ! 111: some_buf = saferealloc(some_buf,(MEM_SIZE)(length+1)); ! 112: #endif lint ! 113: rcline[newng] = some_buf; ! 114: } ! 115: #ifdef NOTDEF ! 116: if (strnEQ(some_buf,"to.",3)) { /* is this a non-newsgroup? */ ! 117: nextrcline--; /* destroy this line */ ! 118: continue; ! 119: } ! 120: #endif ! 121: if (*some_buf == ' ' || ! 122: *some_buf == '\t' || ! 123: strnEQ(some_buf,"options",7)) { /* non-useful line? */ ! 124: toread[newng] = TR_JUNK; ! 125: rcchar[newng] = ' '; ! 126: rcnums[newng] = 0; ! 127: continue; ! 128: } ! 129: for (s = rcline[newng]; *s && *s != ':' && *s != NEGCHAR; s++) ; ! 130: if (!*s && !checkflag) { ! 131: #ifndef lint ! 132: rcline[newng] = saferealloc(rcline[newng],(MEM_SIZE)length+2); ! 133: #endif lint ! 134: s = rcline[newng] + length; ! 135: *s = ':'; ! 136: *(s+1) = '\0'; ! 137: } ! 138: rcchar[newng] = *s; /* salt away the : or ! */ ! 139: rcnums[newng] = (char)(s - rcline[newng]); ! 140: rcnums[newng]++; /* remember where it was */ ! 141: *s = '\0'; /* null terminate newsgroup name */ ! 142: #ifdef HASHNG ! 143: if (!checkflag) ! 144: sethash(newng); ! 145: #endif ! 146: if (rcchar[newng] == NEGCHAR) { ! 147: toread[newng] = TR_UNSUB; ! 148: continue; ! 149: } ! 150: ! 151: /* now find out how much there is to read */ ! 152: ! 153: if (!inlist(buf) || (suppress_cn && foundany && !paranoid)) ! 154: toread[newng] = TR_NONE; /* no need to calculate now */ ! 155: else ! 156: set_toread(newng); ! 157: #ifdef VERBOSE ! 158: if (!checkflag && softmisses == 1) { ! 159: softmisses++; /* lie a little */ ! 160: fputs("(Revising soft pointers--be patient.)\n",stdout) FLUSH; ! 161: } ! 162: #endif ! 163: if (toread[newng] > TR_NONE) { /* anything unread? */ ! 164: if (!foundany) { ! 165: starthere = newng; ! 166: foundany = TRUE; /* remember that fact*/ ! 167: } ! 168: if (suppress_cn) { /* if no listing desired */ ! 169: if (checkflag) { /* if that is all they wanted */ ! 170: finalize(1); /* then bomb out */ ! 171: } ! 172: } ! 173: else { ! 174: #ifdef VERBOSE ! 175: IF(verbose) ! 176: printf("Unread news in %-20s %5ld article%s\n", ! 177: rcline[newng],(long)toread[newng], ! 178: toread[newng]==TR_ONE ? nullstr : "s") FLUSH; ! 179: ELSE ! 180: #endif ! 181: #ifdef TERSE ! 182: printf("%s: %ld article%s\n", ! 183: rcline[newng],(long)toread[newng], ! 184: toread[newng]==TR_ONE ? nullstr : "s") FLUSH; ! 185: #endif ! 186: if (int_count) { ! 187: countdown = 1; ! 188: int_count = 0; ! 189: } ! 190: if (countdown) { ! 191: if (! --countdown) { ! 192: fputs("etc.\n",stdout) FLUSH; ! 193: if (checkflag) ! 194: finalize(1); ! 195: suppress_cn = TRUE; ! 196: } ! 197: } ! 198: } ! 199: } ! 200: } ! 201: fclose(rcfp); /* close .newsrc */ ! 202: if (tmpfp != Nullfp) ! 203: fclose(tmpfp); /* close .rnsoft */ ! 204: if (checkflag) { /* were we just checking? */ ! 205: finalize(foundany); /* tell them what we found */ ! 206: } ! 207: if (paranoid) ! 208: cleanup_rc(); ! 209: ! 210: #ifdef DEBUGGING ! 211: if (debug & DEB_HASH) { ! 212: page_init(); ! 213: for (i=0; i<HASHSIZ; i++) { ! 214: sprintf(buf,"%d %d",i,hashtbl[i]); ! 215: print_lines(buf,NOMARKING); ! 216: } ! 217: } ! 218: #endif ! 219: ! 220: return foundany; ! 221: } ! 222: ! 223: /* try to find or add an explicitly specified newsgroup */ ! 224: /* returns TRUE if found or added, FALSE if not. */ ! 225: /* assumes that we are chdir'ed to SPOOL */ ! 226: ! 227: bool ! 228: get_ng(what,do_reloc) ! 229: char *what; ! 230: bool do_reloc; ! 231: { ! 232: char *ntoforget; ! 233: char promptbuf[128]; ! 234: ! 235: #ifdef VERBOSE ! 236: IF(verbose) ! 237: ntoforget = "Type n to forget about this newsgroup.\n"; ! 238: ELSE ! 239: #endif ! 240: #ifdef TERSE ! 241: ntoforget = "n to forget it.\n"; ! 242: #endif ! 243: if (index(what,'/')) { ! 244: dingaling(); ! 245: printf("\nBad newsgroup name.\n") FLUSH; ! 246: return FALSE; ! 247: } ! 248: set_ngname(what); ! 249: ng = find_ng(ngname); ! 250: if (ng == nextrcline) { /* not in .newsrc? */ ! 251: if ((softptr[ng] = findact(buf,ngname,strlen(ngname),0L)) < 0 ) { ! 252: dingaling(); ! 253: #ifdef VERBOSE ! 254: IF(verbose) ! 255: printf("\nNewsgroup %s does not exist!\n",ngname) FLUSH; ! 256: ELSE ! 257: #endif ! 258: #ifdef TERSE ! 259: printf("\nNo %s!\n",ngname) FLUSH; ! 260: #endif ! 261: sleep(2); ! 262: return FALSE; ! 263: } ! 264: #ifdef VERBOSE ! 265: IF(verbose) ! 266: sprintf(promptbuf,"\nNewsgroup %s not in .newsrc--add? [yn] ",ngname); ! 267: ELSE ! 268: #endif ! 269: #ifdef TERSE ! 270: sprintf(promptbuf,"\nAdd %s? [yn] ",ngname); ! 271: #endif ! 272: reask_add: ! 273: in_char(promptbuf,'A'); ! 274: putchar('\n') FLUSH; ! 275: setdef(buf,"y"); ! 276: #ifdef VERIFY ! 277: printcmd(); ! 278: #endif ! 279: if (*buf == 'h') { ! 280: #ifdef VERBOSE ! 281: IF(verbose) ! 282: printf("Type y or SP to add %s to your .newsrc.\n", ngname) ! 283: FLUSH; ! 284: ELSE ! 285: #endif ! 286: #ifdef TERSE ! 287: fputs("y or SP to add\n",stdout) FLUSH; ! 288: #endif ! 289: fputs(ntoforget,stdout) FLUSH; ! 290: goto reask_add; ! 291: } ! 292: else if (*buf == 'n' || *buf == 'q') { ! 293: return FALSE; ! 294: } ! 295: else if (*buf == 'y') { ! 296: ng = add_newsgroup(ngname); ! 297: do_reloc = FALSE; ! 298: } ! 299: else { ! 300: fputs(hforhelp,stdout) FLUSH; ! 301: settle_down(); ! 302: goto reask_add; ! 303: } ! 304: } ! 305: else if (rcchar[ng] == NEGCHAR) { /* unsubscribed? */ ! 306: #ifdef VERBOSE ! 307: IF(verbose) ! 308: sprintf(promptbuf, ! 309: "\nNewsgroup %s is currently unsubscribed to--resubscribe? [yn] ",ngname) ! 310: FLUSH; ! 311: ELSE ! 312: #endif ! 313: #ifdef TERSE ! 314: sprintf(promptbuf,"\n%s unsubscribed--resubscribe? [yn] ",ngname) ! 315: FLUSH; ! 316: #endif ! 317: reask_unsub: ! 318: in_char(promptbuf,'R'); ! 319: putchar('\n') FLUSH; ! 320: setdef(buf,"y"); ! 321: #ifdef VERIFY ! 322: printcmd(); ! 323: #endif ! 324: if (*buf == 'h') { ! 325: #ifdef VERBOSE ! 326: IF(verbose) ! 327: printf("Type y or SP to resubscribe to %s.\n", ngname) FLUSH; ! 328: ELSE ! 329: #endif ! 330: #ifdef TERSE ! 331: fputs("y or SP to resubscribe.\n",stdout) FLUSH; ! 332: #endif ! 333: fputs(ntoforget,stdout) FLUSH; ! 334: goto reask_unsub; ! 335: } ! 336: else if (*buf == 'n' || *buf == 'q') { ! 337: return FALSE; ! 338: } ! 339: else if (*buf == 'y') { ! 340: rcchar[ng] = ':'; ! 341: } ! 342: else { ! 343: fputs(hforhelp,stdout) FLUSH; ! 344: settle_down(); ! 345: goto reask_unsub; ! 346: } ! 347: } ! 348: ! 349: /* now calculate how many unread articles in newsgroup */ ! 350: ! 351: set_toread(ng); ! 352: #ifdef RELOCATE ! 353: if (do_reloc) ! 354: ng = relocate_newsgroup(ng,-1); ! 355: #endif ! 356: return toread[ng] >= TR_NONE; ! 357: } ! 358: ! 359: /* add a newsgroup to the .newsrc file (eventually) */ ! 360: ! 361: NG_NUM ! 362: add_newsgroup(ngn) ! 363: char *ngn; ! 364: { ! 365: register NG_NUM newng = nextrcline++; ! 366: /* increment max rcline index */ ! 367: ! 368: rcnums[newng] = strlen(ngn) + 1; ! 369: rcline[newng] = safemalloc((MEM_SIZE)(rcnums[newng] + 1)); ! 370: strcpy(rcline[newng],ngn); /* and copy over the name */ ! 371: *(rcline[newng] + rcnums[newng]) = '\0'; ! 372: rcchar[newng] = ':'; /* call it subscribed */ ! 373: toread[newng] = TR_NONE; /* just for prettiness */ ! 374: #ifdef HASHNG ! 375: sethash(newng); /* so we can find it again */ ! 376: #endif ! 377: #ifdef RELOCATE ! 378: return relocate_newsgroup(newng,-1); ! 379: #else ! 380: return newng; ! 381: #endif ! 382: } ! 383: ! 384: #ifdef RELOCATE ! 385: NG_NUM ! 386: relocate_newsgroup(ngx,newng) ! 387: NG_NUM ngx; ! 388: NG_NUM newng; ! 389: { ! 390: char *dflt = (ngx!=current_ng ? "$^.L" : "$^L"); ! 391: char *tmprcline; ! 392: ART_UNREAD tmptoread; ! 393: char tmprcchar; ! 394: char tmprcnums; ! 395: ACT_POS tmpsoftptr; ! 396: register NG_NUM i; ! 397: #ifdef DEBUGGING ! 398: ART_NUM tmpngmax; ! 399: #endif ! 400: #ifdef CACHEFIRST ! 401: ART_NUM tmpabs1st; ! 402: #endif ! 403: ! 404: starthere = 0; /* Disable this optimization */ ! 405: writesoft = TRUE; /* Update soft pointer file */ ! 406: if (ngx < nextrcline-1) { ! 407: #ifdef HASHNG ! 408: for (i=0; i<HASHSIZ; i++) { ! 409: if (hashtbl[i] > ngx) ! 410: --hashtbl[i]; ! 411: else if (hashtbl[i] == ngx) ! 412: hashtbl[i] = nextrcline-1; ! 413: } ! 414: #endif ! 415: tmprcline = rcline[ngx]; ! 416: tmptoread = toread[ngx]; ! 417: tmprcchar = rcchar[ngx]; ! 418: tmprcnums = rcnums[ngx]; ! 419: tmpsoftptr = softptr[ngx]; ! 420: #ifdef DEBUGGING ! 421: tmpngmax = ngmax[ngx]; ! 422: #endif ! 423: #ifdef CACHEFIRST ! 424: tmpabs1st = abs1st[ngx]; ! 425: #endif ! 426: for (i=ngx+1; i<nextrcline; i++) { ! 427: rcline[i-1] = rcline[i]; ! 428: toread[i-1] = toread[i]; ! 429: rcchar[i-1] = rcchar[i]; ! 430: rcnums[i-1] = rcnums[i]; ! 431: softptr[i-1] = softptr[i]; ! 432: #ifdef DEBUGGING ! 433: ngmax[i-1] = ngmax[i]; ! 434: #endif ! 435: #ifdef CACHEFIRST ! 436: abs1st[i-1] = abs1st[i]; ! 437: #endif ! 438: } ! 439: rcline[nextrcline-1] = tmprcline; ! 440: toread[nextrcline-1] = tmptoread; ! 441: rcchar[nextrcline-1] = tmprcchar; ! 442: rcnums[nextrcline-1] = tmprcnums; ! 443: softptr[nextrcline-1] = tmpsoftptr; ! 444: #ifdef DEBUGGING ! 445: ngmax[nextrcline-1] = tmpngmax; ! 446: #endif ! 447: #ifdef CACHEFIRST ! 448: abs1st[nextrcline-1] = tmpabs1st; ! 449: #endif ! 450: } ! 451: if (current_ng > ngx) ! 452: current_ng--; ! 453: if (newng < 0) { ! 454: reask_reloc: ! 455: unflush_output(); /* disable any ^O in effect */ ! 456: #ifdef VERBOSE ! 457: IF(verbose) ! 458: printf("\nPut newsgroup where? [%s] ", dflt); ! 459: ELSE ! 460: #endif ! 461: #ifdef TERSE ! 462: printf("\nPut where? [%s] ", dflt); ! 463: #endif ! 464: fflush(stdout); ! 465: reinp_reloc: ! 466: eat_typeahead(); ! 467: getcmd(buf); ! 468: if (errno || *buf == '\f') { ! 469: /* if return from stop signal */ ! 470: goto reask_reloc; /* give them a prompt again */ ! 471: } ! 472: setdef(buf,dflt); ! 473: #ifdef VERIFY ! 474: printcmd(); ! 475: #endif ! 476: if (*buf == 'h') { ! 477: #ifdef VERBOSE ! 478: IF(verbose) { ! 479: printf("\n\n\ ! 480: Type ^ to put the newsgroup first (position 0).\n\ ! 481: Type $ to put the newsgroup last (position %d).\n", nextrcline-1); ! 482: printf("\ ! 483: Type . to put it before the current newsgroup (position %d).\n", current_ng); ! 484: printf("\ ! 485: Type -newsgroup name to put it before that newsgroup.\n\ ! 486: Type +newsgroup name to put it after that newsgroup.\n\ ! 487: Type a number between 0 and %d to put it at that position.\n", nextrcline-1); ! 488: printf("\ ! 489: Type L for a listing of newsgroups and their positions.\n") FLUSH; ! 490: } ! 491: ELSE ! 492: #endif ! 493: #ifdef TERSE ! 494: { ! 495: printf("\n\n\ ! 496: ^ to put newsgroup first (pos 0).\n\ ! 497: $ to put last (pos %d).\n", nextrcline-1); ! 498: printf("\ ! 499: . to put before current newsgroup (pos %d).\n", current_ng); ! 500: printf("\ ! 501: -newsgroup to put before newsgroup.\n\ ! 502: +newsgroup to put after.\n\ ! 503: number in 0-%d to put at that pos.\n", nextrcline-1); ! 504: printf("\ ! 505: L for list of .newsrc.\n") FLUSH; ! 506: } ! 507: #endif ! 508: goto reask_reloc; ! 509: } ! 510: else if (*buf == 'L') { ! 511: putchar('\n') FLUSH; ! 512: list_newsgroups(); ! 513: goto reask_reloc; ! 514: } ! 515: else if (isdigit(*buf)) { ! 516: if (!finish_command(TRUE)) /* get rest of command */ ! 517: goto reinp_reloc; ! 518: newng = atoi(buf); ! 519: if (newng < 0) ! 520: newng = 0; ! 521: if (newng >= nextrcline) ! 522: return nextrcline-1; ! 523: } ! 524: else if (*buf == '^') { ! 525: putchar('\n') FLUSH; ! 526: newng = 0; ! 527: } ! 528: else if (*buf == '$') { ! 529: putchar('\n') FLUSH; ! 530: return nextrcline-1; ! 531: } ! 532: else if (*buf == '.') { ! 533: putchar('\n') FLUSH; ! 534: newng = current_ng; ! 535: } ! 536: else if (*buf == '-' || *buf == '+') { ! 537: if (!finish_command(TRUE)) /* get rest of command */ ! 538: goto reinp_reloc; ! 539: newng = find_ng(buf+1); ! 540: if (newng == nextrcline) { ! 541: fputs("Not found.",stdout) FLUSH; ! 542: goto reask_reloc; ! 543: } ! 544: if (*buf == '+') ! 545: newng++; ! 546: } ! 547: else { ! 548: printf("\n%s",hforhelp) FLUSH; ! 549: settle_down(); ! 550: goto reask_reloc; ! 551: } ! 552: } ! 553: if (newng < nextrcline-1) { ! 554: #ifdef HASHNG ! 555: for (i=0; i<HASHSIZ; i++) { ! 556: if (hashtbl[i] == nextrcline-1) ! 557: hashtbl[i] = newng; ! 558: else if (hashtbl[i] >= newng) ! 559: ++hashtbl[i]; ! 560: } ! 561: #endif ! 562: tmprcline = rcline[nextrcline-1]; ! 563: tmptoread = toread[nextrcline-1]; ! 564: tmprcchar = rcchar[nextrcline-1]; ! 565: tmprcnums = rcnums[nextrcline-1]; ! 566: tmpsoftptr = softptr[nextrcline-1]; ! 567: #ifdef DEBUGGING ! 568: tmpngmax = ngmax[nextrcline-1]; ! 569: #endif ! 570: #ifdef CACHEFIRST ! 571: tmpabs1st = abs1st[nextrcline-1]; ! 572: #endif ! 573: for (i=nextrcline-2; i>=newng; i--) { ! 574: rcline[i+1] = rcline[i]; ! 575: toread[i+1] = toread[i]; ! 576: rcchar[i+1] = rcchar[i]; ! 577: rcnums[i+1] = rcnums[i]; ! 578: softptr[i+1] = softptr[i]; ! 579: #ifdef DEBUGGING ! 580: ngmax[i+1] = ngmax[i]; ! 581: #endif ! 582: #ifdef CACHEFIRST ! 583: abs1st[i+1] = abs1st[i]; ! 584: #endif ! 585: } ! 586: rcline[newng] = tmprcline; ! 587: toread[newng] = tmptoread; ! 588: rcchar[newng] = tmprcchar; ! 589: rcnums[newng] = tmprcnums; ! 590: softptr[newng] = tmpsoftptr; ! 591: #ifdef DEBUGGING ! 592: ngmax[newng] = tmpngmax; ! 593: #endif ! 594: #ifdef CACHEFIRST ! 595: abs1st[newng] = tmpabs1st; ! 596: #endif ! 597: } ! 598: if (current_ng >= newng) ! 599: current_ng++; ! 600: return newng; ! 601: } ! 602: #endif ! 603: ! 604: /* List out the newsrc with annotations */ ! 605: ! 606: void ! 607: list_newsgroups() ! 608: { ! 609: register NG_NUM i; ! 610: char tmpbuf[2048]; ! 611: static char *status[] = {"(READ)","(UNSUB)","(BOGUS)","(JUNK)"}; ! 612: int cmd; ! 613: ! 614: page_init(); ! 615: print_lines("\ ! 616: # Status Newsgroup\n\ ! 617: ",STANDOUT); ! 618: for (i=0; i<nextrcline && !int_count; i++) { ! 619: if (toread[i] >= 0) ! 620: set_toread(i); ! 621: *(rcline[i] + rcnums[i] - 1) = rcchar[i]; ! 622: if (toread[i] > 0) ! 623: sprintf(tmpbuf,"%3d %6ld ",i,(long)toread[i]); ! 624: else ! 625: sprintf(tmpbuf,"%3d %7s ",i,status[-toread[i]]); ! 626: safecpy(tmpbuf+13,rcline[i],2034); ! 627: *(rcline[i] + rcnums[i] - 1) = '\0'; ! 628: if (cmd = print_lines(tmpbuf,NOMARKING)) { ! 629: if (cmd > 0) ! 630: pushchar(cmd); ! 631: break; ! 632: } ! 633: } ! 634: int_count = 0; ! 635: } ! 636: ! 637: /* find a newsgroup in .newsrc */ ! 638: ! 639: NG_NUM ! 640: find_ng(ngnam) ! 641: char *ngnam; ! 642: { ! 643: register NG_NUM ngnum; ! 644: #ifdef HASHNG ! 645: register int hashix = hash(ngnam); ! 646: register int incr = 1; ! 647: ! 648: while ((ngnum = hashtbl[hashix]) >= 0) { ! 649: if (strEQ(rcline[ngnum], ngnam) && toread[ngnum] >= TR_UNSUB) ! 650: return ngnum; ! 651: hashix = (hashix + incr) % HASHSIZ; ! 652: incr += 2; /* offsets from original are in n*2 */ ! 653: } ! 654: return nextrcline; /* = notfound */ ! 655: ! 656: #else /* just do linear search */ ! 657: ! 658: for (ngnum = 0; ngnum < nextrcline; ngnum++) { ! 659: if (strEQ(rcline[ngnum],ngnam)) ! 660: break; ! 661: } ! 662: return ngnum; ! 663: #endif ! 664: } ! 665: ! 666: void ! 667: cleanup_rc() ! 668: { ! 669: register NG_NUM ngx; ! 670: register NG_NUM bogosity = 0; ! 671: ! 672: #ifdef VERBOSE ! 673: IF(verbose) ! 674: fputs("Checking out your .newsrc--hang on a second...\n",stdout) ! 675: FLUSH; ! 676: ELSE ! 677: #endif ! 678: #ifdef TERSE ! 679: fputs("Checking .newsrc--hang on...\n",stdout) FLUSH; ! 680: #endif ! 681: for (ngx = 0; ngx < nextrcline; ngx++) { ! 682: if (toread[ngx] >= TR_UNSUB) { ! 683: set_toread(ngx); /* this may reset newsgroup */ ! 684: /* or declare it bogus */ ! 685: } ! 686: if (toread[ngx] == TR_BOGUS) ! 687: bogosity++; ! 688: } ! 689: for (ngx = nextrcline-1; ngx >= 0 && toread[ngx] == TR_BOGUS; ngx--) ! 690: bogosity--; /* discount already moved ones */ ! 691: if (nextrcline > 5 && bogosity > nextrcline / 2) { ! 692: fputs( ! 693: "It looks like the active file is messed up. Contact your news administrator,\n\ ! 694: ",stdout); ! 695: fputs( ! 696: "leave the \"bogus\" groups alone, and they may come back to normal. Maybe.\n\ ! 697: ",stdout) FLUSH; ! 698: } ! 699: #ifdef RELOCATE ! 700: else if (bogosity) { ! 701: #ifdef VERBOSE ! 702: IF(verbose) ! 703: fputs("Moving bogus newsgroups to the end of your .newsrc.\n", ! 704: stdout) FLUSH; ! 705: ELSE ! 706: #endif ! 707: #ifdef TERSE ! 708: fputs("Moving boguses to the end.\n",stdout) FLUSH; ! 709: #endif ! 710: for (; ngx >= 0; ngx--) { ! 711: if (toread[ngx] == TR_BOGUS) ! 712: relocate_newsgroup(ngx,nextrcline-1); ! 713: } ! 714: #ifdef DELBOGUS ! 715: reask_bogus: ! 716: in_char("Delete bogus newsgroups? [ny] ", 'D'); ! 717: putchar('\n') FLUSH; ! 718: setdef(buf,"n"); ! 719: #ifdef VERIFY ! 720: printcmd(); ! 721: #endif ! 722: if (*buf == 'h') { ! 723: #ifdef VERBOSE ! 724: IF(verbose) ! 725: fputs("\ ! 726: Type y to delete bogus newsgroups.\n\ ! 727: Type n or SP to leave them at the end in case they return.\n\ ! 728: ",stdout) FLUSH; ! 729: ELSE ! 730: #endif ! 731: #ifdef TERSE ! 732: fputs("y to delete, n to keep\n",stdout) FLUSH; ! 733: #endif ! 734: goto reask_bogus; ! 735: } ! 736: else if (*buf == 'n' || *buf == 'q') ! 737: ; ! 738: else if (*buf == 'y') { ! 739: while (toread[nextrcline-1] == TR_BOGUS && nextrcline > 0) ! 740: --nextrcline; /* real tough, huh? */ ! 741: } ! 742: else { ! 743: fputs(hforhelp,stdout) FLUSH; ! 744: settle_down(); ! 745: goto reask_bogus; ! 746: } ! 747: #endif ! 748: } ! 749: #else ! 750: #ifdef VERBOSE ! 751: IF(verbose) ! 752: fputs("You should edit bogus newsgroups out of your .newsrc.\n", ! 753: stdout) FLUSH; ! 754: ELSE ! 755: #endif ! 756: #ifdef TERSE ! 757: fputs("Edit boguses from .newsrc.\n",stdout) FLUSH; ! 758: #endif ! 759: #endif ! 760: paranoid = FALSE; ! 761: } ! 762: ! 763: #ifdef HASHNG ! 764: /* make an entry in the hash table for the current newsgroup */ ! 765: ! 766: void ! 767: sethash(thisng) ! 768: NG_NUM thisng; ! 769: { ! 770: register int hashix = hash(rcline[thisng]); ! 771: register int incr = 1; ! 772: #ifdef DEBUGGING ! 773: static int hashhits = 0, hashtries = 0; ! 774: #endif ! 775: ! 776: #ifdef DEBUGGING ! 777: hashtries++; ! 778: #endif ! 779: while (hashtbl[hashix] >= 0) { ! 780: #ifdef DEBUGGING ! 781: hashhits++; ! 782: if (debug & DEB_HASH) { ! 783: printf(" Hash hits: %d / %d\n",hashhits, hashtries) FLUSH; ! 784: } ! 785: hashtries++; ! 786: #endif ! 787: hashix = (hashix + incr) % HASHSIZ; ! 788: incr += 2; /* offsets from original are in n*2 */ ! 789: } ! 790: hashtbl[hashix] = thisng; ! 791: } ! 792: ! 793: short prime[] = {1,2,-3,-5,7,11,-13,-17,19,23,-29,-31,37,41,-43,-47,53,57,-59, ! 794: -61,67,71,-73,-79,83,89,-97,-101,1,1,1,1,1,1,1,1,1,1,1,1}; ! 795: ! 796: int ! 797: hash(ngnam) ! 798: register char *ngnam; ! 799: { ! 800: register int i = 0; ! 801: register int ch; ! 802: register int sum = 0; ! 803: #ifdef DEBUGGING ! 804: char *ngn = ngnam; ! 805: #endif ! 806: ! 807: while (ch = *ngnam++) { ! 808: sum += (ch + i) * prime[i]; /* gives ~ 10% hits at 25% full */ ! 809: i++; ! 810: } ! 811: #ifdef DEBUGGING ! 812: if (debug & DEB_HASH) ! 813: printf("hash(%s) => %d => %d\n",ngn, sum, (sum<0?-sum:sum)%HASHSIZ) ! 814: FLUSH; ! 815: #endif ! 816: if (sum < 0) ! 817: sum = -sum; ! 818: return sum % HASHSIZ; ! 819: } ! 820: ! 821: #endif ! 822: ! 823: void ! 824: newsrc_check() ! 825: { ! 826: rcfp = fopen(rcname,"r"); /* open it */ ! 827: if (rcfp == Nullfp) { /* not there? */ ! 828: #ifdef VERBOSE ! 829: IF(verbose) ! 830: fputs("\ ! 831: Trying to set up a .newsrc file--running newsetup...\n\n\ ! 832: ",stdout) FLUSH; ! 833: ELSE ! 834: #endif ! 835: #ifdef TERSE ! 836: fputs("Setting up .newsrc...\n",stdout) FLUSH; ! 837: #endif ! 838: if (doshell(sh,filexp(NEWSETUP)) || ! 839: (rcfp = fopen(rcname,"r")) == Nullfp) { ! 840: #ifdef VERBOSE ! 841: IF(verbose) ! 842: fputs("\ ! 843: Can't create a .newsrc--you must do it yourself.\n\ ! 844: ",stdout) FLUSH; ! 845: ELSE ! 846: #endif ! 847: #ifdef TERSE ! 848: fputs("(Fatal)\n",stdout) FLUSH; ! 849: #endif ! 850: finalize(1); ! 851: } ! 852: } ! 853: else { ! 854: UNLINK(rcbname); /* unlink backup file name */ ! 855: link(rcname,rcbname); /* and backup current name */ ! 856: } ! 857: } ! 858: ! 859: /* write out the (presumably) revised .newsrc */ ! 860: ! 861: void ! 862: write_rc() ! 863: { ! 864: register NG_NUM tmpng; ! 865: register char *delim; ! 866: ! 867: rcfp = fopen(rctname, "w"); /* open .newsrc */ ! 868: if (rcfp == Nullfp) { ! 869: printf("Can't recreate .newsrc\n") FLUSH; ! 870: finalize(1); ! 871: } ! 872: ! 873: /* write out each line*/ ! 874: ! 875: for (tmpng = 0; tmpng < nextrcline; tmpng++) { ! 876: if (rcnums[tmpng]) { ! 877: delim = rcline[tmpng] + rcnums[tmpng] - 1; ! 878: *delim = rcchar[tmpng]; ! 879: } ! 880: else ! 881: delim = Nullch; ! 882: #ifdef DEBUGGING ! 883: if (debug & DEB_NEWSRC_LINE) ! 884: printf("%s\n",rcline[tmpng]) FLUSH; ! 885: #endif ! 886: fprintf(rcfp,"%s\n",rcline[tmpng]); ! 887: if (delim) ! 888: *delim = '\0'; /* might still need this line */ ! 889: } ! 890: ! 891: fclose(rcfp); /* close .newsrc */ ! 892: UNLINK(rcname); ! 893: link(rctname,rcname); ! 894: UNLINK(rctname); ! 895: ! 896: if (writesoft) { ! 897: tmpfp = fopen(filexp(softname), "w"); /* open .rnsoft */ ! 898: if (tmpfp == Nullfp) { ! 899: printf(cantcreate,filexp(softname)) FLUSH; ! 900: return; ! 901: } ! 902: for (tmpng = 0; tmpng < nextrcline; tmpng++) { ! 903: fprintf(tmpfp,"%ld\n",(long)softptr[tmpng]); ! 904: } ! 905: fclose(tmpfp); ! 906: } ! 907: } ! 908: ! 909: void ! 910: get_old_rc() ! 911: { ! 912: UNLINK(rctname); ! 913: link(rcname,rctname); ! 914: UNLINK(rcname); ! 915: link(rcbname,rcname); ! 916: UNLINK(rcbname); ! 917: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.