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

📄 intrp.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		    s = scrbuf;		    sprintf(s,"%d",perform_cnt);		    break;		case '0': case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':#ifdef CONDSUB		    s = getbracket(bra_compex,*pattern - '0');#else		    s = nullstr;#endif		    break;		case 'a':		    s = scrbuf;		    sprintf(s,"%ld",(long)art);		    break;		case 'A':#ifdef LINKART		    s = linkartname;	/* so Eunice people get right file */#else		    s = scrbuf;#ifdef USE_NNTP		    sprintf(s,"%s/%s",spool,nntp_artname());#else		    sprintf(s,"%s/%s/%ld",spool,ngdir,(long)art);#endif#endif		    break;		case 'b':		    s = savedest;		    break;		case 'B':		    s = scrbuf;		    sprintf(s,"%ld",(long)savefrom);		    break;		case 'c':		    s = ngdir;		    break;		case 'C':		    s = ngname;		    break;		case 'd':		    s = scrbuf;		    sprintf(s,"%s/%s",spool,ngdir);		    break;		case 'D':		    s = dist_buf = fetchlines(art,DIST_LINE);		    break;		case 'e':		    s = (extractprog ? extractprog : "-");		    break;		case 'E':		    s = extractdest;		    break;		case 'f':			/* from line */		    parseheader(art);		    if (htype[REPLY_LINE].ht_minpos >= 0) {						/* was there a reply line? */			if (!(s=reply_buf))			    s = reply_buf = fetchlines(art,REPLY_LINE);		    }		    else if (!(s = from_buf))			s = from_buf = fetchlines(art,FROM_LINE);		    break;		case 'F':		    parseheader(art);		    if (htype[FOLLOW_LINE].ht_minpos >= 0)					/* is there a Followup-To line? */			s = follow_buf = fetchlines(art,FOLLOW_LINE);		    else 			s = ngs_buf = fetchlines(art,NGS_LINE);		    break;		case 'h':			/* header file name */		    s = headname;		    break;		case 'H':			/* host name in postings */		    s = phostname;		    break;		case 'i':		    if (!(s=artid_buf))			s = artid_buf = fetchlines(art,MESSID_LINE);		    if (*s && *s != '<') {			sprintf(scrbuf,"<%s>",artid_buf);			s = scrbuf;		    }		    break;		case 'I':			/* ref article indicator */		    s = scrbuf;		    sprintf(scrbuf,"'%s'",indstr);		    break;		case 'l':			/* rn library */#ifdef NEWS_ADMIN		    s = newsadmin;#else		    s = "???";#endif		    break;		case 'L':			/* login id */		    s = logname;		    break;		case 'm':		/* current mode */		    s = scrbuf;		    *s = mode;		    s[1] = '\0';		    break;		case 'M':		    sprintf(scrbuf,"%ld",(long)dmcount);		    s = scrbuf;		    break;		case 'n':			/* newsgroups */		    s = ngs_buf = fetchlines(art,NGS_LINE);		    break;		case 'N':			/* full name */		    s = getval("NAME",realname);		    break;		case 'o':			/* organization */#ifdef IGNOREORG		    s = getval("NEWSORG",orgname); #else		    s = getenv("NEWSORG");		    if (s == Nullch) 			s = getval("ORGANIZATION",orgname); #endif#ifdef ORGFILE		    if (*s == '/') {			FILE *ofp = fopen(s,"r");			if (ofp) {			    fgets(scrbuf,sizeof scrbuf,ofp);			    fclose(ofp);			    s = scrbuf+strlen(scrbuf)-1;			    if (*s == '\n')				*s = '\0';			    s = scrbuf;			}		    }#endif		    break;		case 'O':		    s = origdir;		    break;		case 'p':		    s = cwd;		    break;		case 'P':		    s = spool;		    break;		case 'r':		    parseheader(art);		    if (htype[REFS_LINE].ht_minpos >= 0) {			refs_buf = fetchlines(art,REFS_LINE);			refscpy(scrbuf,(sizeof scrbuf),refs_buf);		    }		    else			*scrbuf = '\0';		    s = rindex(scrbuf,'<');		    break;		case 'R':		    parseheader(art);		    if (htype[REFS_LINE].ht_minpos >= 0) {			refs_buf = fetchlines(art,REFS_LINE);			refscpy(scrbuf,(sizeof scrbuf),refs_buf);			/* no more than 3 prior references PLUS the			** root article allowed, including the one			** concatenated below */			if ((s = rindex(scrbuf,'<')) > scrbuf) {			    *s = '\0';			    h = rindex(scrbuf,'<');			    *s = '<';			    if (h > scrbuf) {				s = index(scrbuf+1,'<');				if (s < h)				    strcpy(s,h);			    }			}		    }		    else			*scrbuf = '\0';		    if (!artid_buf)			artid_buf = fetchlines(art,MESSID_LINE);		    if (artid_buf[0] == '<')			safecat(scrbuf,artid_buf,sizeof(scrbuf));		    else if (artid_buf[0]) {			char tmpbuf[64];    			sprintf(tmpbuf,"<%s>",artid_buf);			safecat(scrbuf,tmpbuf,sizeof(scrbuf));		    }		    s = scrbuf;		    break;		case 's':		    if (!(s=subj_buf))			s = subj_buf = fetchsubj(art,TRUE);						/* get subject handy */		    while ((*s=='R'||*s=='r')&&(s[1]=='E'||s[1]=='e')&&s[2]==':') {						/* skip extra Re: */			s += 3;			if (*s == ' ')			    s++;		    }		    if (h = instr(s,"- (nf", TRUE))			*h = '\0';		    break;		case 'S':		    if (!(s=subj_buf))			s = subj_buf = fetchsubj(art,TRUE);						/* get subject handy */		    if ((*s=='R'||*s=='r')&&(s[1]=='E'||s[1]=='e')&&s[2]==':') {						/* skip extra Re: */			s += 3;			if (*s == ' ')			    s++;		    }		    break;		case 't':		case 'T':		    parseheader(art);		    if (htype[REPLY_LINE].ht_minpos >= 0) {					/* was there a reply line? */			if (!(s=reply_buf))			    s = reply_buf = fetchlines(art,REPLY_LINE);		    }		    else if (!(s = from_buf))			s = from_buf = fetchlines(art,FROM_LINE);		    else			s = "noname";		    if (*pattern == 'T') {			if (htype[PATH_LINE].ht_minpos >= 0) {					/* should we substitute path? */			    s = path_buf = fetchlines(art,PATH_LINE);			}			i = strlen(phostname);			if (strnEQ(phostname,s,i) && s[i] == '!')			    s += i + 1;		    }		    if ((h=index(s,'(')) != Nullch)						/* strip garbage from end */			*(h-1) = '\0';		    else if ((h=index(s,'<')) != Nullch) {						/* or perhaps from beginning */			s = h+1;			if ((h=index(s,'>')) != Nullch)			    *h = '\0';		    }		    break;		case 'u':		    sprintf(scrbuf,"%ld",(long)toread[ng]);		    s = scrbuf;		    break;		case 'U': {		    int unseen;		    unseen = (art <= lastart) && !was_read(art);		    if (selected_only) {			int selected;			selected = (curr_artp->flags & AF_SEL);			sprintf(scrbuf,"%ld",				(long)selected_count - (selected && unseen));		    }		    else			sprintf(scrbuf,"%ld",(long)toread[ng] - unseen);		    s = scrbuf;		    break;		}		case 'v': {		    int selected, unseen;		    selected = (curr_artp->flags & AF_SEL);		    unseen = (art <= lastart) && !was_read(art);		    sprintf(scrbuf,"%ld",(long)toread[ng] - selected_count					 - (!selected && unseen));		    s = scrbuf;		    break;		}		case 'W':		    s = threaddir;		    break;		case 'x':			/* news library */		    s = lib;		    break;		case 'X':			/* rn library */		    s = rnlib;		    break;		case 'z':#ifdef LINKART		    s = linkartname;	/* so Eunice people get right file */#else		    s = scrbuf;		    sprintf(s,"%ld",(long)art);#endif		    if (stat(s,&filestat) < 0)			filestat.st_size = 0L;		    sprintf(scrbuf,"%5ld",(long)filestat.st_size);		    s = scrbuf;		    break;		case 'Z':		    sprintf(scrbuf,"%ld",(long)selected_count);		    s = scrbuf;		    break;		default:		    if (--destsize <= 0)			abort_interp();		    *dest++ = *pattern | metabit;		    s = nullstr;		    break;		}	    }	    if (!s)		s = nullstr;	    if (proc_sprintf) {		sprintf(scrbuf,spfbuf,s);		s = scrbuf;	    }	    pattern++;	    if (upper || lastcomp) {		char *t;		if (s != scrbuf) {		    safecpy(scrbuf,s,(sizeof scrbuf));		    s = scrbuf;		}		if (upper || !(t=rindex(s,'/')))		    t = s;		while (*t && !isalpha(*t))		    t++;		if (islower(*t))		    *t = toupper(*t);	    }	    /* Do we have room left? */	    i = strlen(s);	    if (destsize <= i)		abort_interp();	    destsize -= i;	/* adjust the size now. */	    /* A maze of twisty little conditions, all alike... */	    if (metabit) {		/* set meta bit while copying. */		i = metabit;		/* maybe get into register */		if (s == dest) {		    while (*dest)			*dest++ |= i;		} else {		    while (*s)			*dest++ = *s++ | i;		}	    } else if (re_quote) {		/* put a backslash before regexp specials while copying. */		if (s == dest) {		    /* copy out so we can copy in. */		    safecpy(scrbuf, s, sizeof scrbuf);		    s = scrbuf;		    if (i > sizeof scrbuf)	/* we truncated, ack! */			destsize += i - sizeof scrbuf;		}		while (*s) {		    if (index(regexp_specials, *s)) {			if (--destsize <= 0)			    abort_interp();			*dest++ = '\\';		    }		    *dest++ = *s++;		}	    } else {		/* straight copy. */		if (s == dest) {		    dest += i;		} else {		    while (*s)			*dest++ = *s++;		}	    }	}	else {	    if (--destsize <= 0)		abort_interp();	    if (*pattern == '^' && pattern[1]) {		++pattern;			/* skip uparrow */		i = *pattern;		/* get char into a register */		if (i == '?')		    *dest++ = '\177' | metabit;		else if (i == '(') {		    metabit = 0200;		    destsize++;		}		else if (i == ')') {		    metabit = 0;		    destsize++;		}		else		    *dest++ = (i & 037) | metabit;		pattern++;	    }	    else if (*pattern == '\\' && pattern[1]) {		++pattern;			/* skip backslash */		i = *pattern;		/* get char into a register */    		/* this used to be a switch but the if may save space */				if (i >= '0' && i <= '7') {		    i = 1;		    while (i < 01000 && *pattern >= '0' && *pattern <= '7') {			i <<= 3;			i += *pattern++ - '0';		    }		    *dest++ = (i & 0377) | metabit;		    --pattern;		}		else if (i == 'b')		    *dest++ = '\b' | metabit;		else if (i == 'f')		    *dest++ = '\f' | metabit;		else if (i == 'n')		    *dest++ = '\n' | metabit;		else if (i == 'r')		    *dest++ = '\r' | metabit;		else if (i == 't')		    *dest++ = '\t' | metabit;		else		    *dest++ = i | metabit;		pattern++;	    }	    else		*dest++ = *pattern++ | metabit;	}    }    *dest = '\0';getout:    if (subj_buf != Nullch)	/* return any checked out storage */	free(subj_buf);    if (ngs_buf != Nullch)	free(ngs_buf);    if (refs_buf != Nullch)	free(refs_buf);    if (artid_buf != Nullch)	free(artid_buf);    if (reply_buf != Nullch)	free(reply_buf);    if (from_buf != Nullch)	free(from_buf);    if (path_buf != Nullch)	free(path_buf);    if (follow_buf != Nullch)	free(follow_buf);    if (dist_buf != Nullch)	free(dist_buf);    if (line_buf != Nullch)	free(line_buf);    return pattern;			/* where we left off */}voidinterp(dest,destsize,pattern)char *dest;int destsize;char *pattern;{    dointerp(dest,destsize,pattern,Nullch);#ifdef DEBUG    if (debug & DEB_FILEXP)	fputs(dest,stdout);#endif}/* copy a references line, normalizing as we go */voidrefscpy(dest,destsize,src)register char *dest, *src;register int destsize;{    register char *dot, *at, *beg;    char tmpbuf[64];        while (*src) {	if (*src != '<') {	    if (--destsize <= 0)		break;	    *dest++ = '<';	    at = dot = Nullch;	    beg = src;	    while (*src && *src != ' ' && *src != ',') {		if (*src == '.')		    dot = src;		else if (*src == '@')		    at = src;		if (--destsize <= 0)		    break;		*dest++ = *src++;	    }	    if (destsize <= 0)		break;	    if (dot && !at) {		int len;		*dest = *dot++ = '\0';		sprintf(tmpbuf,"%s@%s.UUCP",dot,beg);		len = strlen(tmpbuf);		if (destsize > len) {		    strcpy(dest,tmpbuf);		    dest = dest + len;		    destsize -= len;		}	    }	    if (--destsize <= 0)		break;	    *dest++ = '>';	}	else {	    while (*src && --destsize > 0 && (*dest++ = *src++) != '>') ;	    if (destsize <= 0)		break;	}	while (*src == ' ' || *src == '\t' || *src == '\n' || *src == ',')	    src++;	if (*src && --destsize > 0)	    *dest++ = ' ';    }    *dest = '\0';} /* get the person's real name from /etc/passwd *//* (string is overwritten, so it must be copied) */char *getrealname(uid)long uid;{    char *s, *c;#ifdef PASSNAMES#ifdef HAS_GETPWENT#ifdef notdef    struct passwd *getpwuid _((uid_t));#endif    struct passwd *pwd = getpwuid(uid);    if (!pwd)	return nullstr;    s = pwd->pw_gecos;#else    char tmpbuf[512];    int i;    getpw(uid, tmpbuf);    for (s=tmpbuf, i=GCOSFIELD-1; i; i--) {	if (s)	    s = index(s,':')+1;    }    if (!s)	return nullstr;    cpytill(tmpbuf,s,':');    s = tmpbuf;#endif#ifdef BERKNAMES#ifdef BERKJUNK    while (*s && !isalnum(*s) && *s != '&') s++;#endif    if ((c = index(s, ',')) != Nullch)	*c = '\0';    if ((c = index(s, ';')) != Nullch)	*c = '\0';    s = cpytill(buf,s,'&');    if (*s == '&') {			/* whoever thought this one up was */	c = buf + strlen(buf);		/* in the middle of the night */	strcat(c,logname);		/* before the morning after */	strcat(c,s+1);	if (islower(*c))	    *c = toupper(*c);		/* gack and double gack */    }#else    if ((c = index(s, '(')) != Nullch)	*c = '\0';    if ((c = index(s, '-')) != Nullch)	s = c;    strcpy(buf,s);#endif#ifdef HAS_GETPWENT    endpwent();#endif    return buf;				/* return something static */#else    if ((tmpfp=fopen(filexp(FULLNAMEFILE),"r")) != Nullfp) {	fgets(buf,sizeof buf,tmpfp);	fclose(tmpfp);	buf[strlen(buf)-1] = '\0';	return buf;    }    return "PUT YOUR NAME HERE";#endif}static voidabort_interp(){    fputs("\n% interp buffer overflow!\n",stdout) FLUSH;    sig_catcher(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -