aboutsummaryrefslogtreecommitdiffstats
path: root/src/stlfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stlfile.c')
-rw-r--r--src/stlfile.c51
1 files changed, 24 insertions, 27 deletions
diff --git a/src/stlfile.c b/src/stlfile.c
index 5180ffc..953b5d7 100644
--- a/src/stlfile.c
+++ b/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");
@@ -332,8 +333,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) {
@@ -343,6 +342,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;
@@ -407,12 +408,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) {
@@ -421,11 +419,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);
@@ -443,9 +440,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;
}