/* ** Copyright 2007 Double Precision, Inc. ** See COPYING for distribution information. */ /* */ #include "cgi.h" #include #include #include #include void cgi_output_unicode_escapes(const char32_t *value, const char *escapes, void (*output_func)(const char *, size_t, void *), void *output_arg) { while (value && *value) { size_t i; for (i=0; value[i]; i++) { if (value[i] > 127 || strchr(escapes, value[i])) break; } while (i) { char buf[100]; size_t n=sizeof(buf); size_t j; if (n > i) n=i; for (j=0; j", 0, output_arg); } static void cnt_bytes(const char *str, size_t cnt, void *arg) { if (!cnt) cnt=strlen(str); *(size_t *)arg += cnt; } static void save_bytes(const char *str, size_t cnt, void *arg) { char **p=(char **)arg; if (!cnt) cnt=strlen(str); memcpy(*p, str, cnt); *p += cnt; } char *cgi_input(const char *name, const char32_t *value, int size, int maxlength, const char *flags) { size_t cnt=1; char *buf; char *ptr; if (!flags) flags=""; do_cgi_input(name, value, size, maxlength, flags, cnt_bytes, &cnt); buf=malloc(cnt); if (!buf) return NULL; ptr=buf; do_cgi_input(name, value, size, maxlength, flags, save_bytes, &ptr); *ptr=0; return buf; }