diff options
Diffstat (limited to 'service/src/stlfile.c')
| -rw-r--r-- | service/src/stlfile.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/service/src/stlfile.c b/service/src/stlfile.c index a6df33e..8a4ba9a 100644 --- a/service/src/stlfile.c +++ b/service/src/stlfile.c @@ -134,7 +134,7 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) stack_push(&states, STATE_SOLID); if (stack_ind(&states, KW_SOLID_BEGIN) != -1) { FMT_ERR("Multiple nested solids!\n"); - goto format_error; + goto fail; } tmp = bp; if (!consume_keyword(&bp) @@ -148,14 +148,14 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) if ((kw = stack_pop(&states)) != STATE_SOLID) { FMT_ERR("Improper nesting, parent: %s\n", kwmap[kw].str); - goto format_error; + goto fail; } tmp = bp; if (info->solidname && !consume_keyword(&bp) && (arg = consume_arg(&bp, &end))) { if (strncmp(info->solidname, arg, end - arg)) { FMT_ERR("Solid names do not match!\n"); - goto format_error; + goto fail; } } else { bp = tmp; @@ -165,14 +165,14 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) stack_push(&states, STATE_LOOP); if (stack_ind(&states, KW_LOOP_BEGIN) != -1) { FMT_ERR("Multiple nested loops!\n"); - goto format_error; + goto fail; } break; case KW_LOOP_END: if ((kw = stack_pop(&states)) != STATE_LOOP) { FMT_ERR("Improper nesting, parent: %s\n", kwmap[kw].str); - goto format_error; + goto fail; } info->loopcount++; break; @@ -180,17 +180,17 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) stack_push(&states, STATE_FACET); if (stack_ind(&states, KW_LOOP_BEGIN) != -1) { FMT_ERR("Multiple nested facets!\n"); - goto format_error; + goto fail; } for (i = 0; i < 3; i++) { if (!(arg = consume_arg(&bp, &end))) { FMT_ERR("Facet with < 3 args!\n"); - goto format_error; + goto fail; } farg = strtof(arg, &tmp); if (!isws(*tmp)) { FMT_ERR("Facet arg '%s'\n", arg); - goto format_error; + goto fail; } } break; @@ -198,19 +198,19 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) if ((kw = stack_pop(&states)) != STATE_FACET) { FMT_ERR("Improper nesting, parent: %s\n", kwmap[kw].str); - goto format_error; + goto fail; } break; case KW_VERTEX: for (i = 0; i < 3; i++) { if (!(arg = consume_arg(&bp, &end))) { FMT_ERR("Vertex with < 3 args\n"); - goto format_error; + goto fail; } farg = strtof(arg, &tmp); if (!isws(*tmp)) { FMT_ERR("Vertex arg '%s'\n", arg); - goto format_error; + goto fail; } info->bbmin[i] = MIN(info->bbmin[i], farg); info->bbmax[i] = MAX(info->bbmax[i], farg); @@ -219,26 +219,26 @@ parse_file_ascii(struct parseinfo *info, char *buf, size_t len) case KW_UNKNOWN: prev = skipws(prev); FMT_ERR("Expected keyword, got:\n%.*s...\n", 30, prev); - goto format_error; + goto fail; } prev = bp; } if (states.count) { FMT_ERR("Expected keyword, got:\n%.*s...\n", 30, bp); - goto format_error; + goto fail; } bp = skipws(bp); if (*bp) { FMT_ERR("Extraneous data at end of file\n"); - goto format_error; + goto fail; } stack_free(&states); return OK; -format_error: +fail: stack_free(&states); return FAIL; } @@ -305,7 +305,7 @@ parse_file_bin(struct parseinfo *info, char *buf, size_t len) return OK; fail: - NFREE(info->solidname); + FREE(info->solidname); return FAIL; } @@ -316,7 +316,8 @@ parse_file(struct parseinfo *info, char *buf, size_t len) const char *resp; char *bp; - free_info(info); + if (info->valid) + free_info(info); if (len < 10) { ERR("File too small!\n"); @@ -331,8 +332,6 @@ parse_file(struct parseinfo *info, char *buf, size_t len) : parse_file_bin(info, buf, len); if (status == FAIL) return FAIL; - if (!info->solidname) info->solidname = checkp(strdup("")); - if (!info->modelname) { resp = ask("Please enter your model name: "); if (strlen(resp) < 4) { @@ -342,6 +341,8 @@ parse_file(struct parseinfo *info, char *buf, size_t len) info->modelname = checkp(strdup(resp)); } + if (!info->solidname) info->solidname = checkp(strdup("")); + info->hash = checkp(strdup(mhash(info->modelname, -1))); return OK; @@ -406,12 +407,9 @@ print_info(struct parseinfo *info) { int i, k; -#define FILTERCHAR(c) ((c) >= 32 ? (c) : ' ') - printf(" === Model info === \n"); printf(" File Size: %u\n", info->filesize); - if (info->type == TYPE_BIN) { printf(" Header:\n"); for (i = 0; i < 80; i += k) { @@ -420,11 +418,10 @@ print_info(struct parseinfo *info) printf(" %02x", (uint8_t) info->header[i+k]); printf(" | "); for (k = 0; k < MIN(80 - i, 20); k++) - printf("%c", FILTERCHAR(info->header[i+k])); + putchar(PRINTABLE(info->header[i+k])); printf("\n"); } } - printf(" Model ID: %s\n", info->hash); printf(" Model Name: %s\n", info->modelname); printf(" Solid Name: %s\n", info->solidname); @@ -442,9 +439,9 @@ print_info(struct parseinfo *info) void free_info(struct parseinfo *info) { - NFREE(info->hash); - NFREE(info->modelname); - NFREE(info->solidname); + FREE(info->hash); + FREE(info->modelname); + FREE(info->solidname); info->valid = 0; } |
