aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-05-26 03:39:06 +0200
committerdec05eba <dec05eba@protonmail.com>2021-05-26 03:39:06 +0200
commit3757fe80b30801119bda41ab0445e915271129fc (patch)
tree62d282f929d02b96656ec3f8fab5ccef1f839a14 /src/main.c
parent4fabc85d2a59383c67239c488fb2c717657b5954 (diff)
Allow use of multiple ranges when using cleanup command
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c169
1 files changed, 84 insertions, 85 deletions
diff --git a/src/main.c b/src/main.c
index a49acdb..04ae6fe 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,6 +7,7 @@
#include "rss.h"
#include "rss_html_common.h"
#include "html.h"
+#include "track_remove_parser.h"
#include "../depends/cJSON.h"
#include "alloc.h"
@@ -734,6 +735,13 @@ static void command_cleanup(int argc, char **argv, const char *rss_config_dir, c
++index;
}
+ char *track_items_selected = alloc_or_crash(num_tracked_items);
+ Buffer /*size_t*/ tracks_to_remove;
+ buffer_init(&tracks_to_remove);
+
+ Buffer /*Range*/ track_remove_ranges;
+ buffer_init(&track_remove_ranges);
+
if(tracked_items.size == 0) {
fprintf(stderr, "There is no media that hasn't been updated in the last %ld %s\n", days, days == 1 ? "day" : "days");
goto cleanup;
@@ -744,117 +752,108 @@ static void command_cleanup(int argc, char **argv, const char *rss_config_dir, c
fprintf(stderr, "==> ");
fflush(stderr);
- char resp[128];
+ char resp[512];
if(!fgets(resp, sizeof(resp), stdin)) {
fprintf(stderr, "Failed to read response from stdin\n");
goto cleanup;
}
+
char *response_str = strip(resp);
int response_len = strlen(response_str);
if(response_len == 0) {
- fprintf(stderr, "Invalid input, expected number range\n");
+ fprintf(stderr, "Invalid input. Expected numbers and/or number ranges\n");
continue;
}
- int start_range = 0;
- int end_range = 0;
- int num_variables_read = sscanf(response_str, "%d-%d", &start_range, &end_range);
+ memset(track_items_selected, 0, num_tracked_items);
+ buffer_clear(&tracks_to_remove);
+ buffer_clear(&track_remove_ranges);
- if(num_variables_read == 0) {
- fprintf(stderr, "Invalid input, expected number range\n");
- } else if(num_variables_read == 1) {
- int index = start_range - 1;
- if(index < 0 || index >= num_tracked_items) {
- fprintf(stderr, "Invalid item selected: %d, expected a value between 1 and %d\n", start_range, num_tracked_items);
- continue;
- }
+ if(track_remove_parser_parse(response_str, response_len, &track_remove_ranges) != 0)
+ continue;
- const char *name = path_get_filename((list_begin + index)->item_tracked_path);
- for(;;) {
- fprintf(stderr, "==> Are you sure you want to stop tracking %s/%s? Yes/No: \n", index < num_rss_items ? "rss" : "html", name);
- fprintf(stderr, "==> ");
- fflush(stderr);
-
- char resp[128];
- if(!fgets(resp, sizeof(resp), stdin)) {
- fprintf(stderr, "Failed to read response from stdin\n");
- goto cleanup;
- }
- char *response_str = strip(resp);
- int response_len = strlen(response_str);
- if(response_len == 0)
- continue;
+ Range *track_remove_it = buffer_begin(&track_remove_ranges);
+ Range *track_remove_end = buffer_end(&track_remove_ranges);
- if(response_str[0] == 'n' || response_str[0] == 'N') {
- goto cleanup;
- } else if(response_str[0] == 'y' || response_str[0] == 'Y') {
- if(remove_recursive((list_begin + index)->item_tracked_path) != 0) {
- fprintf(stderr, "Failed to remove %s/%s\n", index < num_rss_items ? "rss" : "html", name);
- goto cleanup;
- }
-
- fprintf(stderr, "Removed %s/%s\n", index < num_rss_items ? "rss" : "html", name);
- goto cleanup;
- }
- }
- } else if(num_variables_read == 2) {
- int start_index_f = start_range - 1;
+ int valid_ranges = 1;
+ for(; track_remove_it != track_remove_end; ++track_remove_it) {
+ int start_index_f = track_remove_it->start - 1;
if(start_index_f < 0 || start_index_f >= num_tracked_items) {
- fprintf(stderr, "Invalid item start range: %d, expected a value between 1 and %d\n", start_range, num_tracked_items);
- continue;
+ fprintf(stderr, "Invalid item start range: %d, expected a value between 1 and %d\n", track_remove_it->start, num_tracked_items);
+ valid_ranges = 0;
+ break;
}
- int end_index_f = end_range - 1;
+ int end_index_f = track_remove_it->end - 1;
if(end_index_f < start_index_f || end_index_f >= num_tracked_items) {
- fprintf(stderr, "Invalid item end range: %d, expected a value between %d and %d\n", end_index_f, start_range, num_tracked_items);
- continue;
+ fprintf(stderr, "Invalid item end range: %d, expected a value between %d and %d\n", end_index_f, track_remove_it->start, num_tracked_items);
+ valid_ranges = 0;
+ break;
}
- for(;;) {
- fprintf(stderr, "==> Are you sure you want to stop tracking:\n");
- TrackedItemData *list_it = list_begin + start_index_f;
- TrackedItemData *list_end = list_begin + end_range;
- int index = 0;
- for(; list_it != list_end; ++list_it) {
- const char *name = path_get_filename(list_it->item_tracked_path);
- printf(" %s/%s\n", index < num_rss_items ? "rss" : "html", name);
- ++index;
- }
-
- fprintf(stderr, "==> Yes/No: ");
- fflush(stderr);
-
- char resp[128];
- if(!fgets(resp, sizeof(resp), stdin)) {
- fprintf(stderr, "Failed to read response from stdin\n");
- goto cleanup;
- }
- char *response_str = strip(resp);
- int response_len = strlen(response_str);
- fprintf(stderr, "response len: %d\n", response_len);
- if(response_len == 0)
+ for(size_t i = start_index_f; i <= (size_t)end_index_f; ++i) {
+ if(track_items_selected[i])
continue;
- if(response_str[0] == 'n' || response_str[0] == 'N') {
- goto cleanup;
- } else if(response_str[0] == 'y' || response_str[0] == 'Y') {
- TrackedItemData *list_it = list_begin + start_index_f;
- TrackedItemData *list_end = list_begin + end_range;
- for(; list_it != list_end; ++list_it) {
- const char *name = path_get_filename(list_it->item_tracked_path);
- if(remove_recursive(list_it->item_tracked_path) != 0) {
- fprintf(stderr, "Failed to remove %s/%s\n", index < num_rss_items ? "rss" : "html", name);
- goto cleanup;
- }
- fprintf(stderr, "Removed %s/%s\n", index < num_rss_items ? "rss" : "html", name);
- }
- goto cleanup;
- }
+ track_items_selected[i] = 1;
+ buffer_append(&tracks_to_remove, &i, sizeof(i));
+ }
+ }
+
+ if(!valid_ranges)
+ continue;
+
+ for(;;) {
+ size_t *tracks_to_remove_it = buffer_begin(&tracks_to_remove);
+ size_t *tracks_to_remove_end = buffer_end(&tracks_to_remove);
+ fprintf(stderr, "==> Are you sure you want to stop tracking:\n");
+ for(; tracks_to_remove_it != tracks_to_remove_end; ++tracks_to_remove_it) {
+ const size_t track_index = *tracks_to_remove_it;
+ TrackedItemData *track_item = &list_begin[track_index];
+ const char *name = path_get_filename(track_item->item_tracked_path);
+ printf(" %s/%s\n", track_index < (size_t)num_rss_items ? "rss" : "html", name);
}
+
+ fprintf(stderr, "==> Yes/No: ");
+ fflush(stderr);
+
+ if(!fgets(resp, sizeof(resp), stdin)) {
+ fprintf(stderr, "Failed to read response from stdin\n");
+ goto cleanup;
+ }
+
+ response_str = strip(resp);
+ response_len = strlen(response_str);
+ if(response_len == 0)
+ continue;
+
+ if(response_str[0] == 'n' || response_str[0] == 'N') {
+ goto cleanup;
+ } else if(response_str[0] == 'y' || response_str[0] == 'Y') {
+ break;
+ }
+ }
+
+ size_t *tracks_to_remove_it = buffer_begin(&tracks_to_remove);
+ size_t *tracks_to_remove_end = buffer_end(&tracks_to_remove);
+ for(; tracks_to_remove_it != tracks_to_remove_end; ++tracks_to_remove_it) {
+ const size_t track_index = *tracks_to_remove_it;
+ TrackedItemData *track_item = &list_begin[track_index];
+ const char *name = path_get_filename(track_item->item_tracked_path);
+ if(remove_recursive(track_item->item_tracked_path) != 0) {
+ fprintf(stderr, "Failed to remove %s/%s\n", track_index < (size_t)num_rss_items ? "rss" : "html", name);
+ goto cleanup;
+ }
+ fprintf(stderr, "Removed %s/%s\n", track_index < (size_t)num_rss_items ? "rss" : "html", name);
}
+ break;
}
cleanup:
+ buffer_deinit(&track_remove_ranges);
+ buffer_deinit(&tracks_to_remove);
+ free(track_items_selected);
+
list_it = buffer_begin(&tracked_items);
list_end = buffer_end(&tracked_items);
for(; list_it != list_end; ++list_it) {