commit d47b34f20a96540fa15594a873a0531df5d661be
parent 121b413758f57dfa131a39d8a690c28c45c3edc9
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 11 Apr 2025 11:09:26 +0200
Add the filename member variable to the desc structure
This stores the name of the file from which the data has been loaded.
Update the load tests to check that the variable is defined correctly.
Diffstat:
5 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/src/sstl.c b/src/sstl.c
@@ -18,6 +18,7 @@
#include "sstl.h"
#include "sstl_c.h"
+#include <rsys/cstr.h>
#include <rsys/rsys.h>
#include <rsys/float3.h>
#include <rsys/stretchy_array.h>
@@ -123,6 +124,12 @@ load_stream
if(res != RES_OK) goto error;
}
+ if((res = str_set(&sstl->filename, name)) != RES_OK) {
+ ERROR(sstl, "Error copying file name '%s' -- %s\n",
+ name, res_to_cstr(res));
+ goto error;
+ }
+
switch(type) {
case SSTL_ASCII: res = load_stream_ascii(sstl, fp, name); break;
case SSTL_BINARY: res = load_stream_binary(sstl, fp, name); break;
@@ -169,6 +176,7 @@ sstl_release(ref_T* ref)
struct sstl* sstl;
ASSERT(ref);
sstl = CONTAINER_OF(ref, struct sstl, ref);
+ str_release(&sstl->filename);
str_release(&sstl->name);
htable_vertex_release(&sstl->vertex2id);
sa_release(sstl->vertices);
@@ -252,6 +260,7 @@ sstl_create
sstl->logger = logger;
sstl->verbose = verbose;
htable_vertex_init(allocator, &sstl->vertex2id);
+ str_init(allocator, &sstl->filename);
str_init(allocator, &sstl->name);
exit:
@@ -326,6 +335,7 @@ sstl_get_desc(struct sstl* sstl, struct sstl_desc* desc)
ASSERT(sa_size(sstl->normals) % 3 == 0);
ASSERT(sa_size(sstl->indices) % 3 == 0);
+ desc->filename = str_cget(&sstl->filename);
desc->solid_name = str_len(&sstl->name) ? str_cget(&sstl->name) : NULL;
desc->vertices_count = sa_size(sstl->vertices) / 3/*#coords*/;
desc->triangles_count = sa_size(sstl->indices) / 3/*#ids*/;
diff --git a/src/sstl.h b/src/sstl.h
@@ -45,6 +45,7 @@ enum sstl_read_type {
/* Descriptor of a loaded STL */
struct sstl_desc {
+ const char* filename;
const char* solid_name; /* May be NULL <=> no name */
enum sstl_read_type read_type; /* The type of the file */
diff --git a/src/sstl_c.h b/src/sstl_c.h
@@ -57,7 +57,7 @@ struct logger;
struct mem_allocator;
struct sstl {
- int verbose;
+ struct str filename;
struct str name;
enum sstl_read_type read_type;
@@ -70,6 +70,7 @@ struct sstl {
struct logger* logger;
struct mem_allocator* allocator;
+ int verbose;
ref_T ref;
};
diff --git a/src/test_sstl_load_ascii.c b/src/test_sstl_load_ascii.c
@@ -38,6 +38,7 @@ check_api(struct sstl* sstl)
#define CHECK_EMPTY_FILE { \
CHK(sstl_get_desc(sstl, &desc) == RES_OK); \
+ CHK(!strcmp(desc.filename, filename)); \
CHK(desc.read_type == SSTL_ASCII); \
CHK(desc.solid_name == NULL); \
CHK(desc.vertices_count == 0); \
@@ -95,6 +96,7 @@ check_no_triangle(struct sstl* sstl)
CHK(sstl_load_stream(sstl, fp, filename) == RES_OK);
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_ASCII);
+ CHK(!strcmp(desc.filename, filename));
CHK(!strcmp(desc.solid_name, "my_solid"));
CHK(desc.vertices_count == 0);
CHK(desc.triangles_count == 0);
@@ -130,6 +132,7 @@ check_1_triangle(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_ASCII);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
@@ -171,7 +174,8 @@ check_1_triangle_with_noise(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_ASCII);
- CHK(strcmp(desc.solid_name, "My Solid") == 0);
+ CHK(!strcmp(desc.filename, filename));
+ CHK(!strcmp(desc.solid_name, "My Solid"));
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
CHK(desc.indices[0] == 0);
@@ -209,6 +213,7 @@ check_1_triangle_no_normal(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_ASCII);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
@@ -352,6 +357,7 @@ check_tetrahedron(struct sstl* sstl)
"endsolid\n"
};
FILE* fp = NULL;
+ const char* filename = "Tetrahedron";
const size_t nlines = sizeof(tetrahedron)/sizeof(const char*);
struct sstl_desc desc = SSTL_DESC_NULL;
float v[3];
@@ -366,11 +372,12 @@ check_tetrahedron(struct sstl* sstl)
}
rewind(fp);
- CHK(sstl_load_stream_ascii(sstl, fp, "Tetrahedron") == RES_OK);
+ CHK(sstl_load_stream_ascii(sstl, fp, filename) == RES_OK);
CHK(fclose(fp) == 0);
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
- CHK(strcmp(desc.solid_name, "cube corner") == 0);
+ CHK(!strcmp(desc.filename, filename));
+ CHK(!strcmp(desc.solid_name, "cube corner"));
CHK(desc.read_type == SSTL_ASCII);
CHK(desc.vertices_count == 4);
CHK(desc.triangles_count == 4);
@@ -424,16 +431,18 @@ check_no_seekable_file(struct sstl* sstl)
struct sstl_desc desc = SSTL_DESC_NULL;
float v[3];
FILE* fp = NULL;
+ const char* filename = "Piped StL";
CHK(close(fd[1]) == 0); /* Clse the unused output stream */
CHK(fp = fdopen(fd[0], "r"));
- CHK(sstl_load_stream(sstl, fp, "Piped StL") == RES_BAD_ARG);
- CHK(sstl_load_stream_ascii(sstl, fp, "Piped StL") == RES_OK);
+ CHK(sstl_load_stream(sstl, fp, filename) == RES_BAD_ARG);
+ CHK(sstl_load_stream_ascii(sstl, fp, filename) == RES_OK);
CHK(fclose(fp) == 0);
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_ASCII);
- CHK(strcmp(desc.solid_name, "Triangle") == 0);
+ CHK(!strcmp(desc.filename, filename));
+ CHK(!strcmp(desc.solid_name, "Triangle"));
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
CHK(desc.indices[0] == 0);
diff --git a/src/test_sstl_load_binary.c b/src/test_sstl_load_binary.c
@@ -20,6 +20,7 @@
#include <rsys/float3.h>
#include <rsys/mem_allocator.h>
+#include <string.h>
#include <unistd.h> /* fork, pipe */
/*******************************************************************************
@@ -57,6 +58,7 @@ check_api(struct sstl* sstl)
CHK(sstl_load_binary(sstl, filename) == RES_OK);
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 0);
CHK(desc.triangles_count == 0);
@@ -64,6 +66,7 @@ check_api(struct sstl* sstl)
CHK(sstl_load_stream_binary(sstl, fp, filename) == RES_OK);
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 0);
CHK(desc.triangles_count == 0);
@@ -102,6 +105,7 @@ check_1_triangle(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
@@ -143,6 +147,7 @@ check_1_triangle_no_normal(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, filename));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
@@ -190,6 +195,7 @@ check_invalid_file(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, "Valid StL"));
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);
CHK(desc.indices[0] == 0);
@@ -301,6 +307,7 @@ check_tetrahedron(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, "Tetrahedron"));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 4);
CHK(desc.triangles_count == 4);
@@ -366,6 +373,7 @@ check_no_seekable_file(struct sstl* sstl)
CHK(sstl_get_desc(sstl, &desc) == RES_OK);
CHK(desc.read_type == SSTL_BINARY);
+ CHK(!strcmp(desc.filename, "Piped StL"));
CHK(desc.solid_name == NULL);
CHK(desc.vertices_count == 3);
CHK(desc.triangles_count == 1);