build.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 2,670 行 · 第 1/5 页

C
2,670
字号
						align,						auintval(tok, Awidth, 0),						auintval(tok, Aheight, 0),						auintval(tok, Ahspace, IMGHSPACE),						auintval(tok, Avspace, IMGVSPACE),						auintval(tok, Aborder, dfltbd),						aflagval(tok, Aismap),						map);				if(align == ALleft || align == ALright) {					additem(ps, newifloat(img, align), tok);					// if no hspace specified, use FLTIMGHSPACE					if(!_tokaval(tok, Ahspace, &val, 0))						((Iimage*)img)->hspace = FLTIMGHSPACE;				}				else {					ps->skipwhite = 0;					additem(ps, img, tok);				}				if(!ps->skipping) {					((Iimage*)img)->nextimage = di->images;					di->images = (Iimage*)img;				}				ps->curanchor = oldcuranchor;				break;			// <!ELEMENT INPUT - O EMPTY>			case Tinput:				ps->skipwhite = 0;				if(is->curform == nil) {					if(warn)						fprint(2, "<INPUT> not inside <FORM>\n");					continue;				}				is->curform->fields = field = newformfield(						atabval(tok, Atype, input_tab, NINPUTTAB, Ftext),						++is->curform->nfields,						is->curform,						aval(tok, Aname),						aval(tok, Avalue),						auintval(tok, Asize, 0),						auintval(tok, Amaxlength, 1000),						is->curform->fields);				if(aflagval(tok, Achecked))					field->flags = FFchecked;				switch(field->ftype) {				case Ftext:				case Fpassword:				case Ffile:					if(field->size == 0)						field->size = 20;					break;				case Fcheckbox:					if(field->name == nil) {						if(warn)							fprint(2, "warning: checkbox form field missing name\n");						continue;					}					if(field->value == nil)						field->value = _Strdup(L"1");					break;				case Fradio:					if(field->name == nil || field->value == nil) {						if(warn)							fprint(2, "warning: radio form field missing name or value\n");						continue;					}					break;				case Fsubmit:					if(field->value == nil)						field->value = _Strdup(L"Submit");					if(field->name == nil)						field->name = _Strdup(L"_no_name_submit_");					break;				case Fimage:					src = aurlval(tok, Asrc, nil, di->base);					if(src == nil) {						if(warn)							fprint(2, "warning: image form field missing src\n");						continue;					}					// width and height attrs aren't specified in HTML 3.2,					// but some people provide them and they help avoid					// a relayout					field->image = newiimage(src,						astrval(tok, Aalt, L"Submit"),						atabval(tok, Aalign, align_tab, NALIGNTAB, ALbottom),						auintval(tok, Awidth, 0), auintval(tok, Aheight, 0),						0, 0, 0, 0, nil);					ii = (Iimage*)field->image;					ii->nextimage = di->images;					di->images = ii;					break;				case Freset:					if(field->value == nil)						field->value = _Strdup(L"Reset");					break;				case Fbutton:					if(field->value == nil)						field->value = _Strdup(L" ");					break;				}				ffit = newiformfield(field);				additem(ps, ffit, tok);				if(ffit->genattr != nil)					field->events = ffit->genattr->events;				break;			// <!ENTITY ISINDEX - O EMPTY>			case Tisindex:				ps->skipwhite = 0;				prompt = astrval(tok, Aprompt, L"Index search terms:");				target = atargval(tok, di->target);				additem(ps, textit(ps, prompt), tok);				frm = newform(++is->nforms,						nil,						di->base,						target,						HGet,						di->forms);				di->forms = frm;				ff = newformfield(Ftext,						1,						frm,						_Strdup(L"_ISINDEX_"),						nil,						50,						1000,						nil);				frm->fields = ff;				frm->nfields = 1;				additem(ps, newiformfield(ff), tok);				addbrk(ps, 1, 0);				break;			// <!ELEMENT LI - O %flow>			case Tli:				if(ps->listtypestk.n == 0) {					if(warn)						fprint(2, "<LI> not in list\n");					continue;				}				ty = top(&ps->listtypestk, 0);				ty2 = listtyval(tok, ty);				if(ty != ty2) {					ty = ty2;					push(&ps->listtypestk, ty2);				}				v = aintval(tok, Avalue, top(&ps->listcntstk, 1));				if(ty == LTdisc || ty == LTsquare || ty == LTcircle)					hang = 10*LISTTAB - 3;				else					hang = 10*LISTTAB - 1;				changehang(ps, hang);				addtext(ps, listmark(ty, v));				push(&ps->listcntstk, v + 1);				changehang(ps, -hang);				ps->skipwhite = 1;				break;			// <!ELEMENT MAP - - (AREA)+>			case Tmap:				if(_tokaval(tok, Aname, &name, 0))					is->curmap = getmap(di, name);				break;			case Tmap+RBRA:				map = is->curmap;				if(map == nil) {					if(warn)						fprint(2, "warning: unexpected </MAP>\n");					continue;				}				map->areas = (Area*)_revlist((List*)map->areas);				break;			case Tmeta:				if(ps->skipping)					continue;				if(_tokaval(tok, Ahttp_equiv, &equiv, 0)) {					val = aval(tok, Acontent);					n = _Strlen(equiv);					if(!_Strncmpci(equiv, n, L"refresh"))						di->refresh = val;					else if(!_Strncmpci(equiv, n, L"content-script-type")) {						n = _Strlen(val);						if(!_Strncmpci(val, n, L"javascript")						   || !_Strncmpci(val, n, L"jscript1.1")						   || !_Strncmpci(val, n, L"jscript"))							di->scripttype = TextJavascript;						else {							if(warn)								fprint(2, "unimplemented script type %S\n", val);							di->scripttype = UnknownType;						}					}				}				break;			// Nobr is NOT in HMTL 4.0, but it is ubiquitous on the web			case Tnobr:				ps->skipwhite = 0;				ps->curstate &= ~IFwrap;				break;			case Tnobr+RBRA:				ps->curstate |= IFwrap;				break;			// We do frames, so skip stuff in noframes			case Tnoframes:				ps->skipping = 1;				break;			case Tnoframes+RBRA:				ps->skipping = 0;				break;			// We do scripts (if enabled), so skip stuff in noscripts			case Tnoscript:				if(doscripts)					ps->skipping = 1;				break;			case Tnoscript+RBRA:				if(doscripts)					ps->skipping = 0;				break;			// <!ELEMENT OPTION - O (	//PCDATA)>			case Toption:				if(is->curform == nil || is->curform->fields == nil) {					if(warn)						fprint(2, "warning: <OPTION> not in <SELECT>\n");					continue;				}				field = is->curform->fields;				if(field->ftype != Fselect) {					if(warn)						fprint(2, "warning: <OPTION> not in <SELECT>\n");					continue;				}				val = aval(tok, Avalue);				option = newoption(aflagval(tok, Aselected), val, nil, field->options);				field->options = option;				option->display =  getpcdata(toks, tokslen, &toki);				if(val == nil)					option->value = _Strdup(option->display);				break;			// <!ELEMENT P - O (%text)* >			case Tp:				pushjust(ps, atabval(tok, Aalign, align_tab, NALIGNTAB, ps->curjust));				ps->inpar = 1;				ps->skipwhite = 1;				break;			case Tp+RBRA:				break;			// <!ELEMENT PARAM - O EMPTY>			// Do something when we do applets...			case Tparam:				break;			// <!ELEMENT PRE - - (%text)* -(IMG|BIG|SMALL|SUB|SUP|FONT) >			case Tpre:				ps->curstate &= ~IFwrap;				ps->literal = 1;				ps->skipwhite = 0;				pushfontstyle(ps, FntT);				break;			case Tpre+RBRA:				ps->curstate |= IFwrap;				if(ps->literal) {					popfontstyle(ps);					ps->literal = 0;				}				break;			// <!ELEMENT SCRIPT - - CDATA>			case Tscript:				if(doscripts) {					if(!di->hasscripts) {						if(di->scripttype == TextJavascript) {							// TODO: initialize script if nec.							// initjscript(di);							di->hasscripts = 1;						}					}				}				if(!di->hasscripts) {					if(warn)						fprint(2, "warning: <SCRIPT> ignored\n");					ps->skipping = 1;				}				else {					scriptsrc = aurlval(tok, Asrc, nil, di->base);					script = nil;					if(scriptsrc != nil) {						if(warn)							fprint(2, "warning: non-local <SCRIPT> ignored\n");						free(scriptsrc);					}					else {						script = getpcdata(toks, tokslen, &toki);					}					if(script != nil) {						if(warn)							fprint(2, "script ignored\n");						free(script);					}				}				break;			case Tscript+RBRA:				ps->skipping = 0;				break;			// <!ELEMENT SELECT - - (OPTION+)>			case Tselect:				if(is->curform == nil) {					if(warn)						fprint(2, "<SELECT> not inside <FORM>\n");					continue;				}				field = newformfield(Fselect,					++is->curform->nfields,					is->curform,					aval(tok, Aname),					nil,					auintval(tok, Asize, 0),					0,					is->curform->fields);				is->curform->fields = field;				if(aflagval(tok, Amultiple))					field->flags = FFmultiple;				ffit = newiformfield(field);				additem(ps, ffit, tok);				if(ffit->genattr != nil)					field->events = ffit->genattr->events;				// throw away stuff until next tag (should be <OPTION>)				s = getpcdata(toks, tokslen, &toki);				if(s != nil)					free(s);				break;			case Tselect+RBRA:				if(is->curform == nil || is->curform->fields == nil) {					if(warn)						fprint(2, "warning: unexpected </SELECT>\n");					continue;				}				field = is->curform->fields;				if(field->ftype != Fselect)					continue;				// put options back in input order				field->options = (Option*)_revlist((List*)field->options);				break;			// <!ELEMENT (STRIKE|U) - - (%text)*>			case Tstrike:			case Tu:				ps->curul = push(&ps->ulstk, (tag==Tstrike)? ULmid : ULunder);				break;			case Tstrike+RBRA:			case Tu+RBRA:				if(ps->ulstk.n == 0) {					if(warn)						fprint(2, "warning: unexpected %T\n", tok);					continue;				}				ps->curul = popretnewtop(&ps->ulstk, ULnone);				break;			// <!ELEMENT STYLE - - CDATA>			case Tstyle:				if(warn)					fprint(2, "warning: unimplemented <STYLE>\n");				ps->skipping = 1;				break;			case Tstyle+RBRA:				ps->skipping = 0;				break;			// <!ELEMENT (SUB|SUP) - - (%text)*>			case Tsub:			case Tsup:				if(tag == Tsub)					ps->curvoff += SUBOFF;				else					ps->curvoff -= SUPOFF;				push(&ps->voffstk, ps->curvoff);				sz = top(&ps->fntsizestk, Normal);				pushfontsize(ps, sz - 1);				break;			case Tsub+RBRA:			case Tsup+RBRA:				if(ps->voffstk.n == 0) {					if(warn)						fprint(2, "warning: unexpected %T\n", tok);					continue;				}				ps->curvoff = popretnewtop(&ps->voffstk, 0);				popfontsize(ps);				break;			// <!ELEMENT TABLE - - (CAPTION?, TR+)>			case Ttable:				ps->skipwhite = 0;				tab = newtable(++is->ntables,						aalign(tok),						adimen(tok, Awidth),						aflagval(tok, Aborder), 						auintval(tok, Acellspacing, TABSP),						auintval(tok, Acellpadding, TABPAD),						makebackground(nil, acolorval(tok, Abgcolor, ps->curbg.color)),						tok,						is->tabstk);				is->tabstk = tab;				curtab = tab;				break;			case Ttable+RBRA:				if(curtab == nil) {					if(warn)						fprint(2, "warning: unexpected </TABLE>\n");					continue;				}				isempty = (curtab->cells == nil);				if(isempty) {					if(warn)						fprint(2, "warning: <TABLE> has no cells\n");				}				else {					ps = finishcell(curtab, ps);					if(curtab->rows != nil)						curtab->rows->flags = 0;					finish_table(curtab);				}				ps->skipping = 0;				if(!isempty) {					tabitem = newitable(curtab);					al = curtab->align.halign;					switch(al) {					case ALleft:					case ALright:						additem(ps, newifloat(tabitem, al), tok);						break;					default:						if(al == ALcenter)							pushjust(ps, ALcenter);						addbrk(ps, 0, 0);						if(ps->inpar) {							popjust(ps);							ps->inpar = 0;						}						additem(ps, tabitem, curtab->tabletok);						if(al == ALcenter)							popjust(ps);						break;					}				}				if(is->tabstk == nil) {					if(warn)						fprint(2, "warning: table stack is wrong\n");				}				else					is->tabstk = is->tabstk->next;				curtab->next = di->tables;				di->tables = curtab;				curtab = is->tabstk;				if(!isempty)					addbrk(ps, 0, 0);				break;			// <!ELEMENT (TH|TD) - O %body.content>			// Cells for a row are accumulated in reverse order.			// We push ps on a stack, and use a new one to accumulate			// the contents of the cell.			case Ttd:			case Tth:				if(curtab == nil) {					if(warn)						fprint(2, "%T outside <TABLE>\n", tok);					continue;				}				if(ps->inpar) {					popjust(ps);					ps->inpar = 0;				}				ps = finishcell(curtab, ps);				tr = nil;				if(curtab->rows != nil)					tr = curtab->rows;				if(tr == nil || !tr->flags) {					if(warn)						fprint(2, "%T outside row\n", tok);					tr = newtablerow(makealign(ALnone, ALnone),							makebackground(nil, curtab->background.color),							TFparsing,							curtab->rows);					curtab->rows = tr;				}				ps = cell_pstate(ps, tag == Tth);				flags = TFparsing;				if(aflagval(tok, Anowrap)) {					flags |= TFnowrap;					ps->curstate &= ~IFwrap;				}				if(tag == Tth)					flags |= TFisth;				c = newtablecell(curtab->cells==nil? 1 : curtab->cells->cellid+1,						auintval(tok, Arowspan, 1),						auintval(tok, Acolspan, 1), 						aalign(tok), 						adimen(tok, Awidth),						auintval(tok, Aheight, 0),						makebackground(nil, acolorval(tok, Abgcolor, tr->background.color)),						flags,						curtab->cells);				curtab->cells = c;				ps->curbg = c->background;				if(c->align.halign == ALnone) {

⌨️ 快捷键说明

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