描画の流れとデータ構造
file.c から html 構築を分離
file.c => 2800
html parse & 2d layout => 4300
くらいに分かれた。 4300 の方を見る。
Buffer に 行を格納する
第一段階の処理。 URL から http request 、content を parse して 二次元レイアウトして格納する。
loadGeneralFile が起点となる。
Buffer *loadGeneralFile(char *path, Url *current, char *referer, int flag,
FormList *request);
この関数は多機能で url からのコンテンツの入手、 入手したコンテンツを html parse しての TERM 表現(Buffer)の生成 までを全部やってしまう。
前半のコンテンツの入手は http やそれ以外の分岐、 http だった場合は proxy の解決、socket の接続、 redirect の解決, cookie の解決、 login などの authentication の解決がる。 この関数内を goto でぐるぐる回る場合がある。
無事 http などが解決されて中身が手に入った場合は、content-type などから html であることを決定して html のパースが走る。 次の loadHTMLBuffer です。
parse
loadHTMLBuffer が起点となる。
Buffer *loadHTMLBuffer(URLFile *f, Buffer *newBuf);
utf-8 のマルチバイト処理必要
file.c HTMLlineproc2body html parser の文字送り
else if (*str != '<' && *str != '&') {
#ifdef USE_M17N
int len = get_mclen(str);
#endif
PPUSH(mode | effect | ex_efct(ex_effect), *(str++));
#ifdef USE_M17N
if (--len) {
mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
while (len--) {
PSIZE;
PPUSH(mode | effect | ex_efct(ex_effect), *(str++));
}
}
#endif
Line
行に文字列をつめこむ。 先頭から積算することで、カラム位置を計算する。
#define addnewline(a, b, c, d, e, f, g) _addnewline(a, b, c, e, f, g)
void addnewline(Buffer *buf, char *line, Lineprop *prop, Linecolor *color,
int pos, int width, int nlines);