diff options
| author | Louis Burda <quent.burda@gmail.com> | 2021-04-29 17:54:54 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2021-04-29 17:54:54 +0200 |
| commit | a50aacd30adb87698eb775ef5c7615c65e57a11d (patch) | |
| tree | 6088cc031eb204c7c1e75a49cf92aef003557433 /service/src/printdoc.c | |
| parent | 008b5f74235a7fd04852e6f640429269f1ec4845 (diff) | |
| download | enowars5-service-stldoctor-a50aacd30adb87698eb775ef5c7615c65e57a11d.tar.gz enowars5-service-stldoctor-a50aacd30adb87698eb775ef5c7615c65e57a11d.zip | |
very basic binary file parsing and skeleton for state-machine based parsing of ascii format
Diffstat (limited to 'service/src/printdoc.c')
| -rw-r--r-- | service/src/printdoc.c | 95 |
1 files changed, 10 insertions, 85 deletions
diff --git a/service/src/printdoc.c b/service/src/printdoc.c index baec94a..451692d 100644 --- a/service/src/printdoc.c +++ b/service/src/printdoc.c @@ -5,19 +5,14 @@ #include <dirent.h> #include "stlfile.h" - -#define ARRSIZE(x) (sizeof(x)/sizeof((x)[0])) -#define MIN(x,y) ((x) > (y) ? (y) : (x)) +#include "util.h" struct command { const char *name; void (*func)(char *); }; -void* checkp(void *p); const char* ask(const char *fmtstr, ...); -void* die(const char *fmtstr, ...); -char* aprintf(const char *fmtstr, ...); void dump(const char *filepath); void search_cmd(char *arg); @@ -32,16 +27,9 @@ struct command commands[] = { { "search", search_cmd } }; -struct parseinfo *lastrun = NULL; +struct parseinfo lastrun; const char *resultdir; -void* -checkp(void *p) -{ - if (!p) die("pointer assertion failed, OOM?\n"); - return p; -} - const char* ask(const char *fmtstr, ...) { @@ -60,69 +48,6 @@ ask(const char *fmtstr, ...) return fail ? "" : linebuf; } -void* -die(const char *fmtstr, ...) -{ - va_list ap; - - va_start(ap, fmtstr); - vfprintf(stderr, fmtstr, ap); - va_end(ap); - - exit(EXIT_FAILURE); -} - -char* -aprintf(const char *fmtstr, ...) -{ - va_list ap, cpy; - size_t nb; - char *str; - - va_copy(cpy, ap); - - va_start(cpy, fmtstr); - nb = vsnprintf(NULL, 0, fmtstr, ap); - va_end(cpy); - - if (nb <= 0) die("encountered invalid fmtstr!\n"); - - str = checkp(malloc(nb)); - va_start(ap, fmtstr); - nb = vsnprintf(str, nb, fmtstr, ap); - va_end(ap); - - return str; -} - -char* -strhash(const char *filename) -{ - static const char *hexalph = "0123456789ABCDEF"; - char *buf; - int i, k; - - buf = checkp(malloc(33)); - for (i = 0; i < MIN(32, strlen(filename)); i++) { - unsigned char v = 0; - for (k = i; k < strlen(filename); k += 32) - v ^= filename[k]; - buf[i*2+0] = hexalph[(v >> 0) & 0x0f]; - buf[i*2+1] = hexalph[(v >> 4) & 0x0f]; - } - - if (i == 0) { - memset(buf, '0', 32); - } else if (i < 32) { - for (k = 0; k < 32; k++) - buf[k] = buf[k % i]; - } - - buf[32] = '\0'; - - return buf; -} - void dump(const char *filename) { @@ -142,15 +67,15 @@ void search_cmd(char *arg) { char *end, *resultfile = NULL; - char *hash; + const char *hash; struct dirent *de; int i, which; DIR *d = NULL; - if (!lastrun) - hash = strhash(ask("What is the model name?\n")); + if (lastrun.valid) + hash = lastrun.namehash; else - hash = checkp(strdup(lastrun->namehash)); + hash = mhash(ask("What is the model name?\n"), -1); d = opendir("scans"); if (!d) return; @@ -207,13 +132,13 @@ submit_cmd(char *arg) } printf("Ok! Im listening..\n"); - contents = checkp(malloc(len)); + contents = checkp(malloc(len + 1)); fread(contents, 1, len, stdin); + contents[len] = '\0'; - if (lastrun) free_parseinfo(lastrun); - lastrun = parse_file(contents, len); + lastrun.valid = parse_file(&lastrun, contents, len); - dump(lastrun->infopath); + if (lastrun.valid) dump(lastrun.infopath); free(contents); } |
