1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-11-04 08:17:17 -05:00

The massive attack: the only property of options used by get_attr_val was

cp (codepage). To fix bug 784 html_context->part->document->cp should
be passed to get_attr_val instead of html_context->options->cp.
This commit is contained in:
Witold Filipczyk 2006-08-05 18:06:28 +02:00 committed by Witold Filipczyk
parent 40e257bedd
commit 049d088e8a
9 changed files with 144 additions and 143 deletions

View File

@ -186,7 +186,7 @@ examine_element(struct html_context *html_context, struct css_selector *base,
process_found_selector(selector, CST_PSEUDO, base); process_found_selector(selector, CST_PSEUDO, base);
} }
code = get_attr_val(element->options, "class", html_context->options); code = get_attr_val(element->options, "class", html_context->options->cp);
if (code && seltype <= CST_CLASS) { if (code && seltype <= CST_CLASS) {
unsigned char *class = code; unsigned char *class = code;
@ -203,7 +203,7 @@ examine_element(struct html_context *html_context, struct css_selector *base,
} }
mem_free_if(code); mem_free_if(code);
code = get_attr_val(element->options, "id", html_context->options); code = get_attr_val(element->options, "id", html_context->options->cp);
if (code && seltype <= CST_ID) { if (code && seltype <= CST_ID) {
selector = find_css_selector(selectors, CST_ID, rel, code, -1); selector = find_css_selector(selectors, CST_ID, rel, code, -1);
process_found_selector(selector, CST_ID, base); process_found_selector(selector, CST_ID, base);
@ -240,7 +240,7 @@ get_css_selector_for_element(struct html_context *html_context,
DBG("Element %.*s applied.", element->namelen, element->name); DBG("Element %.*s applied.", element->namelen, element->name);
#endif #endif
code = get_attr_val(element->options, "style", html_context->options); code = get_attr_val(element->options, "style", html_context->options->cp);
if (code) { if (code) {
struct css_selector *stylesel; struct css_selector *stylesel;
struct scanner scanner; struct scanner scanner;

View File

@ -57,7 +57,7 @@ get_color(struct html_context *html_context, unsigned char *a,
if (!use_document_fg_colors(html_context->options)) if (!use_document_fg_colors(html_context->options))
return -1; return -1;
at = get_attr_val(a, c, html_context->options); at = get_attr_val(a, c, html_context->options->cp);
if (!at) return -1; if (!at) return -1;
r = decode_color(at, strlen(at), rgb); r = decode_color(at, strlen(at), rgb);
@ -78,7 +78,7 @@ get_bgcolor(struct html_context *html_context, unsigned char *a, color_T *rgb)
unsigned char * unsigned char *
get_target(struct document_options *options, unsigned char *a) get_target(struct document_options *options, unsigned char *a)
{ {
unsigned char *v = get_attr_val(a, "target", options); unsigned char *v = get_attr_val(a, "target", options->cp);
if (!v) return NULL; if (!v) return NULL;
@ -154,7 +154,7 @@ set_fragment_identifier(struct html_context *html_context,
{ {
unsigned char *id_attr; unsigned char *id_attr;
id_attr = get_attr_val(attr_name, attr, html_context->options); id_attr = get_attr_val(attr_name, attr, html_context->options->cp);
if (id_attr) { if (id_attr) {
html_context->special_f(html_context, SP_TAG, id_attr); html_context->special_f(html_context, SP_TAG, id_attr);
@ -226,6 +226,7 @@ html_focusable(struct html_context *html_context, unsigned char *a)
{ {
struct document_options *options; struct document_options *options;
unsigned char *accesskey; unsigned char *accesskey;
int cp;
int tabindex; int tabindex;
format.accesskey = 0; format.accesskey = 0;
@ -234,25 +235,26 @@ html_focusable(struct html_context *html_context, unsigned char *a)
if (!a) return; if (!a) return;
options = html_context->options; options = html_context->options;
cp = options->cp;
accesskey = get_attr_val(a, "accesskey", options); accesskey = get_attr_val(a, "accesskey", cp);
if (accesskey) { if (accesskey) {
format.accesskey = accesskey_string_to_unicode(accesskey); format.accesskey = accesskey_string_to_unicode(accesskey);
mem_free(accesskey); mem_free(accesskey);
} }
tabindex = get_num(a, "tabindex", options); tabindex = get_num(a, "tabindex", options->cp);
if (0 < tabindex && tabindex < 32767) { if (0 < tabindex && tabindex < 32767) {
format.tabindex = (tabindex & 0x7fff) << 16; format.tabindex = (tabindex & 0x7fff) << 16;
} }
mem_free_set(&format.onclick, get_attr_val(a, "onclick", options)); mem_free_set(&format.onclick, get_attr_val(a, "onclick", cp));
mem_free_set(&format.ondblclick, get_attr_val(a, "ondblclick", options)); mem_free_set(&format.ondblclick, get_attr_val(a, "ondblclick", cp));
mem_free_set(&format.onmouseover, get_attr_val(a, "onmouseover", options)); mem_free_set(&format.onmouseover, get_attr_val(a, "onmouseover", cp));
mem_free_set(&format.onhover, get_attr_val(a, "onhover", options)); mem_free_set(&format.onhover, get_attr_val(a, "onhover", cp));
mem_free_set(&format.onfocus, get_attr_val(a, "onfocus", options)); mem_free_set(&format.onfocus, get_attr_val(a, "onfocus", cp));
mem_free_set(&format.onmouseout, get_attr_val(a, "onmouseout", options)); mem_free_set(&format.onmouseout, get_attr_val(a, "onmouseout", cp));
mem_free_set(&format.onblur, get_attr_val(a, "onblur", options)); mem_free_set(&format.onblur, get_attr_val(a, "onblur", cp));
} }
void void
@ -448,7 +450,7 @@ look_for_map(unsigned char **pos, unsigned char *eof, struct uri *uri,
if (strlcasecmp(name, namelen, "MAP", 3)) return 1; if (strlcasecmp(name, namelen, "MAP", 3)) return 1;
if (uri && uri->fragment) { if (uri && uri->fragment) {
al = get_attr_val(attr, "name", options); al = get_attr_val(attr, "name", options->cp);
if (!al) return 1; if (!al) return 1;
if (strlcasecmp(al, -1, uri->fragment, uri->fragmentlen)) { if (strlcasecmp(al, -1, uri->fragment, uri->fragmentlen)) {
@ -546,7 +548,7 @@ look_for_link(unsigned char **pos, unsigned char *eof, struct menu_item **menu,
if (*pos >= eof) return 0; if (*pos >= eof) return 0;
} else if (!strlcasecmp(name, namelen, "AREA", 4)) { } else if (!strlcasecmp(name, namelen, "AREA", 4)) {
unsigned char *alt = get_attr_val(attr, "alt", options); unsigned char *alt = get_attr_val(attr, "alt", options->cp);
if (alt) { if (alt) {
label = convert_string(ct, alt, strlen(alt), label = convert_string(ct, alt, strlen(alt),
@ -580,7 +582,7 @@ look_for_link(unsigned char **pos, unsigned char *eof, struct menu_item **menu,
return 1; return 1;
} }
href = get_url_val(attr, "href", options); href = get_url_val(attr, "href", options->cp);
if (!href) { if (!href) {
mem_free_if(label); mem_free_if(label);
mem_free(target); mem_free(target);

View File

@ -50,13 +50,13 @@ html_form(struct html_context *html_context, unsigned char *a,
form->method = FORM_METHOD_GET; form->method = FORM_METHOD_GET;
form->form_num = a - html_context->startf; form->form_num = a - html_context->startf;
al = get_attr_val(a, "method", html_context->options); al = get_attr_val(a, "method", html_context->options->cp);
if (al) { if (al) {
if (!strcasecmp(al, "post")) { if (!strcasecmp(al, "post")) {
unsigned char *enctype; unsigned char *enctype;
enctype = get_attr_val(a, "enctype", enctype = get_attr_val(a, "enctype",
html_context->options); html_context->options->cp);
form->method = FORM_METHOD_POST; form->method = FORM_METHOD_POST;
if (enctype) { if (enctype) {
@ -69,11 +69,11 @@ html_form(struct html_context *html_context, unsigned char *a,
} }
mem_free(al); mem_free(al);
} }
form->onsubmit = get_attr_val(a, "onsubmit", html_context->options); form->onsubmit = get_attr_val(a, "onsubmit", html_context->options->cp);
al = get_attr_val(a, "name", html_context->options); al = get_attr_val(a, "name", html_context->options->cp);
if (al) form->name = al; if (al) form->name = al;
al = get_attr_val(a, "action", html_context->options); al = get_attr_val(a, "action", html_context->options->cp);
/* The HTML specification at /* The HTML specification at
* http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.3 states * http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.3 states
* that the behavior of an empty action attribute should be undefined. * that the behavior of an empty action attribute should be undefined.
@ -114,10 +114,10 @@ html_form(struct html_context *html_context, unsigned char *a,
static int static int
get_form_mode(struct html_context *html_context, unsigned char *attr) get_form_mode(struct html_context *html_context, unsigned char *attr)
{ {
if (has_attr(attr, "disabled", html_context->options)) if (has_attr(attr, "disabled", html_context->options->cp))
return FORM_MODE_DISABLED; return FORM_MODE_DISABLED;
if (has_attr(attr, "readonly", html_context->options)) if (has_attr(attr, "readonly", html_context->options->cp))
return FORM_MODE_READONLY; return FORM_MODE_READONLY;
return FORM_MODE_NORMAL; return FORM_MODE_NORMAL;
@ -149,7 +149,7 @@ html_button(struct html_context *html_context, unsigned char *a,
html_focusable(html_context, a); html_focusable(html_context, a);
al = get_attr_val(a, "type", html_context->options); al = get_attr_val(a, "type", html_context->options->cp);
if (!al) goto no_type_attr; if (!al) goto no_type_attr;
if (!strcasecmp(al, "button")) { if (!strcasecmp(al, "button")) {
@ -167,9 +167,9 @@ no_type_attr:
fc = init_form_control(type, a, html_context); fc = init_form_control(type, a, html_context);
if (!fc) return; if (!fc) return;
fc->id = get_attr_val(a, "id", html_context->options); fc->id = get_attr_val(a, "id", html_context->options->cp);
fc->name = get_attr_val(a, "name", html_context->options); fc->name = get_attr_val(a, "name", html_context->options->cp);
fc->default_value = get_attr_val(a, "value", html_context->options); fc->default_value = get_attr_val(a, "value", html_context->options->cp);
if (!fc->default_value) { if (!fc->default_value) {
if (fc->type == FC_SUBMIT) if (fc->type == FC_SUBMIT)
fc->default_value = stracpy("Submit"); fc->default_value = stracpy("Submit");
@ -195,7 +195,7 @@ html_input_format(struct html_context *html_context, unsigned char *a,
html_focusable(html_context, a); html_focusable(html_context, a);
format.form = fc; format.form = fc;
if (format.title) mem_free(format.title); if (format.title) mem_free(format.title);
format.title = get_attr_val(a, "title", html_context->options); format.title = get_attr_val(a, "title", html_context->options->cp);
switch (fc->type) { switch (fc->type) {
case FC_TEXT: case FC_TEXT:
case FC_PASSWORD: case FC_PASSWORD:
@ -221,10 +221,10 @@ html_input_format(struct html_context *html_context, unsigned char *a,
unsigned char *al; unsigned char *al;
mem_free_set(&format.image, NULL); mem_free_set(&format.image, NULL);
al = get_url_val(a, "src", html_context->options); al = get_url_val(a, "src", html_context->options->cp);
if (!al) if (!al)
al = get_url_val(a, "dynsrc", al = get_url_val(a, "dynsrc",
html_context->options); html_context->options->cp);
if (al) { if (al) {
format.image = join_urls(html_context->base_href, al); format.image = join_urls(html_context->base_href, al);
mem_free(al); mem_free(al);
@ -269,7 +269,7 @@ html_input(struct html_context *html_context, unsigned char *a,
fc = init_form_control(FC_TEXT, a, html_context); fc = init_form_control(FC_TEXT, a, html_context);
if (!fc) return; if (!fc) return;
al = get_attr_val(a, "type", html_context->options); al = get_attr_val(a, "type", html_context->options->cp);
if (al) { if (al) {
if (!strcasecmp(al, "text")) fc->type = FC_TEXT; if (!strcasecmp(al, "text")) fc->type = FC_TEXT;
else if (!strcasecmp(al, "hidden")) fc->type = FC_HIDDEN; else if (!strcasecmp(al, "hidden")) fc->type = FC_HIDDEN;
@ -287,7 +287,7 @@ html_input(struct html_context *html_context, unsigned char *a,
if (fc->type != FC_FILE) if (fc->type != FC_FILE)
fc->default_value = get_attr_val(a, "value", fc->default_value = get_attr_val(a, "value",
html_context->options); html_context->options->cp);
if (!fc->default_value) { if (!fc->default_value) {
if (fc->type == FC_CHECKBOX) if (fc->type == FC_CHECKBOX)
fc->default_value = stracpy("on"); fc->default_value = stracpy("on");
@ -301,22 +301,22 @@ html_input(struct html_context *html_context, unsigned char *a,
if (!fc->default_value) if (!fc->default_value)
fc->default_value = stracpy(""); fc->default_value = stracpy("");
fc->id = get_attr_val(a, "id", html_context->options); fc->id = get_attr_val(a, "id", html_context->options->cp);
fc->name = get_attr_val(a, "name", html_context->options); fc->name = get_attr_val(a, "name", html_context->options->cp);
fc->size = get_num(a, "size", html_context->options); fc->size = get_num(a, "size", html_context->options->cp);
if (fc->size == -1) if (fc->size == -1)
fc->size = html_context->options->default_form_input_size; fc->size = html_context->options->default_form_input_size;
fc->size++; fc->size++;
if (fc->size > html_context->options->box.width) if (fc->size > html_context->options->box.width)
fc->size = html_context->options->box.width; fc->size = html_context->options->box.width;
fc->maxlength = get_num(a, "maxlength", html_context->options); fc->maxlength = get_num(a, "maxlength", html_context->options->cp);
if (fc->maxlength == -1) fc->maxlength = INT_MAX; if (fc->maxlength == -1) fc->maxlength = INT_MAX;
if (fc->type == FC_CHECKBOX || fc->type == FC_RADIO) if (fc->type == FC_CHECKBOX || fc->type == FC_RADIO)
fc->default_state = has_attr(a, "checked", fc->default_state = has_attr(a, "checked",
html_context->options); html_context->options->cp);
if (fc->type == FC_IMAGE) if (fc->type == FC_IMAGE)
fc->alt = get_attr_val(a, "alt", html_context->options); fc->alt = get_attr_val(a, "alt", html_context->options->cp);
if (fc->type != FC_HIDDEN) { if (fc->type != FC_HIDDEN) {
html_input_format(html_context, a, fc); html_input_format(html_context, a, fc);
@ -419,18 +419,18 @@ abort:
if (!closing_tag) { if (!closing_tag) {
unsigned char *value, *label; unsigned char *value, *label;
if (has_attr(t_attr, "disabled", html_context->options)) if (has_attr(t_attr, "disabled", html_context->options->cp))
goto see; goto see;
if (preselect == -1 if (preselect == -1
&& has_attr(t_attr, "selected", html_context->options)) && has_attr(t_attr, "selected", html_context->options->cp))
preselect = order; preselect = order;
value = get_attr_val(t_attr, "value", html_context->options); value = get_attr_val(t_attr, "value", html_context->options->cp);
if (!mem_align_alloc(&values, order, order + 1, 0xFF)) if (!mem_align_alloc(&values, order, order + 1, 0xFF))
goto abort; goto abort;
values[order++] = value; values[order++] = value;
label = get_attr_val(t_attr, "label", html_context->options); label = get_attr_val(t_attr, "label", html_context->options->cp);
if (label) new_menu_item(&lnk_menu, label, order - 1, 0); if (label) new_menu_item(&lnk_menu, label, order - 1, 0);
if (!value || !label) { if (!value || !label) {
init_string(&lbl); init_string(&lbl);
@ -450,7 +450,7 @@ abort:
if (!closing_tag) { if (!closing_tag) {
unsigned char *label; unsigned char *label;
label = get_attr_val(t_attr, "label", html_context->options); label = get_attr_val(t_attr, "label", html_context->options->cp);
if (!label) { if (!label) {
label = stracpy(""); label = stracpy("");
@ -477,8 +477,8 @@ end_parse:
goto abort; goto abort;
} }
fc->id = get_attr_val(attr, "id", html_context->options); fc->id = get_attr_val(attr, "id", html_context->options->cp);
fc->name = get_attr_val(attr, "name", html_context->options); fc->name = get_attr_val(attr, "name", html_context->options->cp);
fc->default_state = preselect < 0 ? 0 : preselect; fc->default_state = preselect < 0 ? 0 : preselect;
fc->default_value = order ? stracpy(values[fc->default_state]) : stracpy(""); fc->default_value = order ? stracpy(values[fc->default_state]) : stracpy("");
fc->nvalues = order; fc->nvalues = order;
@ -518,13 +518,13 @@ do_html_select_multiple(struct html_context *html_context, unsigned char *a,
unsigned char *html, unsigned char *eof, unsigned char *html, unsigned char *eof,
unsigned char **end) unsigned char **end)
{ {
unsigned char *al = get_attr_val(a, "name", html_context->options); unsigned char *al = get_attr_val(a, "name", html_context->options->cp);
if (!al) return; if (!al) return;
html_focusable(html_context, a); html_focusable(html_context, a);
html_top->type = ELEMENT_DONT_KILL; html_top->type = ELEMENT_DONT_KILL;
mem_free_set(&format.select, al); mem_free_set(&format.select, al);
format.select_disabled = has_attr(a, "disabled", html_context->options) format.select_disabled = has_attr(a, "disabled", html_context->options->cp)
? FORM_MODE_DISABLED ? FORM_MODE_DISABLED
: FORM_MODE_NORMAL; : FORM_MODE_NORMAL;
} }
@ -533,7 +533,7 @@ void
html_select(struct html_context *html_context, unsigned char *a, html_select(struct html_context *html_context, unsigned char *a,
unsigned char *html, unsigned char *eof, unsigned char **end) unsigned char *html, unsigned char *eof, unsigned char **end)
{ {
if (has_attr(a, "multiple", html_context->options)) if (has_attr(a, "multiple", html_context->options->cp))
do_html_select_multiple(html_context, a, html, eof, end); do_html_select_multiple(html_context, a, html, eof, end);
else else
do_html_select(a, html, eof, end, html_context); do_html_select(a, html, eof, end, html_context);
@ -549,7 +549,7 @@ html_option(struct html_context *html_context, unsigned char *a,
if (!format.select) return; if (!format.select) return;
val = get_attr_val(a, "value", html_context->options); val = get_attr_val(a, "value", html_context->options->cp);
if (!val) { if (!val) {
struct string str; struct string str;
unsigned char *p, *r; unsigned char *p, *r;
@ -600,11 +600,11 @@ end_parse:
return; return;
} }
fc->id = get_attr_val(a, "id", html_context->options); fc->id = get_attr_val(a, "id", html_context->options->cp);
fc->name = null_or_stracpy(format.select); fc->name = null_or_stracpy(format.select);
fc->default_value = val; fc->default_value = val;
fc->default_state = has_attr(a, "selected", html_context->options); fc->default_state = has_attr(a, "selected", html_context->options->cp);
fc->mode = has_attr(a, "disabled", html_context->options) fc->mode = has_attr(a, "disabled", html_context->options->cp)
? FORM_MODE_DISABLED ? FORM_MODE_DISABLED
: format.select_disabled; : format.select_disabled;
@ -646,8 +646,8 @@ pp:
fc = init_form_control(FC_TEXTAREA, attr, html_context); fc = init_form_control(FC_TEXTAREA, attr, html_context);
if (!fc) return; if (!fc) return;
fc->id = get_attr_val(attr, "id", html_context->options); fc->id = get_attr_val(attr, "id", html_context->options->cp);
fc->name = get_attr_val(attr, "name", html_context->options); fc->name = get_attr_val(attr, "name", html_context->options->cp);
fc->default_value = memacpy(html, p - html); fc->default_value = memacpy(html, p - html);
for (p = fc->default_value; p && p[0]; p++) { for (p = fc->default_value; p && p[0]; p++) {
/* FIXME: We don't cope well with entities here. Bugzilla uses /* FIXME: We don't cope well with entities here. Bugzilla uses
@ -664,7 +664,7 @@ pp:
} }
} }
cols = get_num(attr, "cols", html_context->options); cols = get_num(attr, "cols", html_context->options->cp);
if (cols <= 0) if (cols <= 0)
cols = html_context->options->default_form_input_size; cols = html_context->options->default_form_input_size;
cols++; /* Add 1 column, other browsers may have different cols++; /* Add 1 column, other browsers may have different
@ -673,14 +673,14 @@ pp:
cols = html_context->options->box.width; cols = html_context->options->box.width;
fc->cols = cols; fc->cols = cols;
rows = get_num(attr, "rows", html_context->options); rows = get_num(attr, "rows", html_context->options->cp);
if (rows <= 0) rows = 1; if (rows <= 0) rows = 1;
if (rows > html_context->options->box.height) if (rows > html_context->options->box.height)
rows = html_context->options->box.height; rows = html_context->options->box.height;
fc->rows = rows; fc->rows = rows;
html_context->options->needs_height = 1; html_context->options->needs_height = 1;
wrap_attr = get_attr_val(attr, "wrap", html_context->options); wrap_attr = get_attr_val(attr, "wrap", html_context->options->cp);
if (wrap_attr) { if (wrap_attr) {
if (!strcasecmp(wrap_attr, "hard") if (!strcasecmp(wrap_attr, "hard")
|| !strcasecmp(wrap_attr, "physical")) { || !strcasecmp(wrap_attr, "physical")) {
@ -694,14 +694,14 @@ pp:
} }
mem_free(wrap_attr); mem_free(wrap_attr);
} else if (has_attr(attr, "nowrap", html_context->options)) { } else if (has_attr(attr, "nowrap", html_context->options->cp)) {
fc->wrap = FORM_WRAP_NONE; fc->wrap = FORM_WRAP_NONE;
} else { } else {
fc->wrap = FORM_WRAP_SOFT; fc->wrap = FORM_WRAP_SOFT;
} }
fc->maxlength = get_num(attr, "maxlength", html_context->options); fc->maxlength = get_num(attr, "maxlength", html_context->options->cp);
if (fc->maxlength == -1) fc->maxlength = INT_MAX; if (fc->maxlength == -1) fc->maxlength = INT_MAX;
if (rows > 1) ln_break(html_context, 1); if (rows > 1) ln_break(html_context, 1);

View File

@ -123,7 +123,7 @@ void
html_font(struct html_context *html_context, unsigned char *a, html_font(struct html_context *html_context, unsigned char *a,
unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
{ {
unsigned char *al = get_attr_val(a, "size", html_context->options); unsigned char *al = get_attr_val(a, "size", html_context->options->cp);
if (al) { if (al) {
int p = 0; int p = 0;
@ -210,7 +210,7 @@ html_script(struct html_context *html_context, unsigned char *a,
/* Ref: /* Ref:
* http://www.ietf.org/internet-drafts/draft-hoehrmann-script-types-03.txt * http://www.ietf.org/internet-drafts/draft-hoehrmann-script-types-03.txt
*/ */
type = get_attr_val(a, "type", html_context->options); type = get_attr_val(a, "type", html_context->options->cp);
if (type) { if (type) {
unsigned char *pos = type; unsigned char *pos = type;
@ -252,7 +252,7 @@ not_processed:
* language attribute can be JavaScript with optional version digits * language attribute can be JavaScript with optional version digits
* postfixed (like: ``JavaScript1.1''). * postfixed (like: ``JavaScript1.1'').
* That attribute is deprecated in favor of type by HTML 4.01 */ * That attribute is deprecated in favor of type by HTML 4.01 */
language = get_attr_val(a, "language", html_context->options); language = get_attr_val(a, "language", html_context->options->cp);
if (language) { if (language) {
int languagelen = strlen(language); int languagelen = strlen(language);
@ -267,7 +267,7 @@ not_processed:
} }
if (html_context->part->document if (html_context->part->document
&& (src = get_attr_val(a, "src", html_context->options))) { && (src = get_attr_val(a, "src", html_context->options->cp))) {
/* External reference. */ /* External reference. */
unsigned char *import_url; unsigned char *import_url;
@ -466,7 +466,7 @@ void
html_linebrk(struct html_context *html_context, unsigned char *a, html_linebrk(struct html_context *html_context, unsigned char *a,
unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
{ {
unsigned char *al = get_attr_val(a, "align", html_context->options); unsigned char *al = get_attr_val(a, "align", html_context->options->cp);
if (al) { if (al) {
if (!strcasecmp(al, "left")) par_format.align = ALIGN_LEFT; if (!strcasecmp(al, "left")) par_format.align = ALIGN_LEFT;
@ -619,7 +619,7 @@ html_hr(struct html_context *html_context, unsigned char *a,
{ {
int i/* = par_format.width - 10*/; int i/* = par_format.width - 10*/;
unsigned char r = (unsigned char) BORDER_DHLINE; unsigned char r = (unsigned char) BORDER_DHLINE;
int q = get_num(a, "size", html_context->options); int q = get_num(a, "size", html_context->options->cp);
if (q >= 0 && q < 2) r = (unsigned char) BORDER_SHLINE; if (q >= 0 && q < 2) r = (unsigned char) BORDER_SHLINE;
html_stack_dup(html_context, ELEMENT_KILLABLE); html_stack_dup(html_context, ELEMENT_KILLABLE);
@ -701,7 +701,7 @@ html_base(struct html_context *html_context, unsigned char *a,
{ {
unsigned char *al; unsigned char *al;
al = get_url_val(a, "href", html_context->options); al = get_url_val(a, "href", html_context->options->cp);
if (al) { if (al) {
unsigned char *base = join_urls(html_context->base_href, al); unsigned char *base = join_urls(html_context->base_href, al);
struct uri *uri = base ? get_uri(base, 0) : NULL; struct uri *uri = base ? get_uri(base, 0) : NULL;
@ -730,7 +730,7 @@ html_ul(struct html_context *html_context, unsigned char *a,
par_format.list_number = 0; par_format.list_number = 0;
par_format.flags = P_STAR; par_format.flags = P_STAR;
al = get_attr_val(a, "type", html_context->options); al = get_attr_val(a, "type", html_context->options->cp);
if (al) { if (al) {
if (!strcasecmp(al, "disc") || !strcasecmp(al, "circle")) if (!strcasecmp(al, "disc") || !strcasecmp(al, "circle"))
par_format.flags = P_O; par_format.flags = P_O;
@ -754,12 +754,12 @@ html_ol(struct html_context *html_context, unsigned char *a,
int st; int st;
par_format.list_level++; par_format.list_level++;
st = get_num(a, "start", html_context->options); st = get_num(a, "start", html_context->options->cp);
if (st == -1) st = 1; if (st == -1) st = 1;
par_format.list_number = st; par_format.list_number = st;
par_format.flags = P_NUMBER; par_format.flags = P_NUMBER;
al = get_attr_val(a, "type", html_context->options); al = get_attr_val(a, "type", html_context->options->cp);
if (al) { if (al) {
if (*al && !al[1]) { if (*al && !al[1]) {
if (*al == '1') par_format.flags = P_NUMBER; if (*al == '1') par_format.flags = P_NUMBER;
@ -862,7 +862,7 @@ html_li(struct html_context *html_context, unsigned char *a,
unsigned char n[32]; unsigned char n[32];
int nlen; int nlen;
int t = par_format.flags & P_LISTMASK; int t = par_format.flags & P_LISTMASK;
int s = get_num(a, "value", html_context->options); int s = get_num(a, "value", html_context->options->cp);
if (s != -1) par_format.list_number = s; if (s != -1) par_format.list_number = s;
@ -919,7 +919,7 @@ html_dl(struct html_context *html_context, unsigned char *a,
unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
{ {
par_format.flags &= ~P_COMPACT; par_format.flags &= ~P_COMPACT;
if (has_attr(a, "compact", html_context->options)) if (has_attr(a, "compact", html_context->options->cp))
par_format.flags |= P_COMPACT; par_format.flags |= P_COMPACT;
if (par_format.list_level) par_format.leftmargin += 5; if (par_format.list_level) par_format.leftmargin += 5;
par_format.list_level++; par_format.list_level++;
@ -941,7 +941,7 @@ html_dt(struct html_context *html_context, unsigned char *a,
par_format.align = ALIGN_LEFT; par_format.align = ALIGN_LEFT;
par_format.leftmargin = par_format.dd_margin; par_format.leftmargin = par_format.dd_margin;
if (!(par_format.flags & P_COMPACT) if (!(par_format.flags & P_COMPACT)
&& !has_attr(a, "compact", html_context->options)) && !has_attr(a, "compact", html_context->options->cp))
ln_break(html_context, 2); ln_break(html_context, 2);
} }
@ -982,7 +982,7 @@ html_frame(struct html_context *html_context, unsigned char *a,
{ {
unsigned char *name, *src, *url; unsigned char *name, *src, *url;
src = get_url_val(a, "src", html_context->options); src = get_url_val(a, "src", html_context->options->cp);
if (!src) { if (!src) {
url = stracpy("about:blank"); url = stracpy("about:blank");
} else { } else {
@ -991,7 +991,7 @@ html_frame(struct html_context *html_context, unsigned char *a,
} }
if (!url) return; if (!url) return;
name = get_attr_val(a, "name", html_context->options); name = get_attr_val(a, "name", html_context->options->cp);
if (!name) { if (!name) {
name = stracpy(url); name = stracpy(url);
} else if (!name[0]) { } else if (!name[0]) {
@ -1035,13 +1035,13 @@ html_frameset(struct html_context *html_context, unsigned char *a,
|| !html_context->special_f(html_context, SP_USED, NULL)) || !html_context->special_f(html_context, SP_USED, NULL))
return; return;
cols = get_attr_val(a, "cols", html_context->options); cols = get_attr_val(a, "cols", html_context->options->cp);
if (!cols) { if (!cols) {
cols = stracpy("100%"); cols = stracpy("100%");
if (!cols) return; if (!cols) return;
} }
rows = get_attr_val(a, "rows", html_context->options); rows = get_attr_val(a, "rows", html_context->options->cp);
if (!rows) { if (!rows) {
rows = stracpy("100%"); rows = stracpy("100%");
if (!rows) { if (!rows) {

View File

@ -45,7 +45,7 @@ html_a(struct html_context *html_context, unsigned char *a,
{ {
unsigned char *href; unsigned char *href;
href = get_url_val(a, "href", html_context->options); href = get_url_val(a, "href", html_context->options->cp);
if (href) { if (href) {
unsigned char *target; unsigned char *target;
@ -84,7 +84,7 @@ html_a(struct html_context *html_context, unsigned char *a,
} }
mem_free_set(&format.title, mem_free_set(&format.title,
get_attr_val(a, "title", html_context->options)); get_attr_val(a, "title", html_context->options->cp));
html_focusable(html_context, a); html_focusable(html_context, a);
@ -222,7 +222,7 @@ html_img_do(unsigned char *a, unsigned char *object_src,
* 2 means display alt/title attribute if possible, IMG if not * 2 means display alt/title attribute if possible, IMG if not
* 3 means display alt/title attribute if possible, filename if not */ * 3 means display alt/title attribute if possible, filename if not */
usemap_attr = get_attr_val(a, "usemap", options); usemap_attr = get_attr_val(a, "usemap", options->cp);
if (usemap_attr) { if (usemap_attr) {
unsigned char *joined_urls = join_urls(html_context->base_href, unsigned char *joined_urls = join_urls(html_context->base_href,
usemap_attr); usemap_attr);
@ -242,13 +242,13 @@ html_img_do(unsigned char *a, unsigned char *object_src,
} }
ismap = format.link ismap = format.link
&& has_attr(a, "ismap", options) && has_attr(a, "ismap", options->cp)
&& !usemap; && !usemap;
if (display_style == 2 || display_style == 3) { if (display_style == 2 || display_style == 3) {
label = get_attr_val(a, "alt", options); label = get_attr_val(a, "alt", options->cp);
if (!label) if (!label)
label = get_attr_val(a, "title", options); label = get_attr_val(a, "title", options->cp);
/* Little hack to preserve rendering of [ ], in directories listing, /* Little hack to preserve rendering of [ ], in directories listing,
* but we still want to drop extra spaces in alt or title attribute * but we still want to drop extra spaces in alt or title attribute
@ -257,8 +257,8 @@ html_img_do(unsigned char *a, unsigned char *object_src,
} }
src = null_or_stracpy(object_src); src = null_or_stracpy(object_src);
if (!src) src = get_url_val(a, "src", options); if (!src) src = get_url_val(a, "src", options->cp);
if (!src) src = get_url_val(a, "dynsrc", options); if (!src) src = get_url_val(a, "dynsrc", options->cp);
/* If we have no label yet (no title or alt), so /* If we have no label yet (no title or alt), so
* just use default ones, or image filename. */ * just use default ones, or image filename. */
@ -319,7 +319,7 @@ html_img_do(unsigned char *a, unsigned char *object_src,
format.image = join_urls(html_context->base_href, src); format.image = join_urls(html_context->base_href, src);
} }
format.title = get_attr_val(a, "title", options); format.title = get_attr_val(a, "title", options->cp);
if (ismap) { if (ismap) {
unsigned char *new_link; unsigned char *new_link;
@ -379,10 +379,10 @@ html_applet(struct html_context *html_context, unsigned char *a,
{ {
unsigned char *code, *alt; unsigned char *code, *alt;
code = get_url_val(a, "code", html_context->options); code = get_url_val(a, "code", html_context->options->cp);
if (!code) return; if (!code) return;
alt = get_attr_val(a, "alt", html_context->options); alt = get_attr_val(a, "alt", html_context->options->cp);
html_focusable(html_context, a); html_focusable(html_context, a);
@ -405,11 +405,11 @@ html_iframe_do(unsigned char *a, unsigned char *object_src,
unsigned char *name, *url = NULL; unsigned char *name, *url = NULL;
url = null_or_stracpy(object_src); url = null_or_stracpy(object_src);
if (!url) url = get_url_val(a, "src", html_context->options); if (!url) url = get_url_val(a, "src", html_context->options->cp);
if (!url) return; if (!url) return;
name = get_attr_val(a, "name", html_context->options); name = get_attr_val(a, "name", html_context->options->cp);
if (!name) name = get_attr_val(a, "id", html_context->options); if (!name) name = get_attr_val(a, "id", html_context->options->cp);
if (!name) name = stracpy(""); if (!name) name = stracpy("");
if (!name) { if (!name) {
mem_free(url); mem_free(url);
@ -447,11 +447,11 @@ html_object(struct html_context *html_context, unsigned char *a,
* this, which is anyway in the spirit of <object> element, unifying * this, which is anyway in the spirit of <object> element, unifying
* <img> and <iframe> etc. */ * <img> and <iframe> etc. */
url = get_url_val(a, "data", html_context->options); url = get_url_val(a, "data", html_context->options->cp);
if (!url) url = get_url_val(a, "codebase", html_context->options); if (!url) url = get_url_val(a, "codebase", html_context->options->cp);
if (!url) return; if (!url) return;
type = get_attr_val(a, "type", html_context->options); type = get_attr_val(a, "type", html_context->options->cp);
if (!type) { mem_free(url); return; } if (!type) { mem_free(url); return; }
if (!strncasecmp(type, "text/", 5)) { if (!strncasecmp(type, "text/", 5)) {
@ -466,7 +466,7 @@ html_object(struct html_context *html_context, unsigned char *a,
} else { } else {
unsigned char *name; unsigned char *name;
name = get_attr_val(a, "standby", html_context->options); name = get_attr_val(a, "standby", html_context->options->cp);
html_focusable(html_context, a); html_focusable(html_context, a);
@ -498,7 +498,7 @@ html_embed(struct html_context *html_context, unsigned char *a,
* this, which is anyway in the spirit of <object> element, unifying * this, which is anyway in the spirit of <object> element, unifying
* <img> and <iframe> etc. */ * <img> and <iframe> etc. */
object_src = get_url_val(a, "src", html_context->options); object_src = get_url_val(a, "src", html_context->options->cp);
if (!object_src || !*object_src) { if (!object_src || !*object_src) {
mem_free_set(&object_src, NULL); mem_free_set(&object_src, NULL);
return; return;
@ -727,20 +727,20 @@ html_link_parse(struct html_context *html_context, unsigned char *a,
assert(a && link); assert(a && link);
memset(link, 0, sizeof(*link)); memset(link, 0, sizeof(*link));
link->href = get_url_val(a, "href", html_context->options); link->href = get_url_val(a, "href", html_context->options->cp);
if (!link->href) return 0; if (!link->href) return 0;
link->lang = get_attr_val(a, "lang", html_context->options); link->lang = get_attr_val(a, "lang", html_context->options->cp);
link->hreflang = get_attr_val(a, "hreflang", html_context->options); link->hreflang = get_attr_val(a, "hreflang", html_context->options->cp);
link->title = get_attr_val(a, "title", html_context->options); link->title = get_attr_val(a, "title", html_context->options->cp);
link->content_type = get_attr_val(a, "type", html_context->options); link->content_type = get_attr_val(a, "type", html_context->options->cp);
link->media = get_attr_val(a, "media", html_context->options); link->media = get_attr_val(a, "media", html_context->options->cp);
link->name = get_attr_val(a, "rel", html_context->options); link->name = get_attr_val(a, "rel", html_context->options->cp);
if (link->name) { if (link->name) {
link->direction = LD_REL; link->direction = LD_REL;
} else { } else {
link->name = get_attr_val(a, "rev", html_context->options); link->name = get_attr_val(a, "rev", html_context->options->cp);
if (link->name) link->direction = LD_REV; if (link->name) link->direction = LD_REV;
} }

View File

@ -136,7 +136,7 @@ end:
unsigned char * unsigned char *
get_attr_value(register unsigned char *e, unsigned char *name, get_attr_value(register unsigned char *e, unsigned char *name,
struct document_options *options, enum html_attr_flags flags) int cp, enum html_attr_flags flags)
{ {
unsigned char *n; unsigned char *n;
unsigned char *name_start; unsigned char *name_start;
@ -206,9 +206,8 @@ found_endattr:
memchr(attr, '&', attrlen)) { memchr(attr, '&', attrlen)) {
unsigned char *saved_attr = attr; unsigned char *saved_attr = attr;
attr = convert_string(NULL, saved_attr, attrlen, attr = convert_string(NULL, saved_attr, attrlen, cp,
options->cp, CSM_QUERY, CSM_QUERY, NULL, NULL, NULL);
NULL, NULL, NULL);
mem_free(saved_attr); mem_free(saved_attr);
} }
@ -246,9 +245,9 @@ parse_error:
* It will return a positive integer value on success, * It will return a positive integer value on success,
* or -1 on error. */ * or -1 on error. */
int int
get_num(unsigned char *a, unsigned char *name, struct document_options *options) get_num(unsigned char *a, unsigned char *name, int cp)
{ {
unsigned char *al = get_attr_val(a, name, options); unsigned char *al = get_attr_val(a, name, cp);
int result = -1; int result = -1;
if (al) { if (al) {
@ -274,7 +273,7 @@ int
get_width(unsigned char *a, unsigned char *name, int limited, get_width(unsigned char *a, unsigned char *name, int limited,
struct html_context *html_context) struct html_context *html_context)
{ {
unsigned char *value = get_attr_val(a, name, html_context->options); unsigned char *value = get_attr_val(a, name, html_context->options->cp);
unsigned char *str = value; unsigned char *str = value;
unsigned char *end; unsigned char *end;
int percentage = 0; int percentage = 0;
@ -755,7 +754,7 @@ start_element(struct element_info *ei,
{ {
#define ELEMENT_RENDER_PROLOGUE \ #define ELEMENT_RENDER_PROLOGUE \
ln_break(html_context, ei->linebreak); \ ln_break(html_context, ei->linebreak); \
a = get_attr_val(attr, "id", html_context->options); \ a = get_attr_val(attr, "id", html_context->options->cp); \
if (a) { \ if (a) { \
html_context->special_f(html_context, SP_TAG, a); \ html_context->special_f(html_context, SP_TAG, a); \
mem_free(a); \ mem_free(a); \
@ -1039,20 +1038,20 @@ xsp:
} }
if (strlcasecmp(name, namelen, "META", 4)) goto se; if (strlcasecmp(name, namelen, "META", 4)) goto se;
he = get_attr_val(attr, "charset", options); he = get_attr_val(attr, "charset", options->cp);
if (he) { if (he) {
add_to_string(head, "Charset: "); add_to_string(head, "Charset: ");
add_to_string(head, he); add_to_string(head, he);
mem_free(he); mem_free(he);
} }
he = get_attr_val(attr, "http-equiv", options); he = get_attr_val(attr, "http-equiv", options->cp);
if (!he) goto se; if (!he) goto se;
add_to_string(head, he); add_to_string(head, he);
mem_free(he); mem_free(he);
c = get_attr_val(attr, "content", options); c = get_attr_val(attr, "content", options->cp);
if (c) { if (c) {
add_to_string(head, ": "); add_to_string(head, ": ");
add_to_string(head, c); add_to_string(head, c);

View File

@ -33,12 +33,12 @@ enum html_attr_flags {
* - name is searched attribute * - name is searched attribute
* *
* Returns allocated string containing the attribute, or NULL on unsuccess. */ * Returns allocated string containing the attribute, or NULL on unsuccess. */
unsigned char *get_attr_value(register unsigned char *e, unsigned char *name, struct document_options *options, enum html_attr_flags flags); unsigned char *get_attr_value(register unsigned char *e, unsigned char *name, int cp, enum html_attr_flags flags);
/* Wrappers for get_attr_value(). */ /* Wrappers for get_attr_value(). */
#define get_attr_val(e, name, options) get_attr_value(e, name, options, HTML_ATTR_NONE) #define get_attr_val(e, name, cp) get_attr_value(e, name, cp, HTML_ATTR_NONE)
#define get_url_val(e, name, options) get_attr_value(e, name, options, HTML_ATTR_EAT_NL) #define get_url_val(e, name, cp) get_attr_value(e, name, cp, HTML_ATTR_EAT_NL)
#define has_attr(e, name, options) (!!get_attr_value(e, name, options, HTML_ATTR_TEST)) #define has_attr(e, name, cp) (!!get_attr_value(e, name, cp, HTML_ATTR_TEST))
/* Interface for both the renderer and the table handling */ /* Interface for both the renderer and the table handling */
@ -55,7 +55,7 @@ typedef void (element_handler_T)(struct html_context *, unsigned char *attr,
int parse_element(unsigned char *, unsigned char *, unsigned char **, int *, unsigned char **, unsigned char **); int parse_element(unsigned char *, unsigned char *, unsigned char **, int *, unsigned char **, unsigned char **);
int get_num(unsigned char *, unsigned char *, struct document_options *); int get_num(unsigned char *, unsigned char *, int);
int get_width(unsigned char *, unsigned char *, int, struct html_context *); int get_width(unsigned char *, unsigned char *, int, struct html_context *);
unsigned char *skip_comment(unsigned char *, unsigned char *); unsigned char *skip_comment(unsigned char *, unsigned char *);

View File

@ -90,7 +90,7 @@ kill_html_stack_item(struct html_context *html_context, struct html_element *e)
* any element, executing it when that element is fully loaded. */ * any element, executing it when that element is fully loaded. */
if (e->options) if (e->options)
onload = get_attr_val(e->options, "onLoad", onload = get_attr_val(e->options, "onLoad",
html_context->options); html_context->options->cp);
if (html_context->part if (html_context->part
&& html_context->part->document && html_context->part->document
&& onload && *onload && *onload != '^') { && onload && *onload && *onload != '^') {

View File

@ -70,12 +70,12 @@ get_bordercolor(struct html_context *html_context, unsigned char *a, color_T *rg
if (!use_document_fg_colors(html_context->options)) if (!use_document_fg_colors(html_context->options))
return; return;
at = get_attr_val(a, "bordercolor", html_context->options); at = get_attr_val(a, "bordercolor", html_context->options->cp);
/* Try some other MSIE-specific attributes if any. */ /* Try some other MSIE-specific attributes if any. */
if (!at) if (!at)
at = get_attr_val(a, "bordercolorlight", html_context->options); at = get_attr_val(a, "bordercolorlight", html_context->options->cp);
if (!at) if (!at)
at = get_attr_val(a, "bordercolordark", html_context->options); at = get_attr_val(a, "bordercolordark", html_context->options->cp);
if (!at) return; if (!at) return;
decode_color(at, strlen(at), rgb); decode_color(at, strlen(at), rgb);
@ -85,7 +85,7 @@ get_bordercolor(struct html_context *html_context, unsigned char *a, color_T *rg
static void static void
get_align(struct html_context *html_context, unsigned char *attr, int *a) get_align(struct html_context *html_context, unsigned char *attr, int *a)
{ {
unsigned char *al = get_attr_val(attr, "align", html_context->options); unsigned char *al = get_attr_val(attr, "align", html_context->options->cp);
if (!al) return; if (!al) return;
@ -100,7 +100,7 @@ get_align(struct html_context *html_context, unsigned char *attr, int *a)
static void static void
get_valign(struct html_context *html_context, unsigned char *attr, int *a) get_valign(struct html_context *html_context, unsigned char *attr, int *a)
{ {
unsigned char *al = get_attr_val(attr, "valign", html_context->options); unsigned char *al = get_attr_val(attr, "valign", html_context->options->cp);
if (!al) return; if (!al) return;
@ -115,7 +115,7 @@ static void
get_column_width(unsigned char *attr, int *width, int sh, get_column_width(unsigned char *attr, int *width, int sh,
struct html_context *html_context) struct html_context *html_context)
{ {
unsigned char *al = get_attr_val(attr, "width", html_context->options); unsigned char *al = get_attr_val(attr, "width", html_context->options->cp);
int len; int len;
if (!al) return; if (!al) return;
@ -151,7 +151,7 @@ set_table_frame(struct html_context *html_context, struct table *table,
table->frame = TABLE_FRAME_BOX; table->frame = TABLE_FRAME_BOX;
al = get_attr_val(attr, "frame", html_context->options); al = get_attr_val(attr, "frame", html_context->options->cp);
if (!al) return; if (!al) return;
if (!strcasecmp(al, "void")) table->frame = TABLE_FRAME_VOID; if (!strcasecmp(al, "void")) table->frame = TABLE_FRAME_VOID;
@ -176,7 +176,7 @@ set_table_rules(struct html_context *html_context, struct table *table,
table->rules = table->border ? TABLE_RULE_ALL : TABLE_RULE_NONE; table->rules = table->border ? TABLE_RULE_ALL : TABLE_RULE_NONE;
al = get_attr_val(attr, "rules", html_context->options); al = get_attr_val(attr, "rules", html_context->options->cp);
if (!al) return; if (!al) return;
if (!strcasecmp(al, "none")) table->rules = TABLE_RULE_NONE; if (!strcasecmp(al, "none")) table->rules = TABLE_RULE_NONE;
@ -191,7 +191,7 @@ static void
parse_table_attributes(struct table *table, unsigned char *attr, int real, parse_table_attributes(struct table *table, unsigned char *attr, int real,
struct html_context *html_context) struct html_context *html_context)
{ {
table->fragment_id = get_attr_val(attr, "id", html_context->options); table->fragment_id = get_attr_val(attr, "id", html_context->options->cp);
get_bordercolor(html_context, attr, &table->bordercolor); get_bordercolor(html_context, attr, &table->bordercolor);
@ -212,18 +212,18 @@ parse_table_attributes(struct table *table, unsigned char *attr, int real,
* interpreted as the value of the frame attribute. It implies * interpreted as the value of the frame attribute. It implies
* rules="all" and some default (non-zero) value for the border * rules="all" and some default (non-zero) value for the border
* attribute. */ * attribute. */
table->border = get_num(attr, "border", html_context->options); table->border = get_num(attr, "border", html_context->options->cp);
if (table->border == -1) { if (table->border == -1) {
table->border = table->border =
has_attr(attr, "border", html_context->options) has_attr(attr, "border", html_context->options->cp)
|| has_attr(attr, "rules", html_context->options) || has_attr(attr, "rules", html_context->options->cp)
|| has_attr(attr, "frame", html_context->options); || has_attr(attr, "frame", html_context->options->cp);
} }
if (table->border) { if (table->border) {
int_upper_bound(&table->border, 2); int_upper_bound(&table->border, 2);
table->cellspacing = get_num(attr, "cellspacing", html_context->options); table->cellspacing = get_num(attr, "cellspacing", html_context->options->cp);
int_bounds(&table->cellspacing, 1, 2); int_bounds(&table->cellspacing, 1, 2);
} }
@ -231,7 +231,7 @@ parse_table_attributes(struct table *table, unsigned char *attr, int real,
/* TODO: cellpadding may be expressed as a percentage, this is not /* TODO: cellpadding may be expressed as a percentage, this is not
* handled yet. */ * handled yet. */
table->cellpadding = get_num(attr, "cellpadding", html_context->options); table->cellpadding = get_num(attr, "cellpadding", html_context->options->cp);
if (table->cellpadding == -1) { if (table->cellpadding == -1) {
table->vcellpadding = 0; table->vcellpadding = 0;
table->cellpadding = !!table->border; table->cellpadding = !!table->border;
@ -650,7 +650,7 @@ see:
get_align(html_context, t_attr, &c_al); get_align(html_context, t_attr, &c_al);
get_valign(html_context, t_attr, &c_val); get_valign(html_context, t_attr, &c_val);
get_column_width(t_attr, &c_width, sh, html_context); get_column_width(t_attr, &c_width, sh, html_context);
c_span = get_num(t_attr, "span", html_context->options); c_span = get_num(t_attr, "span", html_context->options->cp);
if (c_span == -1) if (c_span == -1)
c_span = 1; c_span = 1;
else if (c_span > HTML_MAX_COLSPAN) else if (c_span > HTML_MAX_COLSPAN)
@ -668,7 +668,7 @@ see:
add_table_bad_html_end(table, html); add_table_bad_html_end(table, html);
sp = get_num(t_attr, "span", html_context->options); sp = get_num(t_attr, "span", html_context->options->cp);
if (sp == -1) sp = 1; if (sp == -1) sp = 1;
else if (sp > HTML_MAX_COLSPAN) sp = HTML_MAX_COLSPAN; else if (sp > HTML_MAX_COLSPAN) sp = HTML_MAX_COLSPAN;
@ -745,7 +745,7 @@ see:
get_valign(html_context, t_attr, &l_val); get_valign(html_context, t_attr, &l_val);
get_bgcolor(html_context, t_attr, &last_bgcolor); get_bgcolor(html_context, t_attr, &last_bgcolor);
mem_free_set(&l_fragment_id, mem_free_set(&l_fragment_id,
get_attr_val(t_attr, "id", html_context->options)); get_attr_val(t_attr, "id", html_context->options->cp));
row++; row++;
col = 0; col = 0;
goto see; goto see;
@ -788,7 +788,7 @@ see:
cell->align = l_al; cell->align = l_al;
cell->valign = l_val; cell->valign = l_val;
cell->fragment_id = get_attr_val(t_attr, "id", html_context->options); cell->fragment_id = get_attr_val(t_attr, "id", html_context->options->cp);
if (!cell->fragment_id && l_fragment_id) { if (!cell->fragment_id && l_fragment_id) {
cell->fragment_id = l_fragment_id; cell->fragment_id = l_fragment_id;
l_fragment_id = NULL; l_fragment_id = NULL;
@ -812,12 +812,12 @@ see:
get_valign(html_context, t_attr, &cell->valign); get_valign(html_context, t_attr, &cell->valign);
get_bgcolor(html_context, t_attr, &cell->bgcolor); get_bgcolor(html_context, t_attr, &cell->bgcolor);
colspan = get_num(t_attr, "colspan", html_context->options); colspan = get_num(t_attr, "colspan", html_context->options->cp);
if (colspan == -1) colspan = 1; if (colspan == -1) colspan = 1;
else if (!colspan) colspan = -1; else if (!colspan) colspan = -1;
else if (colspan > HTML_MAX_COLSPAN) colspan = HTML_MAX_COLSPAN; else if (colspan > HTML_MAX_COLSPAN) colspan = HTML_MAX_COLSPAN;
rowspan = get_num(t_attr, "rowspan", html_context->options); rowspan = get_num(t_attr, "rowspan", html_context->options->cp);
if (rowspan == -1) rowspan = 1; if (rowspan == -1) rowspan = 1;
else if (!rowspan) rowspan = -1; else if (!rowspan) rowspan = -1;
else if (rowspan > HTML_MAX_ROWSPAN) rowspan = HTML_MAX_ROWSPAN; else if (rowspan > HTML_MAX_ROWSPAN) rowspan = HTML_MAX_ROWSPAN;