|
|
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.