-static void exp_isfiles(int attribute((unused)) nargs,
- char attribute((unused)) **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
-
- lookups(ds, DC_FILES);
- sink_printf(output->sink, "%s", bool2str(!!ds->g->nfiles));
-}
-
-static void exp_isdirectories(int attribute((unused)) nargs,
- char attribute((unused)) **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
-
- lookups(ds, DC_DIRS);
- sink_printf(output->sink, "%s", bool2str(!!ds->g->ndirs));
-}
-
-static void exp_choose(int attribute((unused)) nargs,
- char **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
- dcgi_state substate;
- int nfiles, n;
- char **files;
- struct entry *e;
- const char *type, *what = expandarg(args[0], ds);
-
- if(!strcmp(what, "files")) {
- lookups(ds, DC_FILES);
- files = ds->g->files;
- nfiles = ds->g->nfiles;
- type = "track";
- } else if(!strcmp(what, "directories")) {
- lookups(ds, DC_DIRS);
- files = ds->g->dirs;
- nfiles = ds->g->ndirs;
- type = "dir";
- } else {
- error(0, "unknown @choose@ argument '%s'", what);
- return;
- }
- e = xmalloc(nfiles * sizeof (struct entry));
- for(n = 0; n < nfiles; ++n) {
- e[n].path = files[n];
- e[n].sort = trackname_transform(type, files[n], "sort");
- e[n].display = trackname_transform(type, files[n], "display");
- }
- qsort(e, nfiles, sizeof (struct entry), compare_entry);
- memset(&substate, 0, sizeof substate);
- substate.g = ds->g;
- substate.first = 1;
- for(n = 0; n < nfiles; ++n) {
- substate.last = (n == nfiles - 1);
- substate.index = n;
- substate.entry = &e[n];
- expandstring(output, args[1], &substate);
- substate.first = 0;
- }
-}
-
-static void exp_file(int attribute((unused)) nargs,
- char attribute((unused)) **args,
- cgi_sink *output,
- void *u) {
- dcgi_state *ds = u;
-
- if(ds->entry)
- cgi_output(output, "%s", ds->entry->path);
- else if(ds->track)
- cgi_output(output, "%s", ds->track->track);
- else if(ds->tracks)
- cgi_output(output, "%s", ds->tracks[0]);
-}
-