char * evhttp_htmlescape(const char *html) { size_t i; size_t new_size = 0, old_size = 0; char *escaped_html, *p; if (html == NULL) return (NULL); old_size = strlen(html); for (i = 0; i < old_size; ++i) { const char *replaced = NULL; const size_t replace_size = html_replace(html[i], &replaced); if (replace_size > EV_SIZE_MAX - new_size) { event_warn("%s: html_replace overflow", __func__); return (NULL); } new_size += replace_size; } if (new_size == EV_SIZE_MAX) return (NULL); p = escaped_html = mm_malloc(new_size + 1); if (escaped_html == NULL) { event_warn("%s: malloc(%lu)", __func__, (unsigned long)(new_size + 1)); return (NULL); } for (i = 0; i < old_size; ++i) { const char *replaced = &html[i]; const size_t len = html_replace(html[i], &replaced); memcpy(p, replaced, len); p += len; } *p = '\0'; return (escaped_html); }
int main() { char html[HTML_MAX_LEN]; char now_html[HTML_MAX_LEN]; char abt_display[HTML_MAX_LEN]; memset(html, 0, sizeof(html)); if (-1 == html_data(html)) { TOWEB("html_data error"); return -1; } memset(abt_display, 0, sizeof(abt_display)); about_display(abt_display); memset(now_html, 0, sizeof(now_html)); html_replace(html, "<strong>", "</strong>", abt_display, now_html); TOWEB(MIME); TOWEB(now_html) return 0; }
static int scantext_textcvt(unsigned char *buf, int len) { static const unsigned char charcvt_tab[256] = { /*00*/ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, /*10*/ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, /*20*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*30*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*40*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*50*/ 0,0,0,0,0,0,0,0,0,0,0,'(',0,')',0,0, /* "[]" -> "()" */ /*60*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*70*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*80*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*90*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*A0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*B0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*C0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*D0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*E0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*F0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32 }; static const struct { int in_len; char *in; int out_len; /* MUST BE <= in_len */ char *out; } cvt_tab[] = { { 2, " ", 1, " " }, { 2, "@ ", 1, "@" }, { 2, " @", 1, "@" }, { 2, "@@", 1, "@" }, /* { 2, "( ", 1, "(" }, * { 2, " )", 1, ")" }, * { 2, "< ", 1, "<" }, * { 2, " >", 1, ">" }, * { 3, "</ ", 2, "</" }, * { 3, " />", 2, "/>" }, */ { 3, "(@)", 1, "@" }, /* { 3, "<@>", 1, "@" }, * { 3, ".@.", 1, "@" }, * { 4, ".at.", 1, "@" }, */ { 4, "(at)", 1, "@" }, /* { 4, "_at_", 1, "@" }, * { 4, "@at@", 1, "@" }, * { 4, "\'at\'", 1, "@" }, * { 4, "\"at\"", 1, "@" }, * { 8, "(atsign)", 1, "@" }, * { 9, "(at_sign)", 1, "@" }, * { 9, "(at-sign)", 1, "@" }, * { 9, "(at sign)", 1, "@" }, * { 4, "<", 1, "<" }, * { 4, ">", 1, "<" }, */ { 6, " ", 1, " " }, { 5, " ", 1, " " }, /* { 6, """, 1, "\"" }, * { 5, "&", 1, "&" }, * { 4, "<br>", 1, " " }, * { 5, "<br/>", 1, " " }, * { 8, "<strong>", 1, " " }, * { 9, "</strong>", 1, " " }, */ { 0, NULL, 0, NULL } }; register int i, matches; register unsigned char *p, c; for (i=len, p=buf; i>0; i--, p++) if ((c = charcvt_tab[*p]) != 0) *p = c; retry_2nd: for (i=0, matches=0; i<=len; i++) { register int j, k, l; for (j=0; (l = cvt_tab[j].in_len) != 0; j++) { if (l > i) continue; if (xmemcmpi(cvt_tab[j].in, buf + i - l, l) != 0) continue; matches++; i -= l; memcpy(buf+i, cvt_tab[j].out, cvt_tab[j].out_len); if (l != cvt_tab[j].out_len) { //---memcpy(buf+i+cvt_tab[j].out_size, buf+i+l, len-i-l);--- register unsigned char *q; for (p=(buf+i+cvt_tab[j].out_len), q=(buf+i+l), k=(len-i-l); k>0; k--) *p++ = *q++; } len = len - l + cvt_tab[j].out_len; } } buf[len] = 0; matches += html_replace(buf); matches += html_replace2(buf); if (matches != 0) goto retry_2nd; return 0; }