* (see COPYING for full license text)
*/
+#include "cgit.h"
+#include "html.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
"%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);
}
return buf[bufidx];
}
+char *fmtalloc(const char *format, ...)
+{
+ struct strbuf sb = STRBUF_INIT;
+ va_list args;
+
+ va_start(args, format);
+ strbuf_vaddf(&sb, format, args);
+ va_end(args);
+
+ return strbuf_detach(&sb, NULL);
+}
+
void html_raw(const char *data, size_t size)
{
- write(htmlfd, data, size);
+ if (write(htmlfd, data, size) != size)
+ die_errno("write error on html output");
}
void html(const char *txt)
{
- write(htmlfd, txt, strlen(txt));
+ html_raw(txt, strlen(txt));
}
void htmlf(const char *format, ...)
{
- static char buf[65536];
+ va_list args;
+ struct strbuf buf = STRBUF_INIT;
+
+ va_start(args, format);
+ strbuf_vaddf(&buf, format, args);
+ va_end(args);
+ html(buf.buf);
+ strbuf_release(&buf);
+}
+
+void html_txtf(const char *format, ...)
+{
va_list args;
va_start(args, format);
- vsnprintf(buf, sizeof(buf), format, args);
+ html_vtxtf(format, args);
va_end(args);
- html(buf);
+}
+
+void html_vtxtf(const char *format, va_list ap)
+{
+ va_list cp;
+ struct strbuf buf = STRBUF_INIT;
+
+ va_copy(cp, ap);
+ strbuf_vaddf(&buf, format, cp);
+ va_end(cp);
+ html_txt(buf.buf);
+ strbuf_release(&buf);
}
void html_status(int code, const char *msg, int more_headers)
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_attrf(const char *fmt, ...)
+{
+ va_list ap;
+ struct strbuf sb = STRBUF_INIT;
+
+ va_start(ap, fmt);
+ strbuf_vaddf(&sb, fmt, ap);
+ va_end(ap);
+
+ html_attr(sb.buf);
+ strbuf_release(&sb);
+}
+
void html_attr(const char *txt)
{
const char *t = txt;
- while(t && *t){
+ while (t && *t) {
int c = *t;
- if (c=='<' || 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(""");
- else if (c=='&')
+ else if (c == '&')
html("&");
- txt = t+1;
+ 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){
+ while (t && *t) {
unsigned char c = *t;
const char *e = url_escape_table[c];
- if (e && c!='+' && c!='&') {
+ if (e && c != '+' && c != '&') {
html_raw(txt, t - txt);
html(e);
- txt = t+1;
+ 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){
+ while (t && *t) {
unsigned char c = *t;
const char *e = url_escape_table[c];
if (c == ' ')
if (e) {
html_raw(txt, t - txt);
html(e);
- txt = t+1;
+ txt = t + 1;
}
t++;
}
- if (t!=txt)
+ if (t != txt)
html(txt);
}
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-2);
+ 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;
}
}
if (!txt_)
return 0;
- o = t = txt = strdup(txt_);
- if (t == NULL) {
- printf("Out of memory\n");
- exit(1);
- }
- while((c=*t) != '\0') {
- if (c=='=') {
+ o = t = txt = xstrdup(txt_);
+ 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;