summaryrefslogtreecommitdiff
path: root/lib/dbdict.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dbdict.c')
-rw-r--r--lib/dbdict.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/lib/dbdict.c b/lib/dbdict.c
new file mode 100644
index 0000000..0b2211e
--- /dev/null
+++ b/lib/dbdict.c
@@ -0,0 +1,158 @@
+/*
+ * dbdict.c
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+
+#include "common.h"
+#include "dbdict.h"
+
+//***************************************************************************
+// cDbDict
+//***************************************************************************
+
+cDbDict::cDbDict()
+{
+ inside = no;
+}
+
+cDbDict::~cDbDict()
+{
+}
+
+//***************************************************************************
+// In
+//***************************************************************************
+
+int cDbDict::in(const char* file)
+{
+ FILE* f;
+ char* line = 0;
+ size_t size = 0;
+ char* path;
+
+ asprintf(&path, "%s", file);
+
+ f = fopen(path, "r");
+
+ while (getline(&line, &size, f) > 0)
+ {
+ char* p = strstr(line, "//");
+
+ if (p) *p = 0;
+
+ allTrim(line);
+
+ if (isEmpty(line))
+ continue;
+
+ if (atLine(line) != success)
+ {
+ tell(0, "Found unexpected definition '%s', aborting", line);
+ free(path);
+ return fail;
+ }
+ }
+
+ fclose(f);
+ free(line);
+ free(path);
+
+ return success;
+}
+
+//***************************************************************************
+// At Line
+//***************************************************************************
+
+int cDbDict::atLine(const char* line)
+{
+ const char* p;
+
+ if (p = strcasestr(line, "Table"))
+ {
+ char tableName[100];
+
+ p += strlen("Table");
+ strcpy(tableName, p);
+ tell(0, "Table: '%s'", tableName);
+ }
+
+ else if (strchr(line, '{'))
+ inside = yes;
+
+ else if (strchr(line, '}'))
+ inside = no;
+
+ else if (inside)
+ parseField(line);
+
+ return success;
+}
+
+//***************************************************************************
+// Get Token
+//***************************************************************************
+
+int getToken(const char*& p, char* token, int size)
+{
+ char* dest = token;
+ int num = 0;
+
+ while (*p && *p == ' ')
+ p++;
+
+ while (*p && *p != ' ' && num < size)
+ {
+ if (*p == '"')
+ p++;
+ else
+ {
+ *dest++ = *p++;
+ num++;
+ }
+ }
+
+ *dest = 0;
+
+ return success;
+}
+
+//***************************************************************************
+// Parse Field
+//***************************************************************************
+
+int cDbDict::parseField(const char* line)
+{
+ const int sizeTokenMax = 100;
+ FieldDef f;
+ char token[sizeTokenMax+TB];
+ const char* p = line;
+
+ // tell(0, "Got: '%s'", p);
+
+ for (int i = 0; i < dtCount; i++)
+ {
+ if (getToken(p, token, sizeTokenMax) != success)
+ {
+ tell(0, "Errot: can't parse line [%s]", line);
+ return fail;
+ }
+
+ switch (i)
+ {
+ case dtName: f.name = strdup(token); break;
+ case dtDescription: break;
+ case dtFormat: f.format = toDictFormat(token); break;
+ case dtSize: f.size = atoi(token); break;
+ case dtType: f.type = toType(token); break;
+ }
+
+ free((char*)f.name); // böser cast ...
+
+ tell(0, "token %d -> '%s'", i, token);
+ }
+
+ return success;
+}