|
|
1.1 ! root 1: /* $Header: art.c,v 4.3.1.5 85/09/10 11:07:18 lwall Exp $ ! 2: * ! 3: * $Log: art.c,v $ ! 4: * Revision 4.3.1.5 85/09/10 11:07:18 lwall ! 5: * %m not restored on some returns. ! 6: * ! 7: * Revision 4.3.1.4 85/05/23 12:13:31 lwall ! 8: * shouldn't display article that's really a subdirectory. ! 9: * ! 10: * Revision 4.3.1.3 85/05/13 09:29:55 lwall ! 11: * Added CUSTOMLINES option. ! 12: * ! 13: * Revision 4.3.1.2 85/05/10 13:46:07 lwall ! 14: * Fixed header reparse bug on backpage. ! 15: * ! 16: * Revision 4.3.1.1 85/05/10 11:30:56 lwall ! 17: * Branch for patches. ! 18: * ! 19: * Revision 4.3 85/05/01 11:34:51 lwall ! 20: * Baseline for release with 4.3bsd. ! 21: * ! 22: */ ! 23: ! 24: #include "EXTERN.h" ! 25: #include "common.h" ! 26: #include "rn.h" ! 27: #include "ngstuff.h" ! 28: #include "head.h" ! 29: #include "cheat.h" ! 30: #include "help.h" ! 31: #include "search.h" ! 32: #include "artio.h" ! 33: #include "ng.h" ! 34: #include "bits.h" ! 35: #include "final.h" ! 36: #include "artstate.h" ! 37: #include "rcstuff.h" ! 38: #include "term.h" ! 39: #include "sw.h" ! 40: #include "util.h" ! 41: #include "backpage.h" ! 42: #include "intrp.h" ! 43: #include "INTERN.h" ! 44: #include "art.h" ! 45: ! 46: /* page_switch() return values */ ! 47: ! 48: #define PS_NORM 0 ! 49: #define PS_ASK 1 ! 50: #define PS_RAISE 2 ! 51: #define PS_TOEND 3 ! 52: ! 53: bool special = FALSE; /* is next page special length? */ ! 54: int slines = 0; /* how long to make page when special */ ! 55: ART_LINE highlight = -1; /* next line to be highlighted */ ! 56: char *restart = Nullch; /* if nonzero, the place where last */ ! 57: /* line left off on line split */ ! 58: char *blinebeg; /* where in buffer current line began */ ! 59: ART_POS alinebeg; /* where in file current line began */ ! 60: ! 61: #ifdef INNERSEARCH ! 62: ART_POS innersearch = 0; /* artpos of end of line we found */ ! 63: /* for 'g' command */ ! 64: ART_LINE isrchline = 0; /* last line to display */ ! 65: bool hide_everything = FALSE; ! 66: /* if set, do not write page now, */ ! 67: /* but refresh when done with page */ ! 68: COMPEX gcompex; /* in article search pattern */ ! 69: #endif ! 70: ! 71: bool firstpage; /* is this the 1st page of article? */ ! 72: ! 73: char art_buf[LBUFLEN]; /* place for article lines */ ! 74: ! 75: void ! 76: art_init() ! 77: { ! 78: ; ! 79: } ! 80: ! 81: int ! 82: do_article() ! 83: { ! 84: register char *s; ! 85: ART_POS artsize; /* size in bytes of article */ ! 86: bool hide_this_line = FALSE; /* hidden header line? */ ! 87: ART_LINE linenum; /* line # on page, 1 origin */ ! 88: #ifdef ULSMARTS ! 89: bool under_lining = FALSE; ! 90: /* are we underlining a word? */ ! 91: #endif ! 92: register char *bufptr = art_buf; ! 93: /* pointer to input buffer */ ! 94: register int outpos; /* column position of output */ ! 95: static char prompt_buf[64]; /* place to hold prompt */ ! 96: bool notesfiles = FALSE; /* might there be notesfiles junk? */ ! 97: char oldmode = mode; ! 98: ! 99: #ifdef INNERSEARCH ! 100: register int outputok; ! 101: #endif ! 102: ! 103: if (fstat(artfp->_file,&filestat)) ! 104: /* get article file stats */ ! 105: return DA_CLEAN; ! 106: if (filestat.st_mode & S_IFMT != S_IFREG) ! 107: return DA_NORM; ! 108: artsize = filestat.st_size; ! 109: /* from that get article size */ ! 110: sprintf(prompt_buf, ! 111: "%%sEnd of article %ld (of %ld)--what next? [%%s]", ! 112: (long)art,(long)lastart); /* format prompt string */ ! 113: prompt = prompt_buf; ! 114: int_count = 0; /* interrupt count is 0 */ ! 115: firstpage = (topline < 0); ! 116: for (;;) { /* for each page */ ! 117: assert(art == openart); ! 118: if (do_fseek) { ! 119: #ifdef ASYNC_PARSE ! 120: parse_maybe(art); /* make sure header is ours */ ! 121: #endif ! 122: artpos = vrdary(artline); ! 123: if (artpos < 0) ! 124: artpos = -artpos; /* labs(), anyone? */ ! 125: if (firstpage) ! 126: artpos = (ART_POS)0; ! 127: fseek(artfp,artpos,0); ! 128: if (artpos < htype[PAST_HEADER].ht_minpos) ! 129: in_header = SOME_LINE; ! 130: do_fseek = FALSE; ! 131: restart = Nullch; ! 132: } ! 133: if (firstpage) { ! 134: if (firstline) { ! 135: interp(art_buf, (sizeof art_buf), firstline); ! 136: #ifdef CLEAREOL ! 137: maybe_eol(); /* PWP */ ! 138: #endif CLEAREOL ! 139: fputs(art_buf,stdout) FLUSH; ! 140: artopen(art); /* rewind article in case interp */ ! 141: /* forced a header parse */ ! 142: } ! 143: else { ! 144: ART_NUM i; ! 145: ! 146: #ifdef CLEAREOL ! 147: maybe_eol(); /* PWP */ ! 148: #endif CLEAREOL ! 149: printf("Article %ld",(long)art); ! 150: i = (((ART_NUM)toread[ng]) - 1 + was_read(art)); ! 151: #ifdef DELAYMARK ! 152: if (i || dmcount) { ! 153: printf(" (%ld more",(long)i); ! 154: if (dmcount) ! 155: printf(" + %ld Marked to return)",(long)dmcount); ! 156: putchar(')'); ! 157: } ! 158: #else ! 159: if (i) ! 160: printf(" (%ld more)",(long)i); ! 161: #endif ! 162: if (htype[NGS_LINE].ht_flags & HT_HIDE) ! 163: printf(" in %s", ngname); ! 164: fputs(":\n",stdout) FLUSH; ! 165: } ! 166: start_header(art); ! 167: forcelast = FALSE; /* we will have our day in court */ ! 168: restart = Nullch; ! 169: artline = 0; /* start counting lines */ ! 170: artpos = 0; ! 171: vwtary(artline,artpos); /* remember pos in file */ ! 172: } ! 173: for (linenum=(firstpage?2:1); ! 174: in_header || ( ! 175: #ifdef INNERSEARCH ! 176: innersearch ? innermore() : ! 177: #endif ! 178: linenum<(firstpage?initlines:(special?slines:LINES)) ); ! 179: linenum++) { /* for each line on page */ ! 180: if (int_count) { /* exit via interrupt? */ ! 181: putchar('\n') FLUSH; /* get to left margin */ ! 182: int_count = 0; /* reset interrupt count */ ! 183: mode = oldmode; ! 184: return DA_NORM; /* skip out of loops */ ! 185: } ! 186: if (restart) { /* did not finish last line? */ ! 187: bufptr = restart; /* then start again here */ ! 188: restart = Nullch; /* and reset the flag */ ! 189: } ! 190: else { /* not a restart */ ! 191: if (fgets(art_buf,LBUFLEN,artfp)==Nullch) { ! 192: /* if all done */ ! 193: mode = oldmode; ! 194: return DA_NORM; /* skip out of loops */ ! 195: } ! 196: bufptr = art_buf; /* so start at beginning */ ! 197: art_buf[LBUFLEN-1] = '\0'; ! 198: /* make sure string ends */ ! 199: } ! 200: blinebeg = bufptr; /* remember where we began */ ! 201: alinebeg = artpos; /* both in buffer and file */ ! 202: if (in_header && bufptr == art_buf) ! 203: hide_this_line = ! 204: parseline(art_buf,do_hiding,hide_this_line); ! 205: else if (notesfiles && do_hiding && ! 206: bufptr == art_buf && *art_buf == '#' && ! 207: isupper(art_buf[1]) && art_buf[2] == ':' ) { ! 208: fgets(art_buf,sizeof(art_buf),artfp); ! 209: if (index(art_buf,'!') != Nullch) ! 210: fgets(art_buf,sizeof(art_buf),artfp); ! 211: htype[PAST_HEADER].ht_minpos = ftell(artfp); ! 212: /* exclude notesfiles droppings */ ! 213: hide_this_line = TRUE; /* and do not print either */ ! 214: notesfiles = FALSE; ! 215: } ! 216: #ifdef CUSTOMLINES ! 217: if (hideline && bufptr == art_buf && ! 218: execute(&hide_compex,art_buf) ) ! 219: hide_this_line = TRUE; ! 220: #endif ! 221: if (in_header && htype[in_header].ht_flags & HT_MAGIC) { ! 222: if (in_header == NGS_LINE) { ! 223: hide_this_line = (index(art_buf,',') == Nullch); ! 224: } ! 225: else if (in_header == EXPIR_LINE) { ! 226: if (!(htype[EXPIR_LINE].ht_flags & HT_HIDE)) ! 227: hide_this_line = (strlen(art_buf) < 10); ! 228: } ! 229: } ! 230: if (in_header == SUBJ_LINE && ! 231: htype[SUBJ_LINE].ht_flags & HT_MAGIC) { ! 232: /* is this the subject? */ ! 233: int length; ! 234: ! 235: length = strlen(art_buf)-1; ! 236: artline++; ! 237: art_buf[length] = '\0'; /* wipe out newline */ ! 238: #ifdef NOFIREWORKS ! 239: no_ulfire(); ! 240: #endif ! 241: notesfiles = ! 242: (instr(&art_buf[length-10]," - (nf") != Nullch); ! 243: if (oldsubject) { ! 244: length += 7; ! 245: fputs("(SAME) ",stdout); ! 246: oldsubject = FALSE; ! 247: } ! 248: if (length+UG > COLS) { /* rarely true */ ! 249: linenum++; ! 250: vwtary(artline,vrdary(artline-1)+COLS); ! 251: artline++; ! 252: } ! 253: s = art_buf + 8; ! 254: *s++ = '\0'; /* make into 2 strings */ ! 255: #ifdef CLEAREOL ! 256: maybe_eol(); /* PWP */ ! 257: #endif CLEAREOL ! 258: fputs(art_buf,stdout) FLUSH; ! 259: /* print up through : */ ! 260: if (!UG) ! 261: putchar(' '); ! 262: underprint(s); /* print subject underlined */ ! 263: putchar('\n') FLUSH; /* and finish the line */ ! 264: } ! 265: else if (hide_this_line && do_hiding) { ! 266: /* do not print line? */ ! 267: linenum--; /* compensate for linenum++ */ ! 268: if (!in_header) ! 269: hide_this_line = FALSE; ! 270: } ! 271: else { /* just a normal line */ ! 272: if (highlight==artline) { /* this line to be highlit? */ ! 273: if (marking == STANDOUT) { ! 274: #ifdef NOFIREWORKS ! 275: if (erase_screen) ! 276: no_sofire(); ! 277: #endif ! 278: standout(); ! 279: } ! 280: else { ! 281: #ifdef NOFIREWORKS ! 282: if (erase_screen) ! 283: no_ulfire(); ! 284: #endif ! 285: underline(); ! 286: } ! 287: if (*bufptr == '\n') ! 288: putchar(' '); ! 289: } ! 290: #ifdef INNERSEARCH ! 291: outputok = !hide_everything; ! 292: /* get it into register, hopefully */ ! 293: #endif ! 294: #ifdef CLEAREOL ! 295: #ifdef INNERSEARCH ! 296: if (outputok) ! 297: #endif ! 298: maybe_eol(); /* PWP */ ! 299: #endif CLEAREOL ! 300: #ifdef CUSTOMLINES ! 301: if (pagestop && bufptr == art_buf && ! 302: execute(&page_compex,art_buf) ) ! 303: linenum = 32700; ! 304: #endif ! 305: for (outpos = 0; outpos < COLS; ) { ! 306: /* while line has room */ ! 307: if (*bufptr >= ' ') { /* normal char? */ ! 308: #ifdef ULSMARTS ! 309: if (*bufptr == '_') { ! 310: if (bufptr[1] == '\b') { ! 311: if (!under_lining && highlight!=artline ! 312: #ifdef INNERSEARCH ! 313: && outputok ! 314: #endif ! 315: ) { ! 316: under_lining++; ! 317: if (UG) { ! 318: if (bufptr != buf && ! 319: bufptr[-1] == ' ') { ! 320: outpos--; ! 321: backspace(); ! 322: } ! 323: } ! 324: underline(); ! 325: } ! 326: bufptr += 2; ! 327: } ! 328: } ! 329: else { ! 330: if (under_lining) { ! 331: under_lining = 0; ! 332: un_underline(); ! 333: if (UG) { ! 334: if (*bufptr == ' ') ! 335: goto skip_put; ! 336: outpos++; ! 337: } ! 338: } ! 339: } ! 340: #endif ! 341: #ifdef INNERSEARCH ! 342: if (outputok) ! 343: #endif ! 344: { ! 345: #ifdef ROTATION ! 346: if (rotate && !in_header ! 347: && isalpha(*bufptr)) { ! 348: if ((*bufptr & 31) <= 13) ! 349: putchar(*bufptr+13); ! 350: else ! 351: putchar(*bufptr-13); ! 352: } ! 353: else ! 354: #endif ! 355: putchar(*bufptr); ! 356: } ! 357: if (*UC && ((highlight==artline && marking == 1) ! 358: #ifdef ULSMARTS ! 359: || under_lining ! 360: #endif ! 361: )) { ! 362: backspace(); ! 363: underchar(); ! 364: } ! 365: skip_put: ! 366: bufptr++; ! 367: outpos++; ! 368: } ! 369: else if (*bufptr == '\n' || !*bufptr) { ! 370: /* newline? */ ! 371: #ifdef ULSMARTS ! 372: if (under_lining) { ! 373: under_lining = 0; ! 374: un_underline(); ! 375: } ! 376: #endif ! 377: #ifdef DEBUGGING ! 378: if (debug & DEB_INNERSRCH && outpos < COLS - 6) { ! 379: standout(); ! 380: printf("%4d",artline); ! 381: un_standout(); ! 382: } ! 383: #endif ! 384: #ifdef INNERSEARCH ! 385: if (outputok) ! 386: #endif ! 387: putchar('\n') FLUSH; ! 388: restart = 0; ! 389: outpos = 1000; /* signal normal \n */ ! 390: } ! 391: else if (*bufptr == '\t') { /* tab? */ ! 392: #ifdef INNERSEARCH ! 393: if (outputok) ! 394: #endif ! 395: putchar(*bufptr); ! 396: bufptr++; ! 397: outpos += 8 - outpos % 8; ! 398: } ! 399: else if (*bufptr == '\f') { /* form feed? */ ! 400: #ifdef INNERSEARCH ! 401: if (outputok) ! 402: #endif ! 403: fputs("^L",stdout); ! 404: if (bufptr == blinebeg && highlight != artline) ! 405: linenum = 32700; ! 406: /* how is that for a magic number? */ ! 407: bufptr++; ! 408: outpos += 2; ! 409: } ! 410: else { /* other control char */ ! 411: #ifdef INNERSEARCH ! 412: if (outputok) ! 413: #endif ! 414: { ! 415: putchar('^'); ! 416: if (highlight == artline && *UC && marking == 1) { ! 417: backspace(); ! 418: underchar(); ! 419: putchar(*bufptr+64); ! 420: backspace(); ! 421: underchar(); ! 422: } ! 423: else ! 424: putchar(*bufptr+64); ! 425: } ! 426: bufptr++; ! 427: outpos += 2; ! 428: } ! 429: ! 430: } /* end of column loop */ ! 431: ! 432: if (outpos < 1000) {/* did line overflow? */ ! 433: restart = bufptr; ! 434: /* restart here next time */ ! 435: if (AM) { /* automatic margins on tty? */ ! 436: if (!XN && *bufptr == '\n') ! 437: /* need we simulate XN? */ ! 438: restart = 0; ! 439: /* skip the newline */ ! 440: } ! 441: else { /* cursor just hangs there */ ! 442: #ifdef INNERSEARCH ! 443: if (outputok) ! 444: #endif ! 445: putchar('\n') FLUSH; ! 446: /* so move it down ourselves */ ! 447: if (*bufptr == '\n') ! 448: restart = 0; ! 449: /* simulate XN if need be */ ! 450: } ! 451: #ifdef CLEAREOL ! 452: /* #ifdef INNERSEARCH ! 453: if (outputok) ! 454: #endif ! 455: maybe_eol(); */ /* PWP *//* comment this out for now ! 456: until I am sure it is ! 457: needed*/ ! 458: ! 459: #endif CLEAREOL ! 460: } ! 461: ! 462: /* handle normal end of output line formalities */ ! 463: ! 464: if (highlight == artline) { ! 465: /* were we highlighting line? */ ! 466: if (marking == STANDOUT) ! 467: un_standout(); ! 468: else ! 469: un_underline(); ! 470: highlight = -1; /* no more we are */ ! 471: } ! 472: artline++; /* count the line just printed */ ! 473: if (artline - LINES + 1 > topline) ! 474: /* did we just scroll top line off? */ ! 475: topline = artline - LINES + 1; ! 476: /* then recompute top line # */ ! 477: } ! 478: ! 479: /* determine actual position in file */ ! 480: ! 481: if (restart) /* stranded somewhere in the buffer? */ ! 482: artpos += restart - blinebeg; ! 483: /* just calculate position */ ! 484: else /* no, ftell will do */ ! 485: artpos = ftell(artfp); ! 486: /* so do ftell */ ! 487: vwtary(artline,artpos); /* remember pos in file */ ! 488: } /* end of line loop */ ! 489: ! 490: #ifdef INNERSEARCH ! 491: innersearch = 0; ! 492: if (hide_everything) { ! 493: hide_everything = FALSE; ! 494: *buf = Ctl('l'); ! 495: goto fake_command; ! 496: } ! 497: #endif ! 498: if (linenum >= 32700)/* did last line have formfeed? */ ! 499: vwtary(artline-1,-vrdary(artline-1)); ! 500: /* remember by negating pos in file */ ! 501: ! 502: special = FALSE; /* end of page, so reset page length */ ! 503: firstpage = FALSE; /* and say it is not 1st time thru */ ! 504: ! 505: /* extra loop bombout */ ! 506: ! 507: if (artpos == artsize) {/* did we just now reach EOF? */ ! 508: mode = oldmode; ! 509: return DA_NORM; /* avoid --MORE--(100%) */ ! 510: } ! 511: ! 512: /* not done with this article, so pretend we are a pager */ ! 513: ! 514: reask_pager: ! 515: unflush_output(); /* disable any ^O in effect */ ! 516: standout(); /* enter standout mode */ ! 517: printf("--MORE--(%ld%%)",(long)(artpos*100/artsize)); ! 518: un_standout(); /* leave standout mode */ ! 519: fflush(stdout); ! 520: /* reinp_pager: /* unused, commented for lint */ ! 521: eat_typeahead(); ! 522: #ifdef DEBUGGING ! 523: if (debug & DEB_CHECKPOINTING) { ! 524: printf("(%d %d %d)",checkcount,linenum,artline); ! 525: fflush(stdout); ! 526: } ! 527: #endif ! 528: if (checkcount >= docheckwhen && ! 529: linenum == LINES && ! 530: (artline > 40 || checkcount >= docheckwhen+10) ) { ! 531: /* while he is reading a whole page */ ! 532: /* in an article he is interested in */ ! 533: checkcount = 0; ! 534: checkpoint_rc(); /* update .newsrc */ ! 535: } ! 536: collect_subjects(); /* loads subject cache until */ ! 537: /* input is pending */ ! 538: mode = 'p'; ! 539: getcmd(buf); ! 540: if (errno) { ! 541: if (LINES < 100 && !int_count) ! 542: *buf = '\f';/* on CONT fake up refresh */ ! 543: else { ! 544: *buf = 'q'; /* on INTR or paper just quit */ ! 545: } ! 546: } ! 547: carriage_return(); ! 548: #ifndef CLEAREOL ! 549: erase_eol(); /* and erase the prompt */ ! 550: #else ! 551: if (erase_screen && can_home_clear) /* PWP was here */ ! 552: clear_rest(); ! 553: else ! 554: erase_eol(); /* and erase the prompt */ ! 555: #endif CLEAREOL ! 556: fflush(stdout); ! 557: ! 558: fake_command: /* used by innersearch */ ! 559: ! 560: /* parse and process pager command */ ! 561: ! 562: switch (page_switch()) { ! 563: case PS_ASK: /* reprompt "--MORE--..." */ ! 564: goto reask_pager; ! 565: case PS_RAISE: /* reparse on article level */ ! 566: mode = oldmode; ! 567: return DA_RAISE; ! 568: case PS_TOEND: /* fast pager loop exit */ ! 569: mode = oldmode; ! 570: return DA_TOEND; ! 571: case PS_NORM: /* display more article */ ! 572: break; ! 573: } ! 574: } /* end of page loop */ ! 575: } ! 576: ! 577: /* process pager commands */ ! 578: ! 579: int ! 580: page_switch() ! 581: { ! 582: register char *s; ! 583: ! 584: switch (*buf) { ! 585: case 'd': ! 586: case Ctl('d'): /* half page */ ! 587: special = TRUE; ! 588: slines = LINES / 2 + 1; ! 589: if (marking && *blinebeg != '\f' ! 590: #ifdef CUSTOMLINES ! 591: && (!pagestop || blinebeg != art_buf || ! 592: !execute(&page_compex,blinebeg)) ! 593: #endif ! 594: ) { ! 595: up_line(); ! 596: highlight = --artline; ! 597: restart = blinebeg; ! 598: artpos = alinebeg; ! 599: } ! 600: return PS_NORM; ! 601: case '!': /* shell escape */ ! 602: escapade(); ! 603: return PS_ASK; ! 604: #ifdef INNERSEARCH ! 605: case Ctl('i'): ! 606: gline = 3; ! 607: sprintf(cmd_buf,"^[^%c]",*blinebeg); ! 608: compile(&gcompex,cmd_buf,TRUE,TRUE); ! 609: goto caseG; ! 610: case Ctl('g'): ! 611: gline = 3; ! 612: compile(&gcompex,"^Subject:",TRUE,TRUE); ! 613: goto caseG; ! 614: case 'g': /* in-article search */ ! 615: if (!finish_command(FALSE))/* get rest of command */ ! 616: return PS_ASK; ! 617: s = buf+1; ! 618: if (isspace(*s)) ! 619: s++; ! 620: if ((s = compile(&gcompex,s,TRUE,TRUE)) != Nullch) { ! 621: /* compile regular expression */ ! 622: printf("\n%s\n",s) FLUSH; ! 623: return PS_ASK; ! 624: } ! 625: carriage_return(); ! 626: erase_eol(); /* erase the prompt */ ! 627: /* FALL THROUGH */ ! 628: caseG: ! 629: case 'G': { ! 630: /* ART_LINE lines_to_skip = 0; */ ! 631: ART_POS start_where; ! 632: ! 633: if (gline < 0 || gline > LINES-2) ! 634: gline = LINES-2; ! 635: #ifdef DEBUGGING ! 636: if (debug & DEB_INNERSRCH) ! 637: printf("Start here? %d >=? %d\n",topline + gline + 1,artline) ! 638: FLUSH; ! 639: #endif ! 640: if (*buf == Ctl('i') || topline+gline+1 >= artline) ! 641: start_where = artpos; ! 642: /* in case we had a line wrap */ ! 643: else { ! 644: start_where = vrdary(topline+gline+1); ! 645: if (start_where < 0) ! 646: start_where = -start_where; ! 647: } ! 648: if (start_where < htype[PAST_HEADER].ht_minpos) ! 649: start_where = htype[PAST_HEADER].ht_minpos; ! 650: fseek(artfp,(long)start_where,0); ! 651: innersearch = 0; /* assume not found */ ! 652: while (fgets(buf, sizeof buf, artfp) != Nullch) { ! 653: /* lines_to_skip++; NOT USED NOW */ ! 654: #ifdef DEBUGGING ! 655: if (debug & DEB_INNERSRCH) ! 656: printf("Test %s",buf) FLUSH; ! 657: #endif ! 658: if (execute(&gcompex,buf) != Nullch) { ! 659: innersearch = ftell(artfp); ! 660: break; ! 661: } ! 662: } ! 663: if (!innersearch) { ! 664: fseek(artfp,artpos,0); ! 665: fputs("(Not found)",stdout) FLUSH; ! 666: return PS_ASK; ! 667: } ! 668: #ifdef DEBUGGING ! 669: if (debug & DEB_INNERSRCH) ! 670: printf("On page? %ld <=? %ld\n",(long)innersearch,(long)artpos) ! 671: FLUSH; ! 672: #endif ! 673: if (innersearch <= artpos) { /* already on page? */ ! 674: if (innersearch < artpos) { ! 675: artline = topline+1; ! 676: while (vrdary(artline) < innersearch) ! 677: artline++; ! 678: } ! 679: highlight = artline - 1; ! 680: #ifdef DEBUGGING ! 681: if (debug & DEB_INNERSRCH) ! 682: printf("@ %d\n",highlight) FLUSH; ! 683: #endif ! 684: topline = highlight - gline; ! 685: if (topline < -1) ! 686: topline = -1; ! 687: *buf = '\f'; /* fake up a refresh */ ! 688: innersearch = 0; ! 689: return page_switch(); ! 690: } ! 691: else { /* who knows how many lines it is? */ ! 692: do_fseek = TRUE; ! 693: hide_everything = TRUE; ! 694: } ! 695: return PS_NORM; ! 696: } ! 697: #else ! 698: case 'g': case 'G': case Ctl('g'): ! 699: notincl("g"); ! 700: return PS_ASK; ! 701: #endif ! 702: case '\n': /* one line */ ! 703: special = TRUE; ! 704: slines = 2; ! 705: return PS_NORM; ! 706: #ifdef ROTATION ! 707: case 'X': ! 708: rotate = !rotate; ! 709: /* FALL THROUGH */ ! 710: #endif ! 711: case 'l': ! 712: case '\f': /* refresh screen */ ! 713: #ifdef DEBUGGING ! 714: if (debug & DEB_INNERSRCH) { ! 715: printf("Topline = %d",topline) FLUSH; ! 716: gets(buf); ! 717: } ! 718: #endif ! 719: clear(); ! 720: do_fseek = TRUE; ! 721: artline = topline; ! 722: if (artline < 0) ! 723: artline = 0; ! 724: firstpage = (topline < 0); ! 725: return PS_NORM; ! 726: case 'b': ! 727: case '\b': /* I like backspace for this -- PWP */ ! 728: /* Leaving it undocumented in case */ ! 729: /* I want to steal the key--LAW */ ! 730: case Ctl('b'): { /* back up a page */ ! 731: ART_LINE target; ! 732: ! 733: #ifndef CLEAREOL ! 734: clear(); ! 735: #else ! 736: if (can_home_clear) /* if we can home do it -- PWP */ ! 737: home_cursor(); ! 738: else ! 739: clear(); ! 740: ! 741: #endif CLEAREOL ! 742: do_fseek = TRUE; /* reposition article file */ ! 743: target = topline - (LINES - 2); ! 744: artline = topline; ! 745: do { ! 746: artline--; ! 747: } while (artline >= 0 && artline > target && ! 748: vrdary(artline-1) >= 0); ! 749: topline = artline; ! 750: /* remember top line of screen */ ! 751: /* (line # within article file) */ ! 752: if (artline < 0) ! 753: artline = 0; ! 754: firstpage = (topline < 0); ! 755: return PS_NORM; ! 756: } ! 757: case 'h': { /* help */ ! 758: int cmd; ! 759: ! 760: if ((cmd = help_page()) > 0) ! 761: pushchar(cmd); ! 762: return PS_ASK; ! 763: } ! 764: case '\177': ! 765: case '\0': /* treat del,break as 'n' */ ! 766: *buf = 'n'; ! 767: /* FALL THROUGH */ ! 768: case 'k': case 'K': ! 769: case 'n': case 'N': case Ctl('n'): ! 770: case 's': case 'S': ! 771: case 'u': ! 772: case 'w': case 'W': ! 773: case '|': ! 774: mark_as_read(art); /* mark article as read */ ! 775: /* FALL THROUGH */ ! 776: case '#': ! 777: case '$': ! 778: case '&': ! 779: case '-': ! 780: case '.': ! 781: case '/': ! 782: case '1': case '2': case '3': case '4': case '5': ! 783: case '6': case '7': case '8': case '9': ! 784: case '=': ! 785: case '?': ! 786: case 'c': case 'C': ! 787: case 'f': case 'F': ! 788: case 'j': ! 789: case Ctl('k'): ! 790: case 'm': case 'M': ! 791: case 'p': case 'P': case Ctl('p'): ! 792: case 'Q': ! 793: case 'r': case 'R': case Ctl('r'): ! 794: case 'v': ! 795: case 'Y': ! 796: #ifndef ROTATION ! 797: case 'x': case 'X': ! 798: #endif ! 799: case Ctl('x'): ! 800: case '^': ! 801: ! 802: #ifdef ROTATION ! 803: rotate = FALSE; ! 804: #endif ! 805: reread = FALSE; ! 806: do_hiding = TRUE; ! 807: if (index("nNpP",*buf) == Nullch && ! 808: index("wWsS!&|/?123456789.",*buf) != Nullch) { ! 809: setdfltcmd(); ! 810: standout(); /* enter standout mode */ ! 811: printf(prompt,mailcall,dfltcmd); ! 812: /* print prompt, whatever it is */ ! 813: un_standout(); /* leave standout mode */ ! 814: putchar(' '); ! 815: fflush(stdout); ! 816: } ! 817: return PS_RAISE; /* and pretend we were at end */ ! 818: #ifdef ROTATION ! 819: case 'x': ! 820: rotate = TRUE; ! 821: /* FALL THROUGH */ ! 822: #endif ! 823: case 'y': ! 824: case Ctl('v'): /* I like emacs -- PWP */ ! 825: /* Leaving it undocumented in case */ ! 826: /* I want to steal the key--LAW */ ! 827: case ' ': /* continue current article */ ! 828: if (erase_screen) { /* -e? */ ! 829: #ifndef CLEAREOL ! 830: clear(); /* clear screen */ ! 831: #else ! 832: if (can_home_clear) /* if we can home do it -- PWP */ ! 833: home_cursor(); ! 834: else ! 835: clear(); /* else clear screen */ ! 836: ! 837: #endif CLEAREOL ! 838: if (*blinebeg != '\f' ! 839: #ifdef CUSTOMLINES ! 840: && (!pagestop || blinebeg != art_buf || ! 841: !execute(&page_compex,blinebeg)) ! 842: #endif ! 843: ) { ! 844: restart = blinebeg; ! 845: artline--; /* restart this line */ ! 846: artpos = alinebeg; ! 847: if (marking) /* and mark repeated line */ ! 848: highlight = artline; ! 849: } ! 850: topline = artline; ! 851: /* and remember top line of screen */ ! 852: /* (line # within article file) */ ! 853: } ! 854: else if (marking && *blinebeg != '\f' ! 855: #ifdef CUSTOMLINES ! 856: && (!pagestop || blinebeg != art_buf || ! 857: !execute(&page_compex,blinebeg)) ! 858: #endif ! 859: ) { ! 860: /* are we marking repeats? */ ! 861: up_line(); /* go up one line */ ! 862: highlight = --artline;/* and get ready to highlight */ ! 863: restart = blinebeg; /* the old line */ ! 864: artpos = alinebeg; ! 865: } ! 866: return PS_NORM; ! 867: case 'q': /* quit this article? */ ! 868: do_hiding = TRUE; ! 869: return PS_TOEND; ! 870: default: ! 871: fputs(hforhelp,stdout) FLUSH; ! 872: settle_down(); ! 873: return PS_ASK; ! 874: } ! 875: } ! 876: ! 877: #ifdef INNERSEARCH ! 878: bool ! 879: innermore() ! 880: { ! 881: if (artpos < innersearch) { /* not even on page yet? */ ! 882: #ifdef DEBUGGING ! 883: if (debug & DEB_INNERSRCH) ! 884: printf("Not on page %ld < %ld\n",(long)artpos,(long)innersearch) ! 885: FLUSH; ! 886: #endif ! 887: return TRUE; ! 888: } ! 889: if (artpos == innersearch) { /* just got onto page? */ ! 890: isrchline = artline; /* remember first line after */ ! 891: highlight = artline - 1; ! 892: #ifdef DEBUGGING ! 893: if (debug & DEB_INNERSRCH) ! 894: printf("There it is %ld = %ld, %d @ %d\n",(long)artpos, ! 895: (long)innersearch,hide_everything,highlight) FLUSH; ! 896: #endif ! 897: if (hide_everything) { /* forced refresh? */ ! 898: topline = highlight - gline; ! 899: if (topline < -1) ! 900: topline = -1; ! 901: return FALSE; /* let refresh do it all */ ! 902: } ! 903: } ! 904: #ifdef DEBUGGING ! 905: if (debug & DEB_INNERSRCH) ! 906: printf("Not far enough? %d <? %d + %d\n",artline,isrchline,gline) ! 907: FLUSH; ! 908: #endif ! 909: if (artline < isrchline + gline) { ! 910: return TRUE; ! 911: } ! 912: return FALSE; ! 913: } ! 914: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.