"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09",
"%0a", "%0b", "%0c", "%0d", "%0e", "%0f", "%10", "%11", "%12", "%13",
"%14", "%15", "%16", "%17", "%18", "%19", "%1a", "%1b", "%1c", "%1d",
- "%1e", "%1f", "+", 0, "%22", "%23", 0, "%25", "%26", "%27", 0, 0, 0,
+ "%1e", "%1f", "%20", 0, "%22", "%23", 0, "%25", "%26", "%27", 0, 0, 0,
"%2b", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "%3c", "%3d",
"%3e", "%3f", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, "%5c", 0, "%5e", 0, "%60", 0, 0, 0, 0, 0,
"%fe", "%ff"
};
-int htmlfd = STDOUT_FILENO;
+static int htmlfd = STDOUT_FILENO;
char *fmt(const char *format, ...)
{
va_start(args, format);
len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
va_end(args);
- if (len>sizeof(buf[bufidx])) {
+ if (len > sizeof(buf[bufidx])) {
fprintf(stderr, "[html.c] string truncated: %s\n", format);
exit(1);
}
void html_raw(const char *data, size_t size)
{
- write(htmlfd, data, size);
+ if (write(htmlfd, data, size) != size)
+ fprintf(stderr, "[html.c] html output truncated.\n");
}
void html(const char *txt)
{
- write(htmlfd, txt, strlen(txt));
+ html_raw(txt, strlen(txt));
}
void htmlf(const char *format, ...)
void html_txt(const char *txt)
{
const char *t = txt;
- while(t && *t){
+ while (t && *t) {
int c = *t;
- if (c=='<' || c=='>' || c=='&') {
+ if (c == '<' || c == '>' || c == '&') {
html_raw(txt, t - txt);
- if (c=='>')
+ if (c == '>')
html(">");
- else if (c=='<')
+ else if (c == '<')
html("<");
- else if (c=='&')
+ else if (c == '&')
html("&");
- txt = t+1;
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html(txt);
}
void html_ntxt(int len, const char *txt)
{
const char *t = txt;
- while(t && *t && len--){
+ while (t && *t && len--) {
int c = *t;
- if (c=='<' || c=='>' || c=='&') {
+ if (c == '<' || c == '>' || c == '&') {
html_raw(txt, t - txt);
- if (c=='>')
+ if (c == '>')
html(">");
- else if (c=='<')
+ else if (c == '<')
html("<");
- else if (c=='&')
+ else if (c == '&')
html("&");
- txt = t+1;
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html_raw(txt, t - txt);
- if (len<0)
+ if (len < 0)
html("...");
}
void html_attr(const char *txt)
{
const char *t = txt;
- while(t && *t){
+ while (t && *t) {
int c = *t;
- if (c=='<' || c=='>' || c=='\'' || c=='\"') {
+ if (c == '<' || c == '>' || c == '\'' || c == '\"' || c == '&') {
html_raw(txt, t - txt);
- if (c=='>')
+ if (c == '>')
html(">");
- else if (c=='<')
+ else if (c == '<')
html("<");
- else if (c=='\'')
+ else if (c == '\'')
html("'");
- else if (c=='"')
+ else if (c == '"')
html(""");
- txt = t+1;
+ else if (c == '&')
+ html("&");
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html(txt);
}
void html_url_path(const char *txt)
{
const char *t = txt;
- while(t && *t){
- int c = *t;
+ while (t && *t) {
+ unsigned char c = *t;
const char *e = url_escape_table[c];
- if (e && c!='+' && c!='&' && c!='+') {
+ if (e && c != '+' && c != '&') {
html_raw(txt, t - txt);
- html_raw(e, 3);
- txt = t+1;
+ html(e);
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html(txt);
}
void html_url_arg(const char *txt)
{
const char *t = txt;
- while(t && *t){
- int c = *t;
+ while (t && *t) {
+ unsigned char c = *t;
const char *e = url_escape_table[c];
+ if (c == ' ')
+ e = "+";
if (e) {
html_raw(txt, t - txt);
- html_raw(e, strlen(e));
- txt = t+1;
+ html(e);
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html(txt);
}
html("</option>\n");
}
+void html_intoption(int value, const char *text, int selected_value)
+{
+ htmlf("<option value='%d'%s>", value,
+ value == selected_value ? " selected='selected'" : "");
+ html_txt(text);
+ html("</option>");
+}
+
void html_link_open(const char *url, const char *title, const char *class)
{
html("<a href='");
filename, strerror(errno), errno);
return -1;
}
- while((len = fread(buf, 1, 4096, f)) > 0)
+ while ((len = fread(buf, 1, 4096, f)) > 0)
html_raw(buf, len);
fclose(f);
return 0;
}
-int hextoint(char c)
+static int hextoint(char c)
{
if (c >= 'a' && c <= 'f')
return 10 + c - 'a';
return -1;
}
-char *convert_query_hexchar(char *txt)
+static char *convert_query_hexchar(char *txt)
{
int d1, d2, n;
n = strlen(txt);
*txt = '\0';
return txt-1;
}
- d1 = hextoint(*(txt+1));
- d2 = hextoint(*(txt+2));
- if (d1<0 || d2<0) {
- memmove(txt, txt+3, n-3);
+ d1 = hextoint(*(txt + 1));
+ d2 = hextoint(*(txt + 2));
+ if (d1 < 0 || d2 < 0) {
+ memmove(txt, txt + 3, n - 2);
return txt-1;
} else {
*txt = d1 * 16 + d2;
- memmove(txt+1, txt+3, n-2);
+ memmove(txt + 1, txt + 3, n - 2);
return txt;
}
}
int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value))
{
- char *t, *txt, *value = NULL, c;
+ char *o, *t, *txt, *value = NULL, c;
if (!txt_)
return 0;
- t = txt = strdup(txt_);
+ o = t = txt = strdup(txt_);
if (t == NULL) {
printf("Out of memory\n");
exit(1);
}
- while((c=*t) != '\0') {
- if (c=='=') {
+ while ((c=*t) != '\0') {
+ if (c == '=') {
*t = '\0';
- value = t+1;
- } else if (c=='+') {
+ value = t + 1;
+ } else if (c == '+') {
*t = ' ';
- } else if (c=='%') {
+ } else if (c == '%') {
t = convert_query_hexchar(t);
- } else if (c=='&') {
+ } else if (c == '&') {
*t = '\0';
(*fn)(txt, value);
- txt = t+1;
+ txt = t + 1;
value = NULL;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
(*fn)(txt, value);
+ free(o);
return 0;
}