Annotation of 43BSD/contrib/rn/art.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.