📄 art.c
字号:
artpos = ftell(artfp); vwtary(artline,artpos); /* remember pos in file */ } /* end of line loop */#ifdef INNERSEARCH innersearch = 0; if (hide_everything) { hide_everything = FALSE; *buf = Ctl('l'); goto fake_command; }#endif if (linenum >= 32700)/* did last line have formfeed? */ vwtary(artline-1,-vrdary(artline-1)); /* remember by negating pos in file */ special = FALSE; /* end of page, so reset page length */ firstpage = FALSE; /* and say it is not 1st time thru */ /* extra loop bombout */ if (artpos == artsize) {/* did we just now reach EOF? */ mode = oldmode; return DA_NORM; /* avoid --MORE--(100%) */ }/* not done with this article, so pretend we are a pager */reask_pager: unflush_output(); /* disable any ^O in effect */ standout(); /* enter standout mode */ printf("--MORE--(%ld%%)",(long)(artpos*100/artsize)); un_standout(); /* leave standout mode */#ifdef CLEAREOL maybe_eol();#endif fflush(stdout);/* reinp_pager: /* unused, commented for lint */ eat_typeahead();#ifdef DEBUG if (debug & DEB_CHECKPOINTING) { printf("(%d %d %d)",checkcount,linenum,artline); fflush(stdout); }#endif if (checkcount >= docheckwhen && linenum == LINES && (artline > 40 || checkcount >= docheckwhen+10) ) { /* while he is reading a whole page */ /* in an article he is interested in */ checkcount = 0; checkpoint_rc(); /* update .newsrc */ } cache_until_key(); mode = 'p'; getcmd(buf); if (errno) { if (LINES < 100 && !int_count) *buf = '\f';/* on CONT fake up refresh */ else { *buf = 'q'; /* on INTR or paper just quit */ } } carriage_return();#ifndef CLEAREOL erase_eol(); /* and erase the prompt */#else if (erase_screen && can_home_clear) clear_rest(); else erase_eol(); /* and erase the prompt */#endif /* CLEAREOL */ carriage_return(); /* Resets kernel's tab column counter to 0 */ fflush(stdout); fake_command: /* used by innersearch */ output_chase_phrase = TRUE; /* parse and process pager command */ switch (page_switch()) { case PS_ASK: /* reprompt "--MORE--..." */ goto reask_pager; case PS_RAISE: /* reparse on article level */ mode = oldmode; return DA_RAISE; case PS_TOEND: /* fast pager loop exit */ mode = oldmode; return DA_TOEND; case PS_NORM: /* display more article */ break; } } /* end of page loop */}/* process pager commands */intpage_switch(){ register char *s; switch (*buf) { case 'd': case Ctl('d'): /* half page */ special = TRUE; slines = LINES / 2 + 1; if (marking && *blinebeg != '\f'#ifdef CUSTOMLINES && (!pagestop || blinebeg != art_buf || !execute(&page_compex,blinebeg))#endif ) { up_line(); highlight = --artline; restart = blinebeg; artpos = alinebeg; } return PS_NORM; case '!': /* shell escape */ escapade(); return PS_ASK;#ifdef INNERSEARCH case Ctl('i'): gline = 3; sprintf(cmd_buf,"^[^%c]",*blinebeg); compile(&gcompex,cmd_buf,TRUE,TRUE); goto caseG; case Ctl('g'): gline = 3; compile(&gcompex,"^Subject:",TRUE,TRUE); goto caseG; case 'g': /* in-article search */ if (!finish_command(FALSE))/* get rest of command */ return PS_ASK; s = buf+1; if (isspace(*s)) s++; if ((s = compile(&gcompex,s,TRUE,TRUE)) != Nullch) { /* compile regular expression */ printf("\n%s\n",s) FLUSH; return PS_ASK; } carriage_return(); erase_eol(); /* erase the prompt */ carriage_return(); /* Resets kernel's tab column counter to 0 */ /* FALL THROUGH */ caseG: case 'G': { /* ART_LINE lines_to_skip = 0; */ ART_POS start_where; if (gline < 0 || gline > LINES-2) gline = LINES-2;#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("Start here? %d >=? %d\n",topline + gline + 1,artline) FLUSH;#endif if (*buf == Ctl('i') || topline+gline+1 >= artline) start_where = artpos; /* in case we had a line wrap */ else { start_where = vrdary(topline+gline+1); if (start_where < 0) start_where = -start_where; } if (start_where < htype[PAST_HEADER].ht_minpos) start_where = htype[PAST_HEADER].ht_minpos; fseek(artfp,(long)start_where,0); innersearch = 0; /* assume not found */ while (fgets(buf, sizeof buf, artfp) != Nullch) { /* lines_to_skip++; NOT USED NOW */#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("Test %s",buf) FLUSH;#endif if (execute(&gcompex,buf) != Nullch) { innersearch = ftell(artfp); break; } } if (!innersearch) { fseek(artfp,artpos,0); fputs("(Not found)",stdout) FLUSH; return PS_ASK; }#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("On page? %ld <=? %ld\n",(long)innersearch,(long)artpos) FLUSH;#endif if (innersearch <= artpos) { /* already on page? */ if (innersearch < artpos) { artline = topline+1; while (vrdary(artline) < innersearch) artline++; } highlight = artline - 1;#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("@ %d\n",highlight) FLUSH;#endif topline = highlight - gline; if (topline < -1) topline = -1; *buf = '\f'; /* fake up a refresh */ innersearch = 0; return page_switch(); } else { /* who knows how many lines it is? */ do_fseek = TRUE; hide_everything = TRUE; } return PS_NORM; }#else case 'g': case 'G': case Ctl('g'): notincl("g"); return PS_ASK;#endif case '\n': /* one line */ special = TRUE; slines = 2; return PS_NORM;#ifdef ROTATION case 'X': rotate = !rotate; /* FALL THROUGH */#endif case 'l': case '\f': /* refresh screen */#ifdef DEBUG if (debug & DEB_INNERSRCH) { printf("Topline = %d",topline) FLUSH; gets(buf); }#endif clear(); carriage_return(); /* Resets kernel's tab column counter to 0 */ do_fseek = TRUE; artline = topline; if (artline < 0) artline = 0; firstpage = (topline < 0); return PS_NORM; case 'b': case '\b': case Ctl('b'): { /* back up a page */ ART_LINE target;#ifndef CLEAREOL clear();#else if (can_home_clear) /* if we can home do it */ home_cursor(); else clear();#endif /* CLEAREOL */ carriage_return(); /* Resets kernel's tab column counter to 0 */ do_fseek = TRUE; /* reposition article file */ target = topline - (LINES - 2); artline = topline; if (artline >= 0) do { artline--; } while(artline >= 0 && artline > target && vrdary(artline-1) >= 0); topline = artline; /* remember top line of screen */ /* (line # within article file) */ if (artline < 0) artline = 0; firstpage = (topline < 0); return PS_NORM; } case 'h': { /* help */ int cmd; if ((cmd = help_page()) > 0) pushchar(cmd); return PS_ASK; } case 't': /* output thread data */ page_line = 1; entire_tree(curr_artp); return PS_ASK; case '_': if (!finish_dblchar()) return PS_ASK; switch (buf[1] & 0177) { default: goto leave_pager; } break; case '\177': case '\0': /* treat del,break as 'n' */ *buf = 'n'; /* FALL THROUGH */ case 'k': case 'K': case 'T': case 'J': case 'n': case 'N': case Ctl('n'): case 's': case 'S': case 'e': case 'u': case 'w': case 'W': case '|': mark_as_read(); /* mark article as read */ /* FALL THROUGH */ case 'U': case ',': case '<': case '>': case '[': case ']': case '{': case '}': case '(': case ')': case '+': case ':': case '#': case '$': case '&': case '-': case '.': case '/': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '=': case '?': case 'c': case 'C': #ifdef DEBUG case 'D':#endif case 'E': case 'f': case 'F': case Ctl('f'): case 'j': case Ctl('k'): case 'm': case 'M': case 'p': case 'P': case Ctl('p'): case 'Q': case 'r': case 'R': case Ctl('r'): case 'v': case 'Y':#ifndef ROTATION case 'x': case 'X':#endif case Ctl('x'): case 'z': case 'Z': case '^':leave_pager:#ifdef ROTATION rotate = FALSE;#endif reread = FALSE; do_hiding = TRUE; if (index("nNpP\016\020",*buf) == Nullch && index("wWsSe:!&|/?123456789.",*buf) != Nullch) { setdfltcmd(); standout(); /* enter standout mode */ printf(prompt,mailcall,dfltcmd); /* print prompt, whatever it is */ un_standout(); /* leave standout mode */ putchar(' '); fflush(stdout); } return PS_RAISE; /* and pretend we were at end */#ifdef ROTATION case 'x': rotate = TRUE; /* FALL THROUGH */#endif case 'y': case Ctl('v'): /* Leaving it undocumented in case */ /* I want to steal the key--LAW */ case ' ': /* continue current article */ if (erase_screen) { /* -e? */#ifndef CLEAREOL clear(); /* clear screen */#else if (can_home_clear) /* if we can home do it */ home_cursor(); else clear(); /* else clear screen */#endif /* CLEAREOL */ carriage_return(); /* Resets kernel's tab column counter to 0 */ fflush(stdout); if (*blinebeg != '\f'#ifdef CUSTOMLINES && (!pagestop || blinebeg != art_buf || !execute(&page_compex,blinebeg))#endif ) { restart = blinebeg; artline--; /* restart this line */ artpos = alinebeg; if (marking) /* and mark repeated line */ highlight = artline; } topline = artline; /* and remember top line of screen */ /* (line # within article file) */ } else if (marking && *blinebeg != '\f'#ifdef CUSTOMLINES && (!pagestop || blinebeg != art_buf || !execute(&page_compex,blinebeg))#endif ) { /* are we marking repeats? */ up_line(); /* go up one line */ highlight = --artline;/* and get ready to highlight */ restart = blinebeg; /* the old line */ artpos = alinebeg; } return PS_NORM; case 'q': /* quit this article? */ do_hiding = TRUE; return PS_TOEND; default: fputs(hforhelp,stdout) FLUSH; settle_down(); return PS_ASK; }}#ifdef INNERSEARCHboolinnermore(){ if (artpos < innersearch) { /* not even on page yet? */#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("Not on page %ld < %ld\n",(long)artpos,(long)innersearch) FLUSH;#endif return TRUE; } if (artpos == innersearch) { /* just got onto page? */ isrchline = artline; /* remember first line after */ highlight = artline - 1;#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("There it is %ld = %ld, %d @ %d\n",(long)artpos, (long)innersearch,hide_everything,highlight) FLUSH;#endif if (hide_everything) { /* forced refresh? */ topline = highlight - gline; if (topline < -1) topline = -1; return FALSE; /* let refresh do it all */ } }#ifdef DEBUG if (debug & DEB_INNERSRCH) printf("Not far enough? %d <? %d + %d\n",artline,isrchline,gline) FLUSH;#endif if (artline < isrchline + gline) { return TRUE; } return FALSE;}#endif#ifdef METAMAILintnontext(content_type)char *content_type;{ char *t; if (content_type[0] == '\n') return 0; while (content_type && isspace(*content_type)) content_type++; t = index(content_type, ';'); if (!t) t = index(content_type, '\n'); if (t) *t-- = '\0'; while (t && *t && t > content_type && isspace(*t)) *t-- = '\0'; if (notplain(content_type)) return 1; return 0;}intnotplain(s)char *s;{ char *t; if (!s) return 1; while (*s && isspace(*s)) s++; for (t=s; *t; ++t) { if (isupper(*t)) *t = tolower(*t); } while (t > s && isspace(*--t)) ; if (((t-s) == 3) && !strncmp(s, "text", 4)) return 0; if (strncmp(s, "text/plain", 10)) return 1; t = index(s, ';'); while (t) { t++; while (*t && isspace(*t)) t++; if (!strncmp(t, "charset", 7)) { s = index(t, '='); if (s) { s++; while (*s && isspace(*s)) s++; if (!strncmp(s, "us-ascii", 8)) return 0; } return(1); } t = index(t, ';'); } return 0; /* no charset, was text/plain */}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -