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 + -
显示快捷键?