Annotation of 43BSD/contrib/nntp/rrn/art.c, revision 1.1

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

unix.superglobalmegacorp.com

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