summaryrefslogtreecommitdiffstats
path: root/src/cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd.c')
-rw-r--r--src/cmd.c155
1 files changed, 119 insertions, 36 deletions
diff --git a/src/cmd.c b/src/cmd.c
index 851804d..e89aa23 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -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];
}