diff options
Diffstat (limited to 'src/cmd.c')
| -rw-r--r-- | src/cmd.c | 155 |
1 files changed, 119 insertions, 36 deletions
@@ -10,6 +10,7 @@ #include "util.h" #include <stdbool.h> +#include <string.h> #define CMD_ERROR(...) do { \ CMD_SET_STATUS(__VA_ARGS__); \ @@ -17,31 +18,35 @@ } while (0) static const struct cmd *last_cmd; -static wchar_t *last_args; +static char *last_args; -static bool cmd_save(const wchar_t *args); -static bool cmd_move(const wchar_t *args); -static bool cmd_add(const wchar_t *args); -static bool cmd_reindex(const wchar_t *args); +static bool cmd_save(const char *args); +static bool cmd_move(const char *args); +static bool cmd_copy(const char *args); +static bool cmd_reindex(const char *args); +static bool cmd_add_tag(const char *args); +static bool cmd_rm_tag(const char *args); const struct cmd commands[] = { - { L"save", cmd_save }, - { L"move", cmd_move }, - { L"add", cmd_add }, - { L"reindex", cmd_reindex }, + { "save", cmd_save }, + { "move", cmd_move }, + { "copy", cmd_copy }, + { "reindex", cmd_reindex }, + { "addtag", cmd_add_tag }, + { "rmtag", cmd_rm_tag }, }; const size_t command_count = ARRLEN(commands); bool -cmd_save(const wchar_t *args) +cmd_save(const char *args) { data_save(); return 0; } bool -cmd_move(const wchar_t *name) +cmd_move(const char *name) { struct link *link; struct track *track; @@ -55,10 +60,11 @@ cmd_move(const wchar_t *name) if (!link) CMD_ERROR("No track selected"); track = UPCAST(link, struct ref)->data; - newpath = aprintf("%s/%s", tag->fpath, track->fname); + newpath = aprintf("%s/%s", tag->fpath, track->name); OOM_CHECK(newpath); - move_file(track->fpath, newpath); + if (!move_file(track->fpath, newpath)) + CMD_ERROR("Failed to move file"); free(track->fpath); track->fpath = newpath; @@ -69,7 +75,7 @@ cmd_move(const wchar_t *name) } bool -cmd_add(const wchar_t *name) +cmd_copy(const char *name) { struct link *link; struct track *track; @@ -84,21 +90,21 @@ cmd_add(const wchar_t *name) if (!link) return 0; track = UPCAST(link, struct ref)->data; - newpath = aprintf("%s/%s", tag->fpath, track->fname); + newpath = aprintf("%s/%s", tag->fpath, track->name); OOM_CHECK(newpath); copy_file(track->fpath, newpath); track->fpath = newpath; - track = track_alloc(tag->fpath, track->fname, get_fid(tag->fpath)); - ref = ref_init(track); + track = track_alloc(tag->fpath, track->name, get_fid(tag->fpath)); + ref = ref_alloc(track); list_push_back(&tag->tracks, &ref->link); return 1; } bool -cmd_reindex(const wchar_t *name) +cmd_reindex(const char *name) { struct link *link; struct tag *tag; @@ -108,19 +114,19 @@ cmd_reindex(const wchar_t *name) if (!*name) { link = list_at(&tags, tag_nav.sel); + if (!link) return false; tag = UPCAST(link, struct tag); - if (tag == NULL) return false; - list_push_back(&matches, LINK(ref_init(tag))); - } else if (!wcscmp(name, L"*")) { + list_push_back(&matches, LINK(ref_alloc(tag))); + } else if (!strcmp(name, "*")) { for (LIST_ITER(&tags, link)) { tag = UPCAST(link, struct tag); - list_push_back(&matches, LINK(ref_init(tag))); + list_push_back(&matches, LINK(ref_alloc(tag))); } } else { for (LIST_ITER(&tags, link)) { tag = UPCAST(link, struct tag); - if (!wcscmp(tag->name, name)) { - list_push_back(&matches, LINK(ref_init(tag))); + if (!strcmp(tag->name, name)) { + list_push_back(&matches, LINK(ref_alloc(tag))); break; } } @@ -130,7 +136,8 @@ cmd_reindex(const wchar_t *name) for (LIST_ITER(&matches, link)) { tag = UPCAST(link, struct ref)->data; - index_update(tag); + if (!tracks_update(tag)) + return false; } refs_free(&matches); @@ -138,6 +145,76 @@ cmd_reindex(const wchar_t *name) return true; } +bool +cmd_add_tag(const char *name) +{ + struct link *link; + struct tag *tag; + char *fname, *fpath; + + for (LIST_ITER(&tags, link)) { + tag = UPCAST(link, struct tag); + if (!strcmp(tag->name, name)) + CMD_ERROR("Tag already exists"); + } + + fname = aprintf("%s", name); + OOM_CHECK(fname); + + fpath = aprintf("%s/%s", datadir, fname); + OOM_CHECK(fpath); + + if (!make_dir(fpath)) { + CMD_SET_STATUS("Failed to create dir"); + free(fname); + free(fpath); + return false; + } + + tag = tag_alloc(datadir, fname); + OOM_CHECK(tag); + + list_push_back(&tags, LINK(tag)); + + free(fname); + free(fpath); + + return true; +} + +bool +cmd_rm_tag(const char *name) +{ + struct link *link; + struct tag *tag; + char *fname, *fpath; + + if (!*name) { + link = list_at(&tags, tag_nav.sel); + if (!link) return false; + tag = UPCAST(link, struct tag); + } else { + for (LIST_ITER(&tags, link)) { + tag = UPCAST(link, struct tag); + if (!strcmp(tag->name, name)) + break; + } + + if (!LIST_INNER(link)) + CMD_ERROR("No such tag"); + } + + if (!rm_dir(tag->fpath, true)) { + tracks_update(tag); /* in case some deleted, some not */ + CMD_ERROR("Failed to remove dir"); + } + + link_pop(LINK(tag)); + tag_free(tag); + + return true; +} + void cmd_init(void) { @@ -152,19 +229,25 @@ cmd_deinit(void) } bool -cmd_run(const wchar_t *query) +cmd_run(const char *query, bool *found) { - const wchar_t *sep, *args; + const char *sep, *args; int i, cmdlen; bool success; - sep = wcschr(query, L' '); - cmdlen = sep ? sep - query : wcslen(query); + *found = false; + sep = strchr(query, ' '); + cmdlen = sep ? sep - query : strlen(query); for (i = 0; i < command_count; i++) { - if (!wcsncmp(commands[i].name, query, cmdlen)) { + if (!strncmp(commands[i].name, query, cmdlen)) { last_cmd = &commands[i]; - args = sep ? sep + 1 : L""; - last_args = wcsdup(args); + args = sep ? sep + 1 : ""; + + free(last_args); + last_args = strdup(args); + OOM_CHECK(last_args); + + *found = true; return commands[i].func(args); } } @@ -181,12 +264,12 @@ cmd_rerun(void) } const struct cmd * -cmd_get(const wchar_t *name) +cmd_get(const char *name) { int i; for (i = 0; i < command_count; i++) { - if (!wcscmp(commands[i].name, name)) + if (!strcmp(commands[i].name, name)) return &commands[i]; } @@ -194,12 +277,12 @@ cmd_get(const wchar_t *name) } const struct cmd * -cmd_find(const wchar_t *name) +cmd_find(const char *name) { int i; for (i = 0; i < command_count; i++) { - if (wcsstr(commands[i].name, name)) + if (strcmp(commands[i].name, name)) return &commands[i]; } |
