diff --git a/src/config.c b/src/config.c index 2251924..dda939a 100644 --- a/src/config.c +++ b/src/config.c @@ -71,6 +71,21 @@ static int add_priority(char *name, int priority) return found ? OK : ERR; } +static int remove_preview(char *name) +{ + int found = 0; + + for (size_t i = 0; i < previews->len; i++) { + if (strcmp(previews->buf[i].name, name) != 0) + continue; + + vectorPreview_remove(previews, i); + found = 1; + } + + return found ? OK : ERR; +} + static inline void next_token(void) { token = lexer_get_token(lexer); @@ -142,7 +157,7 @@ static int preview_type(char **type, char **subtype, char **ext) return preview_type_mime(type, subtype); } -static int new_preview(void) +static int cmd_preview(void) { Token name = token; EXPECT(TOK_STR); @@ -164,7 +179,7 @@ static int new_preview(void) return STAT_OK; } -static int priority(Token tok) +static int cmd_priority(Token tok) { Token name = token; EXPECT(TOK_STR); @@ -181,6 +196,20 @@ static int priority(Token tok) return STAT_OK; } +static int cmd_remove(Token tok) +{ + Token name = token; + EXPECT(TOK_STR); + char *name_str = get_str(name); + + if (remove_preview(name_str) != OK) { + PARSEERROR(name, "preview '%s' not found", name_str); + return STAT_ERR; + } + + return STAT_OK; +} + static int command(void) { Token cmd = token; @@ -188,9 +217,11 @@ static int command(void) char *cmd_str = get_str(cmd); if (strcmp(cmd_str, "preview") == 0) - return new_preview(); + return cmd_preview(); else if (strcmp(cmd_str, "priority") == 0) - return priority(cmd); + return cmd_priority(cmd); + else if (strcmp(cmd_str, "remove") == 0) + return cmd_remove(cmd); PARSEERROR(cmd, "unknown command: %s", cmd_str); return STAT_ERR; diff --git a/src/vector.c b/src/vector.c index a139118..edb2773 100644 --- a/src/vector.c +++ b/src/vector.c @@ -86,3 +86,9 @@ void vector_resize(Vector *vec, size_t len) vec->len = len; } + +void vector_remove(Vector *vec, size_t i) +{ + memcpy(vec->buf + i * vec->size, vec->buf + (--vec->len) * vec->size, + vec->size); +} diff --git a/src/vector.h b/src/vector.h index 9deba32..83a8a98 100644 --- a/src/vector.h +++ b/src/vector.h @@ -22,6 +22,7 @@ #define VECTOR_SIGN_APPEND(name, type) VECTOR_SIGN_V(name, type, append, size_t, type val) #define VECTOR_SIGN_GET(name, type) VECTOR_SIGN_V(name, type, get, type, size_t i) #define VECTOR_SIGN_RESIZE(name, type) VECTOR_SIGN_V(name, type, resize, void, size_t len) +#define VECTOR_SIGN_REMOVE(name, type) VECTOR_SIGN_V(name, type, remove, void, size_t i) #define VECTOR_GEN_SOURCE_(name, type, spec) \ inline spec VECTOR_SIGN_NEW(name, type) \ @@ -47,6 +48,10 @@ inline spec VECTOR_SIGN_RESIZE(name, type) \ { \ vector_resize((Vector *)vec, len); \ + } \ + inline spec VECTOR_SIGN_REMOVE(name, type) \ + { \ + vector_remove((Vector *)vec, i); \ } #define VECTOR_GEN_SOURCE(name, type) VECTOR_GEN_SOURCE_(name, type, ) @@ -61,7 +66,8 @@ VECTOR_SIGN_APPEND_ARR(name, type); \ VECTOR_SIGN_APPEND(name, type); \ VECTOR_SIGN_GET(name, type); \ - VECTOR_SIGN_RESIZE(name, type); + VECTOR_SIGN_RESIZE(name, type); \ + VECTOR_SIGN_REMOVE(name, type); VECTOR_TYPE(, void); @@ -71,6 +77,7 @@ size_t vector_append_arr(Vector *vec, void *arr, size_t len); size_t vector_append(Vector *vec, void *arr); void *vector_get(Vector *vec, size_t i); void vector_resize(Vector *vec, size_t len); +void vector_remove(Vector *vec, size_t i); VECTOR_GEN_HEADER(Char, char)