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

📄 here.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "rc.h"#include "exec.h"#include "io.h"#include "fns.h"struct here *here, **ehere;int ser = 0;char tmp[]="/tmp/here0000.0000";char hex[]="0123456789abcdef";void psubst(io*, char*);void pstrs(io*, word*);voidhexnum(char *p, int n){	*p++=hex[(n>>12)&0xF];	*p++=hex[(n>>8)&0xF];	*p++=hex[(n>>4)&0xF];	*p = hex[n&0xF];}tree*heredoc(tree *tag){	struct here *h = new(struct here);	if(tag->type!=WORD)		yyerror("Bad here tag");	h->next = 0;	if(here)		*ehere = h;	else		here = h;	ehere=&h->next;	h->tag = tag;	hexnum(&tmp[9], getpid());	hexnum(&tmp[14], ser++);	h->name = strdup(tmp);	return token(tmp, WORD);}/* * bug: lines longer than NLINE get split -- this can cause spurious * missubstitution, or a misrecognized EOF marker. */#define	NLINE	4096voidreadhere(void){	struct here *h, *nexth;	io *f;	char *s, *tag;	int c, subst;	char line[NLINE+1];	for(h = here;h;h = nexth){		subst=!h->tag->quoted;		tag = h->tag->str;		c = Creat(h->name);		if(c<0)			yyerror("can't create here document");		f = openfd(c);		s = line;		pprompt();		while((c = rchr(runq->cmdfd))!=EOF){			if(c=='\n' || s==&line[NLINE]){				*s='\0';				if(tag && strcmp(line, tag)==0) break;				if(subst)					psubst(f, line);				else pstr(f, line);				s = line;				if(c=='\n'){					pprompt();					pchr(f, c);				}				else *s++=c;			}			else *s++=c;		}		flush(f);		closeio(f);		cleanhere(h->name);		nexth = h->next;		efree((char *)h);	}	here = 0;	doprompt = 1;}voidpsubst(io *f, char *s){	char *t, *u;	int savec, n;	word *star;	while(*s){		if(*s!='$'){			if(0xa0<=(*s&0xff) && (*s&0xff)<=0xf5){				pchr(f, *s++);				if(*s=='\0')					break;			}			else if(0xf6<=(*s&0xff) && (*s&0xff)<=0xf7){				pchr(f, *s++);				if(*s=='\0')					break;				pchr(f, *s++);				if(*s=='\0')					break;			}			pchr(f, *s++);		}		else{			t=++s;			if(*t=='$')				pchr(f, *t++);			else{				while(*t && idchr(*t)) t++;				savec=*t;				*t='\0';				n = 0;				for(u = s;*u && '0'<=*u && *u<='9';u++) n = n*10+*u-'0';				if(n && *u=='\0'){					star = vlook("*")->val;					if(star && 1<=n && n<=count(star)){						while(--n) star = star->next;						pstr(f, star->word);					}				}				else					pstrs(f, vlook(s)->val);				*t = savec;				if(savec=='^')					t++;			}			s = t;		}	}}voidpstrs(io *f, word *a){	if(a){		while(a->next && a->next->word){			pstr(f, a->word);			pchr(f, ' ');			a = a->next;		}		pstr(f, a->word);	}}

⌨️ 快捷键说明

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