-static void exp_basename(int nargs,
- char **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
- const char *s;
-
- if(nargs) {
- if((s = strrchr(args[0], '/'))) ++s;
- else s = args[0];
- cgi_output(output, "%s", s);
- } else
- cgi_output(output, "%.*s", ds->nav_len - ds->nav_dirlen - 1,
- ds->nav_path + ds->nav_dirlen + 1);
-}
-
-static void exp_dirname(int nargs,
- char **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
- const char *s;
-
- if(nargs) {
- if((s = strrchr(args[0], '/')))
- cgi_output(output, "%.*s", (int)(s - args[0]), args[0]);
- } else
- cgi_output(output, "%.*s", ds->nav_dirlen, ds->nav_path);
-}
-
-static void exp_files(int attribute((unused)) nargs,
- char **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
- dcgi_state substate;
- const char *nfiles_arg, *directory;
- int nfiles, numfile;
- struct kvp *k;
-
- memset(&substate, 0, sizeof substate);
- substate.g = ds->g;
- if((directory = cgi_get("directory"))) {
- /* Prefs for whole directory. */
- lookups(ds, DC_FILES);
- /* Synthesize args for the file list. */
- nfiles = ds->g->nfiles;
- for(numfile = 0; numfile < nfiles; ++numfile) {
- k = xmalloc(sizeof *k);
- byte_xasprintf((char **)&k->name, "%d_file", numfile);
- k->value = ds->g->files[numfile];
- k->next = cgi_args;
- cgi_args = k;
- }
- } else {
- /* Args already present. */
- if((nfiles_arg = cgi_get("files"))) nfiles = atoi(nfiles_arg);
- else nfiles = 1;
- }
- for(numfile = 0; numfile < nfiles; ++numfile) {
- substate.index = numfile;
- expandstring(output, args[0], &substate);
- }
-}
-
-static void exp_nfiles(int attribute((unused)) nargs,
- char attribute((unused)) **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
- const char *files_arg;
-
- if(cgi_get("directory")) {
- lookups(ds, DC_FILES);
- cgi_output(output, "%d", ds->g->nfiles);
- } else if((files_arg = cgi_get("files")))
- cgi_output(output, "%s", files_arg);
- else
- cgi_output(output, "1");
-}
-
-static void exp_image(int attribute((unused)) nargs,
- char **args,
- cgi_sink *output,
- void attribute((unused)) *u) {
- char *labelname;
- const char *imagestem;
-
- byte_xasprintf(&labelname, "images.%s", args[0]);
- if(cgi_label_exists(labelname))
- imagestem = cgi_label(labelname);
- else if(strchr(args[0], '.'))
- imagestem = args[0];
- else
- byte_xasprintf((char **)&imagestem, "%s.png", args[0]);
- if(cgi_label_exists("url.static"))
- cgi_output(output, "%s/%s", cgi_label("url.static"), imagestem);
- else
- cgi_output(output, "/disorder/%s", imagestem);
-}
-