summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/disktidy.c51
-rw-r--r--apps/plugins/disktidy.config2
-rw-r--r--manual/plugins/disktidy.tex7
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}