void html_ol(struct html_context *html_context, unsigned char *a, unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) { unsigned char *al; int st; par_format.list_level++; st = get_num(a, (unsigned char *)"start", html_context->doc_cp); if (st == -1) st = 1; par_format.list_number = st; par_format.flags = P_NUMBER; al = get_attr_val(a, (unsigned char *)"type", html_context->doc_cp); if (al) { if (*al && !al[1]) { if (*al == '1') par_format.flags = P_NUMBER; else if (*al == 'a') par_format.flags = P_alpha; else if (*al == 'A') par_format.flags = P_ALPHA; else if (*al == 'r') par_format.flags = P_roman; else if (*al == 'R') par_format.flags = P_ROMAN; else if (*al == 'i') par_format.flags = P_roman; else if (*al == 'I') par_format.flags = P_ROMAN; } mem_free(al); } par_format.leftmargin += (par_format.list_level > 1); if (!html_context->table_level) int_upper_bound(&par_format.leftmargin, par_format.width / 2); par_format.align = ALIGN_LEFT; html_top->type = ELEMENT_DONT_KILL; }
void html_ul(struct html_context *html_context, unsigned char *a, unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) { unsigned char *al; /* dump_html_stack(html_context); */ par_format.list_level++; par_format.list_number = 0; par_format.flags = P_DISC; al = get_attr_val(a, (unsigned char *)"type", html_context->doc_cp); if (al) { if (!c_strcasecmp((const char *)al, "disc")) par_format.flags = P_DISC; else if (!c_strcasecmp((const char *)al, "circle")) par_format.flags = P_O; else if (!c_strcasecmp((const char *)al, "square")) par_format.flags = P_SQUARE; mem_free(al); } par_format.leftmargin += 2 + (par_format.list_level > 1); if (!html_context->table_level) int_upper_bound(&par_format.leftmargin, par_format.width / 2); par_format.align = ALIGN_LEFT; html_top->type = ELEMENT_DONT_KILL; }
static void str_wr(struct option *o, struct string *s) { int len = strlen(o->value.string); int_upper_bound(&len, o->max - 1); add_optstring_to_string(s, o->value.string, len); }
do_op_bob(struct form_state *fs, struct line_info *line, int current) #endif /* CONFIG_UTF8 */ { if (current == -1) return 0; fs->state -= line[current].start; int_upper_bound(&fs->state, line[0].end); return 0; }
static int do_op_down(struct form_state *fs, struct line_info *line, int current) { if (current == -1) return 0; if (line[current+1].start == -1) return 1; fs->state += line[current+1].start - line[current].start; int_upper_bound(&fs->state, line[current+1].end); return 0; }
void html_dd(struct html_context *html_context, unsigned char *a, unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5) { kill_html_stack_until(html_context, 0, (unsigned char *)"", (unsigned char *)"DL", NULL); par_format.leftmargin = par_format.dd_margin + 3; if (!html_context->table_level) { par_format.leftmargin += 5; int_upper_bound(&par_format.leftmargin, par_format.width / 2); } par_format.align = ALIGN_LEFT; }
void dump_scanner(struct scanner *scanner) { unsigned char buffer[MAX_STR_LEN]; struct scanner_token *token = scanner->current; struct scanner_token *table_end = scanner->table + scanner->tokens; unsigned char *srcpos = token->string, *bufpos = buffer; int src_lookahead = 50; int token_lookahead = 4; int srclen; if (!scanner_has_tokens(scanner)) return; memset(buffer, 0, MAX_STR_LEN); for (; token_lookahead > 0 && token < table_end; token++, token_lookahead--) { int buflen = MAX_STR_LEN - (bufpos - buffer); int added = snprintf(bufpos, buflen, "[%.*s] ", token->length, token->string); bufpos += added; } if (scanner->tokens > token_lookahead) { memcpy(bufpos, "... ", 4); bufpos += 4; } srclen = strlen(srcpos); int_upper_bound(&src_lookahead, srclen); *bufpos++ = '['; /* Compress the lookahead string */ for (; src_lookahead > 0; src_lookahead--, srcpos++, bufpos++) { if (*srcpos == '\n' || *srcpos == '\r' || *srcpos == '\t') { *bufpos++ = '\\'; *bufpos = *srcpos == '\n' ? 'n' : (*srcpos == '\r' ? 'r' : 't'); } else { *bufpos = *srcpos; } } if (srclen > src_lookahead) memcpy(bufpos, "...]", 4); else memcpy(bufpos, "]", 2); errfile = scanner->file, errline = scanner->line; elinks_wdebug("%s", buffer); }
static void tab_compl_n(struct dialog_data *dlg_data, unsigned char *item, int len) { struct widget_data *widget_data = selected_widget(dlg_data); assert(widget_is_textfield(widget_data)); int_upper_bound(&len, widget_data->widget->datalen - 1); memcpy(widget_data->cdata, item, len); widget_data->cdata[len] = 0; widget_data->info.field.cpos = len; widget_data->info.field.vpos = 0; redraw_dialog(dlg_data, 1); }
do_op_eob(struct form_state *fs, struct line_info *line, int current) #endif /* CONFIG_UTF8 */ { if (current == -1) { fs->state = strlen(fs->value); } else { int last = get_textarea_line_number(line, strlen(fs->value)); assertm(last != -1, "line info corrupt"); fs->state += line[last].start - line[current].start; int_upper_bound(&fs->state, line[last].end); } return 0; }
static int do_op_up(struct form_state *fs, struct line_info *line, int current, int utf8) { int old_state; if (current == -1) return 0; if (!(current - !!fs->state_cell)) return 1; if (!utf8) { fs->state -= line[current].start - line[current-1].start; int_upper_bound(&fs->state, line[current-1].end); return 0; } old_state = fs->state; if (fs->state_cell) { int len = utf8_ptr2cells(fs->value + line[current - 1].start, fs->value + fs->state_cell); new_pos(fs, line, current - 2, len + line[current - 1].last_char_width); } else { int len = utf8_ptr2cells(fs->value + line[current].start, fs->value + fs->state); new_pos(fs, line, current - 1, len); } if (old_state != fs->state ) { if (fs->state_cell && fs->state == line[current - 1].start) { unsigned char *new_value; new_value = utf8_prevchar(fs->value + fs->state, 1, fs->value); fs->state_cell = new_value - fs->value; } else fs->state_cell = 0; } return 0; }
/* Takes care about rendering of each listbox item. */ static int display_listbox_item(struct listbox_item *item, void *data_, int *offset) { struct listbox_context *data = (struct listbox_context *)data_; int len; /* Length of the current text field. */ struct color_pair *tree_color, *text_color; int depth = item->depth + 1; int d; int x, y; tree_color = get_bfu_color(data->term, (const unsigned char *)"menu.normal"); if (item == data->box->sel) { text_color = get_bfu_color(data->term, (const unsigned char *)"menu.selected"); } else if (item->marked) { text_color = get_bfu_color(data->term, (const unsigned char *)"menu.marked"); } else { text_color = tree_color; } y = data->widget_data->box.y + data->offset; for (d = 0; d < depth - 1; d++) { struct listbox_item *root = item; struct listbox_item *child = item; int i, x; for (i = depth - d; i; i--) { child = root; if (root) root = data->box->ops->get_root(root); } /* XXX */ x = data->widget_data->box.x + d * 5; draw_text(data->term, x, y, (const unsigned char *)" ", 5, 0, tree_color); if (root ? root->child.prev == child : data->box->items->prev == child) continue; /* We were the last branch. */ draw_border_char(data->term, x + 1, y, BORDER_SVLINE, tree_color); } if (depth) { unsigned char str[5] = { 32, BORDER_SRTEE, BORDER_SHLINE, BORDER_SHLINE, 32 }; int i; switch (item->type) { case BI_LEAF: case BI_SEPARATOR: { const struct listbox_item *prev; prev = traverse_listbox_items_list(item, data->box, -1, 1, NULL, NULL); if (item == prev) { /* There is no visible item before @item, so it * must be the first item in the listbox. */ str[1] = BORDER_SULCORNER; } else { const struct listbox_item *next; next = traverse_listbox_items_list(item, data->box, 1, 1, NULL, NULL); if (item == next || item->depth != next->depth) { /* There is no visible item after @item * at the same depth, so it must be the * last in its folder. */ str[1] = BORDER_SDLCORNER; } } break; } case BI_FOLDER: str[0] = '['; str[1] = (item->expanded) ? '-' : '+'; str[2] = ']'; break; default: INTERNAL("Unknown item type"); break; } if (item->marked) str[4] = '*'; x = data->widget_data->box.x + (depth - 1) * 5; for (i = 0; i < 5; i++) { draw_border_char(data->term, x + i, y, str[i], tree_color); } } x = data->widget_data->box.x + depth * 5; if (item->type == BI_SEPARATOR) { int i; int width = data->widget_data->box.width - depth * 5; for (i = 0; i < width; i++) { draw_border_char(data->term, x + i, y, BORDER_SHLINE, text_color); } } else if (data->box->ops && data->box->ops->draw) { int width = data->widget_data->box.width - depth * 5; data->box->ops->draw(item, data, x, y, width); } else { unsigned char *text; const struct listbox_ops *ops = data->box->ops; int len_bytes; assert(ops && ops->get_info); text = ops->get_text(item, data->term); if (!text) return 0; len = strlen((const char *)text); int_upper_bound(&len, int_max(0, data->widget_data->box.width - depth * 5)); #ifdef CONFIG_UTF8 if (data->term->utf8_cp) len_bytes = utf8_cells2bytes(text, len, NULL); else #endif /* CONFIG_UTF8 */ len_bytes = len; draw_text(data->term, x, y, text, len_bytes, 0, text_color); mem_free(text); } if (item == data->box->sel) { /* For blind users: */ x = data->widget_data->box.x + 5 + item->depth * 5; set_cursor(data->term, x, y, 1); set_window_ptr(data->dlg_data->win, x, y); } data->offset++; return 0; }