aboutsummaryrefslogtreecommitdiff
path: root/Src/nde/android/FilenameField.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/nde/android/FilenameField.cpp')
-rw-r--r--Src/nde/android/FilenameField.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/Src/nde/android/FilenameField.cpp b/Src/nde/android/FilenameField.cpp
new file mode 100644
index 00000000..cae2e4c2
--- /dev/null
+++ b/Src/nde/android/FilenameField.cpp
@@ -0,0 +1,128 @@
+#include "FilenameField.h"
+#include "../nde.h"
+
+
+//---------------------------------------------------------------------------
+FilenameField::FilenameField(const char *Str, int strkind) : StringField(Str, strkind)
+{
+ Type = FIELD_FILENAME;
+}
+
+
+//---------------------------------------------------------------------------
+FilenameField::FilenameField()
+{
+ Type = FIELD_FILENAME;
+}
+
+//---------------------------------------------------------------------------
+int FilenameField::Compare(Field *Entry)
+{
+ if (!Entry) return -1;
+ if (!CompatibleFields(Entry->GetType(), GetType()))
+ return 0;
+ return mystricmp_fn(GetString(), ((FilenameField*)Entry)->GetString());
+}
+
+//---------------------------------------------------------------------------
+int FilenameField::Starts(Field *Entry)
+{
+ if (!Entry) return -1;
+ if (!CompatibleFields(Entry->GetType(), GetType()))
+ return 0;
+ return (mystristr_fn(GetString(), ((FilenameField*)Entry)->GetString()) == GetString());
+}
+
+//---------------------------------------------------------------------------
+int FilenameField::Contains(Field *Entry)
+{
+ if (!Entry) return -1;
+ if (!CompatibleFields(Entry->GetType(), GetType()))
+ return 0;
+ return (mystristr_fn(GetString(), ((FilenameField*)Entry)->GetString()) != NULL);
+}
+
+
+Field *FilenameField::Clone(Table *pTable)
+{
+ FilenameField *clone = new FilenameField(String, STRING_IS_NDESTRING);
+ clone->Pos = FIELD_CLONE;
+ clone->ID = ID;
+ clone->MaxSizeOnDisk = GetDataSize();
+ return clone;
+}
+
+// TODO: make file system string comparison functions
+//---------------------------------------------------------------------------
+bool FilenameField::ApplyFilter(Field *Data, int op)
+{
+ // TODO: maybe do this?
+ if (op == FILTER_ISEMPTY || op == FILTER_ISNOTEMPTY)
+ {
+ bool r = (op == FILTER_ISEMPTY);
+ if (!String)
+ return r;
+
+ if (String && String[0] == 0)
+ return r;
+
+ return !r;
+ }
+ //
+ bool r;
+ const char *p=0;
+ if (Data->GetType() == FIELD_STRING)
+ p = ((StringField *)Data)->GetString();
+ else
+ p = ((FilenameField *)Data)->GetString();
+ const char *d = GetString();
+ if (!p)
+ p = "";
+ if (!d)
+ d = "";
+
+ switch (op)
+ {
+ case FILTER_EQUALS:
+ r = !nde_stricmp_fn(d, p);
+ break;
+ case FILTER_NOTEQUALS:
+ r = !!nde_stricmp_fn(d, p);
+ break;
+ case FILTER_CONTAINS:
+ r = (NULL != stristr_fn(d, p));
+ break;
+ case FILTER_NOTCONTAINS:
+ r = (NULL == stristr_fn(d, p));
+ break;
+ case FILTER_ABOVE:
+ r = (bool)(nde_stricmp_fn(d, p) > 0);
+ break;
+ case FILTER_ABOVEOREQUAL:
+ r = (bool)(nde_stricmp_fn(d, p) >= 0);
+ break;
+ case FILTER_BELOW:
+ r = (bool)(nde_stricmp_fn(d, p) < 0);
+ break;
+ case FILTER_BELOWOREQUAL:
+ r = (bool)(nde_stricmp_fn(d, p) <= 0);
+ break;
+ case FILTER_BEGINS:
+ r = (bool)(nde_strnicmp_fn(d, p, strlen(p)) == 0);
+ break;
+ case FILTER_ENDS:
+ {
+ int lenp = (int)strlen(p), lend = (int)strlen(d);
+ if (lend < lenp) return 0; // too short
+ r = (bool)(nde_stricmp_fn((d + lend) - lenp, p) == 0);
+ }
+ break;
+ case FILTER_LIKE:
+ r = (bool)(nde_stricmp_fn(d, p) == 0);
+ break;
+ default:
+ r = true;
+ break;
+ }
+ return r;
+}