aboutsummaryrefslogtreecommitdiffstats
path: root/service/src/printdoc.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2021-04-29 17:54:54 +0200
committerLouis Burda <quent.burda@gmail.com>2021-04-29 17:54:54 +0200
commita50aacd30adb87698eb775ef5c7615c65e57a11d (patch)
tree6088cc031eb204c7c1e75a49cf92aef003557433 /service/src/printdoc.c
parent008b5f74235a7fd04852e6f640429269f1ec4845 (diff)
downloadenowars5-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.c95
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);
}