📄 intrp.c
字号:
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 + -