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

📄 html.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * Emit html.  Keep track of tags so that user doesn't have to. */#include "a.h"typedef struct Tag Tag;struct Tag{	Tag *next;	Rune *id;	Rune *open;	Rune *close;};Tag *tagstack;Tag *tagset;int hidingset;static Rune*closingtag(Rune *s){	Rune *t;	Rune *p0, *p;		t = runemalloc(sizeof(Rune));	if(s == nil)		return t;	for(p=s; *p; p++){		if(*p == Ult){			p++;			if(*p == '/'){				while(*p && *p != Ugt)					p++;				goto close;			}			p0 = p;			while(*p && !isspacerune(*p) && *p != Uspace && *p != Ugt)				p++;			t = runerealloc(t, 1+(p-p0)+2+runestrlen(t)+1);			runemove(t+(p-p0)+3, t, runestrlen(t)+1);			t[0] = Ult;			t[1] = '/';			runemove(t+2, p0, p-p0);			t[2+(p-p0)] = Ugt;		}				if(*p == Ugt && p>s && *(p-1) == '/'){		close:			for(p0=t+1; *p0 && *p0 != Ult; p0++)				;			runemove(t, p0, runestrlen(p0)+1);		}	}	return t;	}voidhtml(Rune *id, Rune *s){	Rune *es;	Tag *t, *tt, *next;	br();	hideihtml();	/* br already did, but be paranoid */	for(t=tagstack; t; t=t->next){		if(runestrcmp(t->id, id) == 0){			for(tt=tagstack;; tt=next){				next = tt->next;				free(tt->id);				free(tt->open);				out(tt->close);				outrune('\n');				free(tt->close);				free(tt);				if(tt == t){					tagstack = next;					goto cleared;				}			}		}	}cleared:	if(s == nil || s[0] == 0)		return;	out(s);	outrune('\n');	es = closingtag(s);	if(es[0] == 0){		free(es);		return;	}	if(runestrcmp(id, L("-")) == 0){		out(es);		outrune('\n');		free(es);		return;	}	t = emalloc(sizeof *t);	t->id = erunestrdup(id);	t->close = es;	t->next = tagstack;	tagstack = t;}voidclosehtml(void){	Tag *t, *next;		br();	hideihtml();	for(t=tagstack; t; t=next){		next = t->next;		out(t->close);		outrune('\n');		free(t->id);		free(t->close);		free(t);	}}static voidrshow(Tag *t, Tag *end){	if(t == nil || t == end)		return;	rshow(t->next, end);	out(t->open);}voidihtml(Rune *id, Rune *s){	Tag *t, *tt, **l;	for(t=tagset; t; t=t->next){		if(runestrcmp(t->id, id) == 0){			if(s && t->open && runestrcmp(t->open, s) == 0)				return;			for(l=&tagset; (tt=*l); l=&tt->next){				if(!hidingset)					out(tt->close);				if(tt == t)					break;			}			*l = t->next;			free(t->id);			free(t->close);			free(t->open);			free(t);			if(!hidingset)				rshow(tagset, *l);			goto cleared;		}	}cleared:	if(s == nil || s[0] == 0)		return;	t = emalloc(sizeof *t);	t->id = erunestrdup(id);	t->open = erunestrdup(s);	t->close = closingtag(s);	if(!hidingset)		out(s);	t->next = tagset;	tagset = t;}voidhideihtml(void){	Tag *t;	if(hidingset)		return;	hidingset = 1;	for(t=tagset; t; t=t->next)		out(t->close);}voidshowihtml(void){	if(!hidingset)		return;	hidingset = 0;	rshow(tagset, nil);}inte_lt(void){	return Ult;}inte_gt(void){	return Ugt;}inte_at(void){	return Uamp;}inte_tick(void){	return Utick;}inte_btick(void){	return Ubtick;}inte_minus(void){	return Uminus;}voidr_html(Rune *name){	Rune *id, *line, *p;		id = copyarg();	line = readline(HtmlMode);	for(p=line; *p; p++){		switch(*p){		case '<':			*p = Ult;			break;		case '>':			*p = Ugt;			break;		case '&':			*p = Uamp;			break;		case ' ':			*p = Uspace;			break;		}	}	if(name[0] == 'i')		ihtml(id, line);	else		html(id, line);	free(id);	free(line);}char defaultfont[] =	".ihtml f1\n"	".ihtml f\n"	".ihtml f <span style=\"font-size: \\n(.spt\">\n"	".if \\n(.f==2 .ihtml f1 <i>\n"	".if \\n(.f==3 .ihtml f1 <b>\n"	".if \\n(.f==4 .ihtml f1 <b><i>\n"	".if \\n(.f==5 .ihtml f1 <tt>\n"	".if \\n(.f==6 .ihtml f1 <tt><i>\n"	"..\n";voidhtmlinit(void){	addraw(L("html"), r_html);	addraw(L("ihtml"), r_html);	addesc('<', e_lt, CopyMode);	addesc('>', e_gt, CopyMode);	addesc('\'', e_tick, CopyMode);	addesc('`', e_btick, CopyMode);	addesc('-', e_minus, CopyMode);	addesc('@', e_at, CopyMode);		ds(L("font"), L(defaultfont));}

⌨️ 快捷键说明

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