From: Richard Kettlewell Date: Tue, 24 Jun 2008 20:50:26 +0000 (+0100) Subject: Use tracksort_init() throughout the CGI. X-Git-Tag: 4.1~8 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/e13809e4ea85d491efae95be86f6583a845e6033 Use tracksort_init() throughout the CGI. --- diff --git a/cgi/actions.c b/cgi/actions.c index 4d064e0..4728503 100644 --- a/cgi/actions.c +++ b/cgi/actions.c @@ -240,7 +240,7 @@ static void act_play(void) { const char *track, *dir; char **tracks; int ntracks, n; - struct dcgi_entry *e; + struct tracksort_data *tsd; if(dcgi_client) { if((track = cgi_get("track"))) { @@ -248,16 +248,9 @@ static void act_play(void) { } else if((dir = cgi_get("dir"))) { if(disorder_files(dcgi_client, dir, 0, &tracks, &ntracks)) ntracks = 0; - /* TODO use tracksort_init */ - e = xmalloc(ntracks * sizeof (struct dcgi_entry)); - for(n = 0; n < ntracks; ++n) { - e[n].track = tracks[n]; - e[n].sort = trackname_transform("track", tracks[n], "sort"); - e[n].display = trackname_transform("track", tracks[n], "display"); - } - qsort(e, ntracks, sizeof (struct dcgi_entry), dcgi_compare_entry); + tsd = tracksort_init(ntracks, tracks, "track"); for(n = 0; n < ntracks; ++n) - disorder_play(dcgi_client, e[n].track); + disorder_play(dcgi_client, tsd[n].track); } } redirect(0); diff --git a/cgi/disorder-cgi.h b/cgi/disorder-cgi.h index 3f19fe2..3cabe9b 100644 --- a/cgi/disorder-cgi.h +++ b/cgi/disorder-cgi.h @@ -60,16 +60,6 @@ extern char *dcgi_cookie; extern const char *dcgi_error_string; extern const char *dcgi_status_string; -/** @brief Entry in a list of tracks or directories */ -struct dcgi_entry { - /** @brief Track name */ - const char *track; - /** @brief Sort key */ - const char *sort; - /** @brief Display key */ - const char *display; -}; - /** @brief Compare two @ref entry objects */ int dcgi_compare_entry(const void *a, const void *b); diff --git a/cgi/macros-disorder.c b/cgi/macros-disorder.c index 8e891d6..5ea7413 100644 --- a/cgi/macros-disorder.c +++ b/cgi/macros-disorder.c @@ -814,15 +814,6 @@ static int exp_image(int attribute((unused)) nargs, return sink_writes(output, cgi_sgmlquote(url)) < 0 ? -1 : 0; } -/** @brief Compare two @ref entry objects */ -int dcgi_compare_entry(const void *a, const void *b) { - const struct dcgi_entry *ea = a, *eb = b; - - return compare_tracks(ea->sort, eb->sort, - ea->display, eb->display, - ea->track, eb->track); -} - /** @brief Implementation of exp_tracks() and exp_dirs() */ static int exp__files_dirs(int nargs, const struct mx_node **args, @@ -837,7 +828,7 @@ static int exp__files_dirs(int nargs, char **tracks, *dir, *re; int n, ntracks, rc; const struct mx_node *m; - struct dcgi_entry *e; + struct tracksort_data *tsd; if((rc = mx_expandstr(args[0], &dir, u, "argument #0 (DIR)"))) return rc; @@ -855,25 +846,18 @@ static int exp__files_dirs(int nargs, if(fn(dcgi_client, dir, re, &tracks, &ntracks)) return 0; /* Sort it. NB trackname_transform() does not go to the server. */ - /* TODO use tracksort_init */ - e = xcalloc(ntracks, sizeof *e); - for(n = 0; n < ntracks; ++n) { - e[n].track = tracks[n]; - e[n].sort = trackname_transform(type, tracks[n], "sort"); - e[n].display = trackname_transform(type, tracks[n], "display"); - } - qsort(e, ntracks, sizeof (struct dcgi_entry), dcgi_compare_entry); + tsd = tracksort_init(ntracks, tracks, type); /* Expand the subsiduary templates. We chuck in @sort and @display because * it is particularly easy to do so. */ for(n = 0; n < ntracks; ++n) if((rc = mx_expand(mx_rewritel(m, "index", make_index(n), "parity", n % 2 ? "odd" : "even", - "track", e[n].track, + "track", tsd[n].track, "first", n == 0 ? "true" : "false", "last", n + 1 == ntracks ? "false" : "true", - "sort", e[n].sort, - "display", e[n].display, + "sort", tsd[n].sort, + "display", tsd[n].display, (char *)0), output, u))) return rc;