/*
* This file is part of DisOrder.
- * Copyright (C) 2004, 2005, 2006 Richard Kettlewell
+ * Copyright (C) 2004-2008 Richard Kettlewell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
}
static void cgi_parse_post(void) {
- const char *ct;
- char *q, *type, *pname, *pvalue;
+ const char *ct, *boundary;
+ char *q, *type;
size_t n;
+ struct kvp *k;
if(!(ct = getenv("CONTENT_TYPE")))
ct = "application/x-www-form-urlencoded";
- if(mime_content_type(ct, &type, &pname, &pvalue))
+ if(mime_content_type(ct, &type, &k))
fatal(0, "invalid content type '%s'", ct);
if(!strcmp(type, "application/x-www-form-urlencoded")) {
cgi_input(&q, &n);
return;
}
if(!strcmp(type, "multipart/form-data")) {
- if(!pname || strcmp(pname, "boundary"))
- fatal(0, "expected a boundary parameter, found %s",
- pname ? pname : "nothing");
- cgi_parse_multipart(pvalue);
+ if(!(boundary = kvp_get(k, "boundary")))
+ fatal(0, "no boundary parameter found");
+ cgi_parse_multipart(boundary);
return;
}
fatal(0, "unrecognized content type '%s'", type);
++template;
sline = line;
while(*template != '@') {
+ /* Skip whitespace */
+ while(isspace((unsigned char)*template))
+ ++template;
dynstr_init(&d);
if(*template == '{') {
/* bracketed arg */
}
if(!*template) fatal(0, "%s:%d: unterminated expansion", name, sline);
++template;
- /* skip whitespace after closing bracket */
- while(isspace((unsigned char)*template))
- ++template;
+ if(isspace((unsigned char)*template)) {
+ /* We have @{...}<WHITESPACE><SOMETHING> */
+ for(p = template; isspace((unsigned char)*p); ++p)
+ ;
+ /* Now we are looking at <SOMETHING>. If it's "{" then that
+ * must be the next argument. Otherwise we infer that this
+ * is really the end of the expansion. */
+ if(*p != '{')
+ goto finished_expansion;
+ }
} else {
/* unbracketed arg */
- /* leading whitespace is not significant in unquoted args */
- while(isspace((unsigned char)*template))
- ++template;
while(*template
&& *template != '@' && *template != '{' && *template != ':') {
if(*template == '\n') ++line;
vector_append(&v, d.vec);
}
++template;
+finished_expansion:
vector_terminate(&v);
/* @@ terminates this file */
if(v.nvec == 0)
read_options();
if(!(label = kvp_get(labels, key))) {
- if((label = strchr(key, '.')))
+ /* No label found */
+ if(!strncmp(key, "images.", 7)) {
+ static const char *url_static;
+ /* images.X defaults to <url.static>X.png */
+
+ if(!url_static)
+ url_static = cgi_label("url.static");
+ byte_xasprintf((char **)&label, "%s%s.png", url_static, key + 7);
+ } else if((label = strchr(key, '.')))
+ /* X.Y defaults to Y */
++label;
else
+ /* otherwise default to label name */
label = key;
}
return label;
}
+int cgi_label_exists(const char *key) {
+ read_options();
+ return kvp_get(labels, key) ? 1 : 0;
+}
+
char **cgi_columns(const char *name, int *ncolumns) {
struct column *c;