unsigned char *translate_hashbang(unsigned char *up) { unsigned char *u, *p, *dp, *data, *post_seq; int q; unsigned char *r; int rl; if (!strstr(cast_const_char up, "#!") && !strstr(cast_const_char up, "#%21")) return up; u = stracpy(up); p = extract_position(u); if (!p) { free_u_ret_up: mem_free(u); return up; } if (p[0] == '!') dp = p + 1; else if (!casecmp(p, cast_uchar "%21", 3)) dp = p + 3; else { mem_free(p); goto free_u_ret_up; } if (!(post_seq = cast_uchar strchr(cast_const_char u, POST_CHAR))) post_seq = cast_uchar strchr(cast_const_char u, 0); data = get_url_data(u); if (!data) data = u; r = init_str(); rl = 0; add_bytes_to_str(&r, &rl, u, post_seq - u); q = (int)strlen(cast_const_char data); if (q && (data[q - 1] == '&' || data[q - 1] == '?')) ; else if (strchr(cast_const_char data, '?')) add_chr_to_str(&r, &rl, '&'); else add_chr_to_str(&r, &rl, '?'); add_to_str(&r, &rl, cast_uchar "_escaped_fragment_="); for (; *dp; dp++) { unsigned char c = *dp; if (c <= 0x20 || c == 0x23 || c == 0x25 || c == 0x26 || c == 0x2b || c >= 0x7f) { unsigned char h[4]; sprintf(cast_char h, "%%%02X", c); add_to_str(&r, &rl, h); } else { add_chr_to_str(&r, &rl, c); } } add_to_str(&r, &rl, post_seq); mem_free(u); mem_free(p); mem_free(up); return r; }
void do_image(struct g_part *p, struct image_description *im) { struct g_object_image *io; struct link *link; link = NULL; putchars_link_ptr = &link; g_put_chars(p, NULL, 0); putchars_link_ptr = NULL; if (!link) im->link_num = -1; else { im->link_num = link - p->data->links; im->link_order = link->obj_order++; if (link->img_alt) mem_free(link->img_alt); link->img_alt = stracpy(im->alt); } io = insert_image(p, im); if (!io) goto ab; io->ismap = im->ismap; add_object(p, (struct g_object *)io); if (im->usemap && p->data) { unsigned char *tag = extract_position(im->usemap); struct additional_file *af = request_additional_file(current_f_data, im->usemap); af->need_reparse = 1; if (af->rq && (af->rq->state == O_LOADING || af->rq->state == O_INCOMPLETE || af->rq->state == O_OK) && af->rq->ce) { struct memory_list *ml; struct menu_item *menu; struct cache_entry *ce = af->rq->ce; unsigned char *start, *end; int i; struct image_map *map; get_file(af->rq, &start, &end); if (start == end) goto ft; if (get_image_map(ce->head, start, end, tag, &menu, &ml, format.href_base, format.target_base, 0, 0, 0, 1)) goto ft; map = mem_alloc(sizeof(struct image_map)); map->n_areas = 0; for (i = 0; menu[i].text; i++) { struct link_def *ld = menu[i].data; struct map_area *a; struct link *link; int shape = !ld->shape || !*ld->shape ? SHAPE_RECT : !strcasecmp(ld->shape, "default") ? SHAPE_DEFAULT : !strcasecmp(ld->shape, "rect") ? SHAPE_RECT : !strcasecmp(ld->shape, "circle") ? SHAPE_CIRCLE : !strcasecmp(ld->shape, "poly") || !strcasecmp(ld->shape, "polygon") ? SHAPE_POLY : -1; if (shape == -1) continue; if ((unsigned)map->n_areas > (MAXINT - sizeof(struct image_map)) / sizeof(struct map_area) - 1) overalloc(); map = mem_realloc(map, sizeof(struct image_map) + (map->n_areas + 1) * sizeof(struct map_area)); a = &map->area[map->n_areas++]; a->shape = shape; a->coords = DUMMY; a->ncoords = 0; if (ld->coords) { unsigned char *p = ld->coords; int num; next_coord: num = 0; while (*p && (*p < '0' || *p > '9')) p++; if (!*p) goto noc; while (*p >= '0' && *p <= '9' && num < 10000000) num = num * 10 + *p - '0', p++; if (*p == '.') { p++; while (*p >= '0' && *p <= '9') p++; } if (*p == '%' && num < 1000) { int m = io->xw < io->yw ? io->xw : io->yw; num = num * m / 100; p++; } else num = num * d_opt->image_scale / 100; if ((unsigned)a->ncoords > MAXINT / sizeof(int) - 1) overalloc(); a->coords = mem_realloc(a->coords, (a->ncoords + 1) * sizeof(int)); a->coords[a->ncoords++] = num; goto next_coord; } noc: if (!(link = new_link(p->data))) a->link_num = -1; else { link->pos = DUMMY; link->type = L_LINK; link->where = stracpy(ld->link); link->target = stracpy(ld->target); link->img_alt = stracpy(ld->label); link->where_img = stracpy(im->url); #ifdef JS if (ld->onclick || ld->ondblclick || ld->onmousedown || ld->onmouseup || ld->onmouseover || ld->onmouseout || ld->onmousemove) { create_js_event_spec(&link->js_event); link->js_event->click_code = stracpy(ld->onclick); link->js_event->dbl_code = stracpy(ld->ondblclick); link->js_event->down_code = stracpy(ld->onmousedown); link->js_event->up_code = stracpy(ld->onmouseup); link->js_event->over_code = stracpy(ld->onmouseover); link->js_event->out_code = stracpy(ld->onmouseout); link->js_event->move_code = stracpy(ld->onmousemove); } #endif a->link_num = link - p->data->links; } if (last_link) mem_free(last_link), last_link = NULL; } io->map = map; freeml(ml); ft:; } if (tag) mem_free(tag); } ab: if (im->usemap) mem_free(im->usemap); }