aboutsummaryrefslogtreecommitdiffstats
path: root/service/src/stlfile.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2021-06-24 21:23:02 +0200
committerLouis Burda <quent.burda@gmail.com>2021-06-24 21:23:02 +0200
commit14bc8a3883663656cd4254567a978002c062992d (patch)
tree66f2c72f026c0142d9f0e74d272af5ed4b4863bb /service/src/stlfile.c
parent5569ec2abd2c8f31554a02587fda842e4da7eba3 (diff)
downloadenowars5-service-stldoctor-14bc8a3883663656cd4254567a978002c062992d.tar.gz
enowars5-service-stldoctor-14bc8a3883663656cd4254567a978002c062992d.zip
refactored code for readability and keeping within 80ch limit, updated service source
Diffstat (limited to 'service/src/stlfile.c')
-rw-r--r--service/src/stlfile.c131
1 files changed, 85 insertions, 46 deletions
diff --git a/service/src/stlfile.c b/service/src/stlfile.c
index 7c21849..a6df33e 100644
--- a/service/src/stlfile.c
+++ b/service/src/stlfile.c
@@ -27,7 +27,8 @@ stack_push(struct stack *stack, int v)
{
if (stack->count == stack->cap) {
stack->cap *= 2;
- stack->data = checkp(realloc(stack->data, sizeof(int) * stack->cap));
+ stack->data = realloc(stack->data, sizeof(int) * stack->cap);
+ checkp(stack->data);
}
stack->data[stack->count] = v;
@@ -98,7 +99,6 @@ consume_keyword(char **start)
for (i = 0; i < ARRSIZE(kwmap); i++) {
len = strlen(kwmap[i].str);
if (!strncmp(kwmap[i].str, bp, len) && (!bp[len] || isws(bp[len]))) {
-
*start = bp + len + (bp[len] ? 1 : 0);
return kwmap[i].code;
}
@@ -107,9 +107,6 @@ consume_keyword(char **start)
return KW_UNKNOWN;
}
-#define PARSE_FAIL(...) \
- do { printf("FORMAT ERR: " __VA_ARGS__); goto fail; } while (0)
-
int
parse_file_ascii(struct parseinfo *info, char *buf, size_t len)
{
@@ -135,81 +132,113 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len)
switch (kw) {
case KW_SOLID_BEGIN:
stack_push(&states, STATE_SOLID);
- if (stack_ind(&states, KW_SOLID_BEGIN) != -1)
- PARSE_FAIL("Multiple nested solids!\n");
+ if (stack_ind(&states, KW_SOLID_BEGIN) != -1) {
+ FMT_ERR("Multiple nested solids!\n");
+ goto format_error;
+ }
tmp = bp;
- if (!consume_keyword(&bp) && (arg = consume_arg(&bp, &end))) {
+ if (!consume_keyword(&bp)
+ && (arg = consume_arg(&bp, &end))) {
info->solidname = strndup(arg, end - arg);
} else {
bp = tmp;
}
break;
case KW_SOLID_END:
- if ((kw = stack_pop(&states)) != STATE_SOLID)
- PARSE_FAIL("Improper nesting, parent: %s\n", kwmap[kw].str);
+ if ((kw = stack_pop(&states)) != STATE_SOLID) {
+ FMT_ERR("Improper nesting, parent: %s\n",
+ kwmap[kw].str);
+ goto format_error;
+ }
tmp = bp;
if (info->solidname && !consume_keyword(&bp)
&& (arg = consume_arg(&bp, &end))) {
- if (strncmp(info->solidname, arg, end - arg))
- PARSE_FAIL("Solid end/begin names do not match!\n");
+ if (strncmp(info->solidname, arg, end - arg)) {
+ FMT_ERR("Solid names do not match!\n");
+ goto format_error;
+ }
} else {
bp = tmp;
}
break;
case KW_LOOP_BEGIN:
stack_push(&states, STATE_LOOP);
- if (stack_ind(&states, KW_LOOP_BEGIN) != -1)
- PARSE_FAIL("Multiple nested loops!\n");
+ if (stack_ind(&states, KW_LOOP_BEGIN) != -1) {
+ FMT_ERR("Multiple nested loops!\n");
+ goto format_error;
+ }
break;
case KW_LOOP_END:
- if ((kw = stack_pop(&states)) != STATE_LOOP)
- PARSE_FAIL("Improper nesting, parent: %s\n", kwmap[kw].str);
+ if ((kw = stack_pop(&states)) != STATE_LOOP) {
+ FMT_ERR("Improper nesting, parent: %s\n",
+ kwmap[kw].str);
+ goto format_error;
+ }
info->loopcount++;
break;
case KW_FACET_BEGIN:
stack_push(&states, STATE_FACET);
- if (stack_ind(&states, KW_LOOP_BEGIN) != -1)
- PARSE_FAIL("Multiple nested facets!\n");
+ if (stack_ind(&states, KW_LOOP_BEGIN) != -1) {
+ FMT_ERR("Multiple nested facets!\n");
+ goto format_error;
+ }
for (i = 0; i < 3; i++) {
- if (!(arg = consume_arg(&bp, &end)))
- PARSE_FAIL("Facet with less than 3 args!\n");
+ if (!(arg = consume_arg(&bp, &end))) {
+ FMT_ERR("Facet with < 3 args!\n");
+ goto format_error;
+ }
farg = strtof(arg, &tmp);
- if (!isws(*tmp))
- PARSE_FAIL("Facet with invalid arg '%s'!\n", arg);
+ if (!isws(*tmp)) {
+ FMT_ERR("Facet arg '%s'\n", arg);
+ goto format_error;
+ }
}
break;
case KW_FACET_END:
- if ((kw = stack_pop(&states)) != STATE_FACET)
- PARSE_FAIL("Improper nesting, parent: %s\n", kwmap[kw].str);
+ if ((kw = stack_pop(&states)) != STATE_FACET) {
+ FMT_ERR("Improper nesting, parent: %s\n",
+ kwmap[kw].str);
+ goto format_error;
+ }
break;
case KW_VERTEX:
for (i = 0; i < 3; i++) {
- if (!(arg = consume_arg(&bp, &end)))
- PARSE_FAIL("Vertex with less than 3 args!\n");
+ if (!(arg = consume_arg(&bp, &end))) {
+ FMT_ERR("Vertex with < 3 args\n");
+ goto format_error;
+ }
farg = strtof(arg, &tmp);
- if (!isws(*tmp))
- PARSE_FAIL("Vertex with invalid arg '%s'!\n", arg);
+ if (!isws(*tmp)) {
+ FMT_ERR("Vertex arg '%s'\n", arg);
+ goto format_error;
+ }
info->bbmin[i] = MIN(info->bbmin[i], farg);
info->bbmax[i] = MAX(info->bbmax[i], farg);
}
break;
case KW_UNKNOWN:
prev = skipws(prev);
- PARSE_FAIL("Expected keyword, got:\n%.*s...\n", 30, prev);
+ FMT_ERR("Expected keyword, got:\n%.*s...\n", 30, prev);
+ goto format_error;
}
prev = bp;
}
- if (states.count)
- PARSE_FAIL("Expected keyword, got:\n%.*s...\n", 30, bp);
+ if (states.count) {
+ FMT_ERR("Expected keyword, got:\n%.*s...\n", 30, bp);
+ goto format_error;
+ }
bp = skipws(bp);
- if (*bp) PARSE_FAIL("Extraneous data at end of file\n");
+ if (*bp) {
+ FMT_ERR("Extraneous data at end of file\n");
+ goto format_error;
+ }
stack_free(&states);
return OK;
-fail:
+format_error:
stack_free(&states);
return FAIL;
}
@@ -223,8 +252,10 @@ parse_file_bin(struct parseinfo *info, char *buf, size_t len)
info->type = TYPE_BIN;
- if (len < 84)
- PARSE_FAIL("Truncated data! (header missing)\n");
+ if (len < 84) {
+ FMT_ERR("Truncated data! (header missing)\n");
+ goto fail;
+ }
memcpy(info->header, buf, 80);
@@ -248,12 +279,16 @@ parse_file_bin(struct parseinfo *info, char *buf, size_t len)
}
for (i = 0; i < info->loopcount; i++) {
- if (bp + 50 > end)
- PARSE_FAIL("Truncated data! (loops missing)\n");
+ if (bp + 50 > end) {
+ FMT_ERR("Truncated data! (loops missing)\n");
+ goto fail;
+ }
for (k = 0; k < 12; k++, bp += 4) {
v = fle32toh(*(float*)bp);
- if (v == INFINITY || v == NAN)
- PARSE_FAIL("Encountered invalid float\n");
+ if (v == INFINITY || v == NAN) {
+ FMT_ERR("Encountered invalid float\n");
+ goto fail;
+ }
if (k >= 3) {
info->bbmin[k % 3] = MIN(info->bbmin[k % 3], v);
info->bbmax[k % 3] = MAX(info->bbmax[k % 3], v);
@@ -262,11 +297,15 @@ parse_file_bin(struct parseinfo *info, char *buf, size_t len)
bp += 2;
}
- if (bp != end) PARSE_FAIL("Extraneous data at end of file\n");
+ if (bp != end) {
+ FMT_ERR("Extraneous data at end of file\n");
+ goto fail;
+ }
return OK;
fail:
+ NFREE(info->solidname);
return FAIL;
}
@@ -277,10 +316,10 @@ parse_file(struct parseinfo *info, char *buf, size_t len)
const char *resp;
char *bp;
- if (info->valid) free_info(info);
+ free_info(info);
if (len < 10) {
- printf("ERR: File too small!\n");
+ ERR("File too small!\n");
return FAIL;
}
@@ -297,7 +336,7 @@ parse_file(struct parseinfo *info, char *buf, size_t len)
if (!info->modelname) {
resp = ask("Please enter your model name: ");
if (strlen(resp) < 4) {
- printf("ERR: Model name is too short!\n");
+ ERR("Model name is too short!\n");
return FAIL;
}
info->modelname = checkp(strdup(resp));
@@ -403,9 +442,9 @@ print_info(struct parseinfo *info)
void
free_info(struct parseinfo *info)
{
- NULLFREE(info->hash);
- NULLFREE(info->modelname);
- NULLFREE(info->solidname);
+ NFREE(info->hash);
+ NFREE(info->modelname);
+ NFREE(info->solidname);
info->valid = 0;
}