From 1e47628a9f5d51218d2e385b7f85e09dd75df860 Mon Sep 17 00:00:00 2001 From: Robert Menes Date: Sun, 31 Oct 2010 13:02:59 +0000 Subject: Commit FS #11682 by Teruaki Kawashima: fix the disktidy plugin not cleaning custo git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28414 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/disktidy.c | 51 ++++++++++++++++++++++++++++++++------------ apps/plugins/disktidy.config | 2 ++ manual/plugins/disktidy.tex | 7 ++++++ 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/apps/plugins/disktidy.c b/apps/plugins/disktidy.c index df0076f93d..92232bf17a 100644 --- a/apps/plugins/disktidy.c +++ b/apps/plugins/disktidy.c @@ -36,6 +36,8 @@ enum tidy_return #define MAX_TYPES 64 struct tidy_type { char filestring[64]; + int pre; + int post; bool directory; bool remove; } tidy_types[MAX_TYPES]; @@ -46,6 +48,7 @@ bool tidy_loaded_and_changed = false; #define CUSTOM_FILES PLUGIN_APPS_DIR "/disktidy_custom.config" void add_item(const char* name, int index) { + char *a; rb->strcpy(tidy_types[index].filestring, name); if (name[rb->strlen(name)-1] == '/') { @@ -54,6 +57,17 @@ void add_item(const char* name, int index) } else tidy_types[index].directory = false; + a = rb->strchr(name, '*'); + if (a) + { + tidy_types[index].pre = a - name; + tidy_types[index].post = rb->strlen(a+1); + } + else + { + tidy_types[index].pre = -1; + tidy_types[index].post = -1; + } } static int find_file_string(const char *file, char *last_group) { @@ -89,9 +103,7 @@ static int find_file_string(const char *file, char *last_group) /* shift items up one */ for (i=tidy_type_count;i>idx_last_group;i--) { - rb->strcpy(tidy_types[i].filestring, tidy_types[i-1].filestring); - tidy_types[i].directory = tidy_types[i-1].directory; - tidy_types[i].remove = tidy_types[i-1].remove; + rb->memcpy(&tidy_types[i], &tidy_types[i-1], sizeof(struct tidy_type)); } tidy_type_count++; add_item(file, idx_last_group+1); @@ -132,22 +144,33 @@ bool tidy_load_file(const char* file) return true; } +static bool match(struct tidy_type *tidy_type, char *string, int len) +{ + char *pattern = tidy_type->filestring; + if (tidy_type->pre < 0) + { + /* no '*', just compare. */ + return (rb->strcmp(pattern, string) == 0); + } + /* pattern is too long for the string. avoid 'ab*bc' matching 'abc'. */ + if (len < tidy_type->pre + tidy_type->post) + return false; + /* pattern has '*', compare former part of '*' to the begining of + the string and compare next part of '*' to the end of string. */ + return (rb->strncmp(pattern, string, tidy_type->pre) == 0 && + rb->strcmp(pattern + tidy_type->pre + 1, + string + len - tidy_type->post) == 0); +} + bool tidy_remove_item(char *item, int attr) { int i; - char *file; - bool ret = false, rem = false; + int len; + bool ret = false; + len = rb->strlen(item); for (i=0; ret == false && i < tidy_type_count; i++) { - file = tidy_types[i].filestring; - if (file[rb->strlen(file)-1] == '*') - { - if (!rb->strncmp(file, item, rb->strlen(file)-1)) - rem = true; - } - else if (!rb->strcmp(file, item)) - rem = true; - if (rem) + if (match(&tidy_types[i], item, len)) { if (!tidy_types[i].remove) return false; diff --git a/apps/plugins/disktidy.config b/apps/plugins/disktidy.config index 0c062e700f..1de2451e30 100644 --- a/apps/plugins/disktidy.config +++ b/apps/plugins/disktidy.config @@ -1,5 +1,7 @@ # Disktidy config # When adding a new file, make sure its NOT enabled +# WARNING: Be careful when you use custom entries. +# You could accidentally delete important files. < ALL >: no < NONE >: no < Windows >: no diff --git a/manual/plugins/disktidy.tex b/manual/plugins/disktidy.tex index c1c58271ea..c0d429cb7f 100644 --- a/manual/plugins/disktidy.tex +++ b/manual/plugins/disktidy.tex @@ -5,6 +5,13 @@ menu and select `Start Cleaning' to begin to process. The settings are stored in \fname{.rockbox/rocks/apps/disktidy.config}, in a plain text file that is user-modifiable to allow more entries to be added. + + You can use up to one '*' as a wild-card character which matches any string. + the first '*' is recognized as a wild-card character and any additional '*' are + literal '*'. + + \warn{Be careful when you use custom entries. + You could accidentally delete important files.} \subsubsection{Available Options} \begin{description} -- cgit v1.2.3