summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Van Doorn <vandoorn.nick@gmail.com>2019-06-16 14:42:04 -0700
committerNick Van Doorn <vandoorn.nick@gmail.com>2019-06-16 14:42:04 -0700
commit80b752d29d53a6de7b99290570c3d6b3f5e851b0 (patch)
tree25f990e0d86262bcf27c09f62559d0f84e1ff206
parent1bb638a9185aa3c4f9801c4aa71a7af1650ce65a (diff)
Implement command line parser
-rw-r--r--core.c30
-rw-r--r--core.h17
-rw-r--r--core.test.c41
-rw-r--r--database.h21
4 files changed, 103 insertions, 6 deletions
diff --git a/core.c b/core.c
index aa3a071..00539a7 100644
--- a/core.c
+++ b/core.c
@@ -2,7 +2,37 @@
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
+
+void gitrolex_parseArgs(struct State_t *s, int argc, const char *argv[]) {
+ const char *task;
+ if(argc < 2) {
+ s->task = ERROR;
+ return;
+ }
+ task = argv[1];
+ if(!strcmp(task, "status")) {
+ s->task = STATUS;
+ }
+ else if(!strcmp(task, "export")) {
+ s->task = EXPORT;
+ }
+ else if(!strcmp(task, "track")) {
+ // if we're tracking time,
+ // we need a branch name stored
+ // in the args
+ if(argc < 3) {
+ s->task = ERROR;
+ return;
+ }
+ s->task = TRACK;
+ strcpy(s->taskArgs, argv[2]);
+ }
+}
+
int gitrolex_core(int argc, const char* argv[]) {
+ struct State_t state;
+ gitrolex_parseArgs(&state, argc, argv);
printf("Usage ./gitrolex status | export | track <branch-name>\n");
}
diff --git a/core.h b/core.h
index 52f65ad..a459412 100644
--- a/core.h
+++ b/core.h
@@ -1,10 +1,23 @@
-
#ifndef GITROLEX_CORE_H
#define GITROLEX_CORE_H
-
#include <stdlib.h>
#include <stdio.h>
+int gitrolex_core();
+
+enum Task_t {
+ ERROR = -1,
+ STATUS = 0,
+ EXPORT,
+ TRACK
+};
+
+struct State_t {
+ enum Task_t task;
+ char taskArgs[1024];
+};
+
+void gitrolex_parseArgs(struct State_t *s, int argc, const char *argv[]);
#endif
diff --git a/core.test.c b/core.test.c
index feb43b1..b011e00 100644
--- a/core.test.c
+++ b/core.test.c
@@ -1,8 +1,45 @@
-
#include "test-lib.h"
#include "core.h"
-
#include <stdlib.h>
#include <stdio.h>
+int parseArgsTest() {
+ // mocks
+ int argc = 1;
+ char *argv[10];
+ struct State_t s;
+
+ // should fail with no args
+ gitrolex_parseArgs(&s, argc, argv);
+ if(s.task != ERROR) {
+ goto fail;
+ }
+
+ // should fail if we track without a name
+ argc = 2;
+ argv[1] = "track";
+ gitrolex_parseArgs(&s, argc, argv);
+ if(s.task != ERROR) {
+ goto fail;
+ }
+
+ // should track a named task
+ argc = 3;
+ argv[1] = "track";
+ argv[2] = "my-feature-branch";
+ gitrolex_parseArgs(&s, argc, argv);
+ if(s.task != TRACK) {
+ goto fail;
+ }
+ if(strcmp(s.taskArgs, argv[2])) {
+ goto fail;
+ }
+ return 0;
+fail:
+ return -1;
+}
+
+int main() {
+ syncTest("gitrolex_parseArgs", "Failed to parse command line arguments", parseArgsTest);
+}
diff --git a/database.h b/database.h
index c297872..c7f7512 100644
--- a/database.h
+++ b/database.h
@@ -1,10 +1,27 @@
-
#ifndef GITROLEX_DATABASE_H
#define GITROLEX_DATABASE_H
-
#include <stdlib.h>
#include <stdio.h>
+/**
+ * This file implements a simple key value database using
+ * double precision floating point numbers. Strings may need to
+ * be supported at some point
+ */
+
+struct Database_t {
+ char *path;
+ int maxSize; // in bytes
+};
+
+enum DatabaseError_t {
+ OK = 0,
+ OUT_OF_SPACE
+};
+
+enum DatabaseError_t database_getDouble(struct *Database_t db, const char *path, double *val);
+enum DatabaseError_t database_setDouble(struct *Database_t db, const char *path, double *val);
+
#endif