⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 art.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -