diff options
author | Nick Van Doorn <vandoorn.nick@gmail.com> | 2019-06-16 14:42:04 -0700 |
---|---|---|
committer | Nick Van Doorn <vandoorn.nick@gmail.com> | 2019-06-16 14:42:04 -0700 |
commit | 80b752d29d53a6de7b99290570c3d6b3f5e851b0 (patch) | |
tree | 25f990e0d86262bcf27c09f62559d0f84e1ff206 | |
parent | 1bb638a9185aa3c4f9801c4aa71a7af1650ce65a (diff) |
Implement command line parser
-rw-r--r-- | core.c | 30 | ||||
-rw-r--r-- | core.h | 17 | ||||
-rw-r--r-- | core.test.c | 41 | ||||
-rw-r--r-- | database.h | 21 |
4 files changed, 103 insertions, 6 deletions
@@ -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"); } @@ -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); +} @@ -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 |