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

📄 ms2html.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
lower(char *p){	char *x;	for(x = p; *x; x++)		if(*x >= 'A' && *x <= 'Z')			*x -= 'A' - 'a';	return p;}voidg_I(int argc, char **argv){	int anchor;	char *p;	anchor = 0;	if(argc > 2){		p = argv[2];		if(p[0] == '(')		if(p[1] >= '0' && p[1] <= '9')		if(p[2] == ')'){			anchor = 1;			Bprint(&bout, "<A href=\"/magic/man2html/%c/%s\">",				p[1], lower(argv[1]));		}	}	font(&ifont, argc, argv);	if(anchor)		Bprint(&bout, "</A>");}voidg_br(int, char**){	if(hangingdt){		Bprint(&bout, "<dd>");		hangingdt = 0;	}else		Bprint(&bout, "<br>\n");}voidg_P1(int, char**){	if(example == 0){		example = 1;		Bprint(&bout, "<DL><DT><DD><TT><PRE>\n");	}}voidg_P2(int, char**){	if(example){		example = 0;		Bprint(&bout, "</PRE></TT></DL>\n");	}}voidg_SM(int, char **argv){	Bprint(&bout, "%s", argv[1]);}voidg_ft(int argc, char **argv){	if(argc < 2){		pushfont(nil);		return;	}	switch(argv[1][0]){	case '3':	case 'B':		pushfont(&bfont);		break;	case '2':	case 'I':		pushfont(&ifont);		break;	case '4':		pushfont(&bifont);		break;	case '5':		pushfont(&cwfont);		break;	case 'P':		popfont();		break;	case 'R':	default:		pushfont(nil);		break;	}}voidg_sp(int argc, char **argv){	int n;	n = 1;	if(argc > 1){		n = atoi(argv[1]);		if(n < 1)			n = 1;		if(argv[1][strlen(argv[1])-1] == 'i')			n *= 4;	}	if(n > 5){		Bprint(&bout, "<br>&#32;<br>\n");		Bprint(&bout, "<HR>\n");		Bprint(&bout, "<br>&#32;<br>\n");	} else		for(; n > 0; n--)			Bprint(&bout, "<br>&#32;<br>\n");} voidrm_loop(char *name, String **l){	String *s;	for(s = *l; s != nil; s = *l){		if(strcmp(name, s->name) == 0){			*l = s->next;			free(s->name);			free(s->val);			free(s);			break;			}		l = &s->next;		}	}voidg_rm(int argc, char **argv){	Goobie *g;	char *name;	int i;	for(i = 1; i < argc; i++) {		name = argv[i];		rm_loop(name, &strings);		rm_loop(name, &macros);		for(g = gtab; g->name; g++)			if (strcmp(g->name, name) == 0) {				g->f = g_ignore;				break;				}		}	}voidg_AB(int, char**){	closel();	dohangingcenter();	Bprint(&bout, "<center><H4>ABSTRACT</H4></center><DL><DD>\n");}voidg_AE(int, char**){	Bprint(&bout, "</DL>\n");}voidg_FS(int, char **){	char *argv[3];	argv[0] = "IP";	argv[1] = nil;	argv[2] = nil;	g_IP(1, argv);	Bprint(&bout, "NOTE:<I> ");}voidg_FE(int, char **){	Bprint(&bout, "</I><DT>&#32;<DD>");	closel();	Bprint(&bout, "<br>\n");}voidg_de(int argc, char **argv){	int r;	char *p, *cp;	String *m;	int len;	if(argc < 2)		return;	m = nil;	len = 0;	if(strcmp(argv[0], "am") == 0){		for(m = macros; m != nil; m = m->next)			if(strcmp(argv[1], m->name) == 0){				len = strlen(m->val);				break;			}		if(m == nil){			/* nothing to append to */			for(;;){				p = Brdline(&ssp->in, '\n');				if(p == nil)					break;				p[Blinelen(&ssp->in)-1] = 0;				if(strcmp(p, "..") == 0)					break;			}			return;		}	}	if(m == nil){		m = emalloc(sizeof(*m));		m->next = macros;		macros = m;		m->name = strdup(argv[1]);		m->val = nil;		len = 0;	}	/* read up to a .. removing double backslashes */	for(;;){		p = Brdline(&ssp->in, '\n');		if(p == nil)			break;		p[Blinelen(&ssp->in)-1] = 0;		if(strcmp(p, "..") == 0)			break;		m->val = realloc(m->val, len + Blinelen(&ssp->in)+1);		cp = m->val + len;		while(*p){			r = *p++;			if(r == '\\' && *p == '\\')				p++;			*cp++ = r;		}		*cp++ = '\n';		len = cp - m->val;		*cp = 0;	}}voidg_hrule(int, char**){	Bprint(&bout, "<HR>\n");}voidg_BX(int argc, char **argv){	Bprint(&bout, "<HR>\n");	printargs(argc, argv);	Bprint(&bout, "<HR>\n");}voidg_IH(int, char**){	Bprint(&bout, "Bell Laboratories, Naperville, Illinois, 60540\n");}voidg_MH(int, char**){	Bprint(&bout, "Bell Laboratories, Murray Hill, NJ, 07974\n");}voidg_PY(int, char**){	Bprint(&bout, "Bell Laboratories, Piscataway, NJ, 08854\n");}voidg_HO(int, char**){	Bprint(&bout, "Bell Laboratories, Holmdel, NJ, 07733\n");}voidg_QS(int, char**){	Bprint(&bout, "<BLOCKQUOTE>\n");}voidg_QE(int, char**){	Bprint(&bout, "</BLOCKQUOTE>\n");}voidg_RS(int, char**){	Bprint(&bout, "<DL><DD>\n");}voidg_RE(int, char**){	Bprint(&bout, "</DL>\n");}int gif;voidg_startgif(int, char **argv){	int fd;	int pfd[2];	char *e, *p;	char name[32];	Dir *d;	if(strcmp(argv[0], "EQ") == 0)		e = ".EN";	else if(strcmp(argv[0], "TS") == 0)		e = ".TE";	else if(strcmp(argv[0], "PS") == 0)		e = ".PE";	else		return;	if(basename)		p = basename;	else{		p = strrchr(sstack[0].filename, '/');		if(p != nil)			p++;		else			p = sstack[0].filename;	}	snprint(name, sizeof(name), "%s.%d.gif", p, gif++);	fd = create(name, OWRITE, 0664);	if(fd < 0){		fprint(2, "ms2html: can't create %s: %r\n", name);		return;	}	if(pipe(pfd) < 0){		fprint(2, "ms2html: can't create pipe: %r\n");		close(fd);		return;	}	switch(rfork(RFFDG|RFPROC)){	case -1:		fprint(2, "ms2html: can't fork: %r\n");		close(fd);		return;	case 0:		dup(fd, 1);		close(fd);		dup(pfd[0], 0);		close(pfd[0]);		close(pfd[1]);		execl("/bin/troff2gif", "troff2gif", nil);		fprint(2, "ms2html: couldn't exec troff2gif: %r\n");		_exits(nil);	default:		close(fd);		close(pfd[0]);		fprint(pfd[1], ".ll 7i\n");	/*	fprint(pfd[1], ".EQ\ndelim %s\n.EN\n", delim); */	/*	fprint(pfd[1], ".%s\n", argv[0]); */		for(;;){			p = Brdline(&ssp->in, '\n');			if(p == nil)				break;			ssp->lno++;			ssp->rlno++;			if(write(pfd[1], p, Blinelen(&ssp->in)) < 0)				break;			if(strncmp(p, e, 3) == 0)				break;		}		close(pfd[1]);		waitpid();		d = dirstat(name);		if(d == nil)			break;		if(d->length == 0){			remove(name);			free(d);			break;		}		free(d);		fprint(2, "ms2html: created auxiliary file %s\n", name);		Bprint(&bout, "<br><img src=\"%s\"><br>\n", name);		break;	}}voidg_lf(int argc, char **argv){	if(argc > 2)		snprint(ssp->filename, sizeof(ssp->filename), argv[2]);	if(argc > 1)		ssp->rlno = atoi(argv[1]);}voidg_so(int argc, char **argv){	ssp->lno++;	ssp->rlno++;	if(argc > 1)		pushsrc(argv[1]);}voidg_BP(int argc, char **argv){	int fd;	char *p, *ext;	char name[32];	Dir *d;	if(argc < 2)		return;	p = strrchr(argv[1], '/');	if(p != nil)		p++;	else		p = argv[1];	ext = strrchr(p, '.');	if(ext){		if(strcmp(ext, ".jpeg") == 0		|| strcmp(ext, ".gif") == 0){			Bprint(&bout, "<br><img src=\"%s\"><br>\n", argv[1]);			return;		}	}	snprint(name, sizeof(name), "%s.%d%d.gif", p, getpid(), gif++);	fd = create(name, OWRITE, 0664);	if(fd < 0){		fprint(2, "ms2html: can't create %s: %r\n", name);		return;	}	switch(rfork(RFFDG|RFPROC)){	case -1:		fprint(2, "ms2html: can't fork: %r\n");		close(fd);		return;	case 0:		dup(fd, 1);		close(fd);		execl("/bin/ps2gif", "ps2gif", argv[1], nil);		fprint(2, "ms2html: couldn't exec ps2gif: %r\n");		_exits(nil);	default:		close(fd);		waitpid();		d = dirstat(name);		if(d == nil)			break;		if(d->length == 0){			remove(name);			free(d);			break;		}		free(d);		fprint(2, "ms2html: created auxiliary file %s\n", name);		Bprint(&bout, "<br><img src=\"%s\"><br>\n", name);		break;	}}/* insert straight HTML into output */voidg__H(int argc, char **argv){	int i;	for(i = 1; i < argc; i++)		Bprint(&bout, "%s ", argv[i]);	Bprint(&bout, "\n");}/* HTML page title */voidg__T(int argc, char **argv){	if(titleseen)		return;	Bprint(&bout, "<title>\n");	printargs(argc, argv);	Bprint(&bout, "</title></head><body>\n");	titleseen = 1;}voidg_nr(int argc, char **argv){	char *val;	if (argc > 1) {		if (argc == 2)			val = "0";		else			val = argv[2];		dsnr(argv[1], val, &numregs);	}}voidzerodivide(void){	fprint(2, "stdin %d(%s:%d): division by 0\n",		ssp->lno, ssp->filename, ssp->rlno);}intnumval(char **pline, int recur){	char *p;	int neg, x, y;	x = neg = 0;	p = *pline;	while(*p == '-') {		neg = 1 - neg;		p++;	}	if (*p == '(') {		p++;		x = numval(&p, 1);		if (*p != ')')			goto done;		p++;	}	else while(*p >= '0' && *p <= '9')		x = 10*x + *p++ - '0';	if (neg)		x = -x;	if (recur)	    for(;;) {		switch(*p++) {		case '+':			x += numval(&p, 0);			continue;		case '-':			x -= numval(&p, 0);			continue;		case '*':			x *= numval(&p, 0);			continue;		case '/':			y = numval(&p, 0);			if (y == 0) {				zerodivide();				x = 0;				goto done;			}			x /= y;			continue;		case '<':			if (*p == '=') {				p++;				x = x <= numval(&p, 0);				continue;			}			x = x < numval(&p, 0);			continue;		case '>':			if (*p == '=') {				p++;				x = x >= numval(&p, 0);				continue;			}			x = x > numval(&p, 0);			continue;		case '=':			if (*p == '=')				p++;			x = x == numval(&p, 0);			continue;		case '&':			x &= numval(&p, 0);			continue;		case ':':			x |= numval(&p, 0);			continue;		case '%':			y = numval(&p, 0);			if (!y) {				zerodivide();				goto done;			}			x %= y;			continue;		}		--p;		break;	} done:	*pline = p;	return x;}intiftest(char *p, char **bp){	char *p1;	int c, neg, rv;	rv = neg = 0;	if (*p == '!') {		neg = 1;		p++;	}	c = *p;	if (c >= '0' && c <= '9' || c == '+' || c == '-' || c == '('/*)*/) {		if (numval(&p,1) >= 1)			rv = 1;		goto done;	}	switch(c) {	case 't':	case 'o':		rv = 1;	case 'n':	case 'e':		p++;		goto done;	}	for(p1 = ++p; *p != c; p++)		if (!*p)			goto done;	for(p++;;) {		if (*p != *p1++) {			while(*p && *p++ != c);			goto done;		}		if (*p++ == c)			break;	}	rv = 1; done:	if (neg)		rv = 1 - rv;	while(*p == ' ' || *p == '\t')		p++;	*bp = p;	return rv;}voidscanline(char *p, char *e, int wantnl){	int c;	Rune r;	while((c = getrune()) == ' ' || c == '\t') ;	while(p < e) {		if (c < 0)			break;		if (c < Runeself) {			if (c == '\n') {				if (wantnl)					*p++ = c;				break;			}			*p++ = c;		}		else {			r = c;			p += runetochar(p, &r);		}		c = getrune();	}	*p = 0;}voidpushbody(char *line){	char *b;	if (line[0] == '\\' && line[1] == '{' /*}*/ )		line += 2;	if (strsp < Maxmstack - 1) {		pushstr(b = strdup(line));		mustfree[strsp] = b;	}}voidskipbody(char *line){	int c, n;	if (line[0] != '\\' || line[1] != '{' /*}*/ )		return;	for(n = 1;;) {		while((c = getrune()) != '\\')			if (c < 0)				return;		c = getrune();		if (c == '{')			n++;		else if ((c == '}' && (c = getrune()) == '\n' && !--n)			|| c < 0)			return;	}}intifstart(char *line, char *e, char **bp){	int it;	char *b;	b = copyline(line, e, 1);	ungetrune();	b[-1] = getrune();	scanline(b, e, 1);	it = iftest(line, bp);	return it;}voidg_ie(char *line, char *e){	char *b;	if (elsetop >= Maxif-1) {		fprint(2, "ms2html: .ie's too deep\n");		return;	}	if (ifwastrue[++elsetop] = ifstart(line, e, &b))		pushbody(b);	else		skipbody(b);}voidg_if(char *line, char *e){	char *b;	if (ifstart(line, e, &b))		pushbody(b);	else		skipbody(b);}voidg_el(char *line, char *e){	if (elsetop < 0)		return;	scanline(line, e, 1);	if (ifwastrue[elsetop--])		skipbody(line);	else		pushbody(line);}voidg_ig(int argc, char **argv){	char *p, *s;	s = "..";	if (argc > 1)		s = argv[1];	for(;;) {		p = Brdline(&ssp->in, '\n');		if(p == nil)			break;		p[Blinelen(&ssp->in)-1] = 0;		if(strcmp(p, s) == 0)			break;	}}voidg_ds(char *line, char *e){	char *b;	b = copyline(line, e, 1);	if (b > line) {		copyline(b, e, 0);		if (*b == '"')			b++;		ds(line, b);	}}voidg_as(char *line, char *e){	String *s;	char *b;	b = copyline(line, e, 1);	if (b == line)		return;	copyline(b, e, 0);	if (*b == '"')		b++;	for(s = strings; s != nil; s = s->next)		if(strcmp(line, s->name) == 0)			break;	if(s == nil){		ds(line, b);		return;	}	s->val = realloc(s->val, strlen(s->val) + strlen(b) + 1);	strcat(s->val, b);}voidg_BS(int argc, char **argv){	int i;	if (argc > 1 && !weBref) {		Bprint(&bout, "<a href=\"%s\"", argv[1]);		for(i = 2; i < argc; i++)			Bprint(&bout, " %s", argv[i]);		Bprint(&bout, ">");		weBref = 1;	}}voidg_BE(int, char**){	if (weBref) {		Bprint(&bout, "</a>");		weBref = 0;	}}voidg_LB(int argc, char **argv){	if (argc > 1) {		if (weBref)			g_BE(0,nil);		Bprint(&bout, "<a name=\"%s\"></a>", argv[1]);	}}voidg_RT(int, char**){	g_BE(0,nil);	dohanginghead();	closel();	closefont();}

⌨️ 快捷键说明

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