diff --git a/src/error.h b/src/error.h index 822f092..a2a98e0 100644 --- a/src/error.h +++ b/src/error.h @@ -4,12 +4,15 @@ #include "global.h" /* Common errors */ -#define FOUG_DATAX_NO_ERROR 0 -#define FOUG_DATAX_NULL_TRANSFER_ERROR -1 -#define FOUG_DATAX_NULL_BUFFER_ERROR -2 -#define FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR -3 -#define FOUG_DATAX_STREAM_ERROR -4 -#define FOUG_DATAX_TASK_STOPPED_ERROR -5 +typedef enum +{ + FOUG_DATAX_NO_ERROR = 0, + FOUG_DATAX_NULL_TRANSFER_ERROR = -1, + FOUG_DATAX_NULL_BUFFER_ERROR = -2, + FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR = -3, + FOUG_DATAX_STREAM_ERROR = -4, + FOUG_DATAX_TASK_STOPPED_ERROR = -5 +} foug_datax_error_t; FOUG_LIB_EXPORT foug_bool_t foug_datax_no_error(int code); FOUG_LIB_EXPORT foug_bool_t foug_datax_error(int code); diff --git a/src/global.h b/src/global.h index de620d5..e74b5e1 100644 --- a/src/global.h +++ b/src/global.h @@ -50,6 +50,11 @@ typedef unsigned long long uint64_t; typedef int foug_bool_t; typedef float foug_real32_t; typedef double foug_real64_t; +enum foug_bool_value +{ + FOUG_FALSE = 0, + FOUG_TRUE = 1 +}; #ifndef FOUG_INLINE # if defined(__GNUC__) diff --git a/src/internal/libstl/stl_rw_common.c b/src/internal/libstl/stl_rw_common.c new file mode 100644 index 0000000..d6a81dd --- /dev/null +++ b/src/internal/libstl/stl_rw_common.c @@ -0,0 +1,45 @@ +#include "stl_rw_common.h" + +#include "../../error.h" +#include "../../libstl/stl_error.h" + +foug_bool_t foug_check_transfer(int *error, const foug_transfer_t* trsf) +{ + if (trsf == NULL) { + *error = FOUG_DATAX_NULL_TRANSFER_ERROR; + } + else { + if (trsf->buffer == NULL) + *error = FOUG_DATAX_NULL_BUFFER_ERROR; + else if (trsf->buffer_size == 0) + *error = FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; + } + + return foug_datax_no_error(*error); +} + +foug_bool_t foug_stl_check_geom(int *error, const foug_stl_geom_t* geom) +{ + if (geom == NULL + || (geom->triangle_count > 0 && geom->get_triangle_func == NULL)) + { + *error = FOUG_STL_WRITE_NULL_GET_TRIANGLE_FUNC_ERROR; + } + + return foug_datax_no_error(*error); +} + +foug_bool_t foug_stlb_check_params(int *error, + const foug_transfer_t *trsf, + foug_endianness_t byte_order) +{ + if (!foug_check_transfer(error, trsf)) + return FOUG_FALSE; + + if (trsf->buffer_size < FOUG_STLB_MIN_CONTENTS_SIZE) + *error = FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; + if (byte_order != FOUG_LITTLE_ENDIAN && byte_order != FOUG_BIG_ENDIAN) + *error = FOUG_STLB_UNSUPPORTED_BYTE_ORDER_ERROR; + + return foug_datax_no_error(*error); +} diff --git a/src/internal/libstl/stl_rw_common.h b/src/internal/libstl/stl_rw_common.h new file mode 100644 index 0000000..384066d --- /dev/null +++ b/src/internal/libstl/stl_rw_common.h @@ -0,0 +1,25 @@ +#ifndef FOUG_INTERNAL_STL_RW_COMMON_H +#define FOUG_INTERNAL_STL_RW_COMMON_H + +#include "../../global.h" +#include "../../endian.h" +#include "../../transfer.h" +#include "../../libstl/stl_geom.h" +#include "../../libstl/stl_triangle.h" + +typedef struct +{ + uint32_t facet_count; + uint32_t i_facet_offset; + void (*fix_endian_func)(foug_stl_triangle_t*); +} foug_stlb_readwrite_helper; + +foug_bool_t foug_check_transfer(int* error, const foug_transfer_t* trsf); + +foug_bool_t foug_stl_check_geom(int* error, const foug_stl_geom_t* geom); + +foug_bool_t foug_stlb_check_params(int* error, + const foug_transfer_t* trsf, + foug_endianness_t byte_order); + +#endif /* FOUG_INTERNAL_STLB_RW_COMMON_H */ diff --git a/src/internal/libstl/stlb_rw_common.c b/src/internal/libstl/stlb_rw_common.c deleted file mode 100644 index 78bbf45..0000000 --- a/src/internal/libstl/stlb_rw_common.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "stlb_rw_common.h" - -#include "../../error.h" -#include "../../libstl/stl_error.h" - -int foug_stlb_check_params(const foug_transfer_t *trsf, - foug_endianness_t byte_order) -{ - if (trsf == NULL) - return FOUG_DATAX_NULL_TRANSFER_ERROR; - if (trsf->buffer == NULL) - return FOUG_DATAX_NULL_BUFFER_ERROR; - if (trsf->buffer_size < FOUG_STLB_MIN_CONTENTS_SIZE) - return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; - if (byte_order != FOUG_LITTLE_ENDIAN && byte_order != FOUG_BIG_ENDIAN) - return FOUG_STLB_READWRITE_UNSUPPORTED_BYTE_ORDER; - - return FOUG_DATAX_NO_ERROR; -} diff --git a/src/internal/libstl/stlb_rw_common.h b/src/internal/libstl/stlb_rw_common.h deleted file mode 100644 index 458bbe6..0000000 --- a/src/internal/libstl/stlb_rw_common.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef FOUG_INTERNAL_STLB_RW_COMMON_H -#define FOUG_INTERNAL_STLB_RW_COMMON_H - -#include "../../global.h" -#include "../../endian.h" -#include "../../transfer.h" -#include "../../libstl/stl_triangle.h" - -typedef struct -{ - uint32_t facet_count; - uint32_t i_facet_offset; - void (*fix_endian_func)(foug_stl_triangle_t*); -} foug_readwrite_helper; - -int foug_stlb_check_params(const foug_transfer_t* trsf, - foug_endianness_t byte_order); - -#endif /* FOUG_INTERNAL_STLB_RW_COMMON_H */ diff --git a/src/libstl/stl_error.h b/src/libstl/stl_error.h index 2d55653..46842f1 100644 --- a/src/libstl/stl_error.h +++ b/src/libstl/stl_error.h @@ -1,24 +1,19 @@ #ifndef FOUG_LIBSTL_STL_ERROR_H #define FOUG_LIBSTL_STL_ERROR_H -#define FOUG_STL_ERROR_TAG 0x11000000 +#define FOUG_STL_ERROR_TAG 0x11000000 +typedef enum +{ + FOUG_STL_WRITE_NULL_GET_TRIANGLE_FUNC_ERROR = FOUG_STL_ERROR_TAG + 1, -/* Specific error codes returned by foug_stla_read() */ -#define FOUG_STLA_READ_PARSE_ERROR (FOUG_STL_ERROR_TAG + 1) + /* Specific error codes returned by STL_ascii read function */ + FOUG_STLA_READ_PARSE_ERROR = FOUG_STL_ERROR_TAG + 100, + FOUG_STLA_WRITE_INVALID_REAL32_PREC_ERROR = FOUG_STL_ERROR_TAG + 101, -/* Specific error codes returned by foug_stla_write() */ -#define FOUG_STLA_WRITE_NULL_GET_TRIANGLE_FUNC (FOUG_STL_ERROR_TAG + 100) -#define FOUG_STLA_WRITE_INVALID_REAL32_PRECISION (FOUG_STL_ERROR_TAG + 101) - -/* Specific error code common to foug_stlb_read() and foug_stlb_write() */ -#define FOUG_STLB_READWRITE_UNSUPPORTED_BYTE_ORDER (FOUG_STL_ERROR_TAG + 200) - -/* Specific error codes returned by foug_stlb_read() */ -#define FOUG_STLB_READ_HEADER_WRONG_SIZE_ERROR (FOUG_STL_ERROR_TAG + 300) -#define FOUG_STLB_READ_FACET_COUNT_ERROR (FOUG_STL_ERROR_TAG + 301) -#define FOUG_STLB_READ_UNSUPPORTED_BYTE_ORDER (FOUG_STL_ERROR_TAG + 302) - -/* Specific error codes returned by foug_stlb_write() */ -#define FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC (FOUG_STL_ERROR_TAG + 400) + /* Specific error codes returned by STL_binary read/write functions */ + FOUG_STLB_UNSUPPORTED_BYTE_ORDER_ERROR = FOUG_STL_ERROR_TAG + 300, + FOUG_STLB_READ_HEADER_WRONG_SIZE_ERROR = FOUG_STL_ERROR_TAG + 301, + FOUG_STLB_READ_FACET_COUNT_ERROR = FOUG_STL_ERROR_TAG + 302 +} foug_stl_rw_error_t; #endif /* FOUG_LIBSTL_STL_ERROR_H */ diff --git a/src/libstl/stla_read.c b/src/libstl/stla_read.c index 2576911..f72c477 100644 --- a/src/libstl/stla_read.c +++ b/src/libstl/stla_read.c @@ -1,6 +1,7 @@ #include "stla_read.h" #include "../internal/ascii_parse.h" +#include "../internal/libstl/stl_rw_common.h" #include "../error.h" #include "stl_error.h" @@ -384,12 +385,11 @@ int foug_stla_read(foug_stl_geom_creator_t *creator, char fixed_buffer[FOUG_STLA_READ_STRING_BUFFER_LEN]; foug_stla_parse_data_t parse_data; - if (trsf == NULL) - return FOUG_DATAX_NULL_TRANSFER_ERROR; - if (trsf->buffer == NULL) - return FOUG_DATAX_NULL_BUFFER_ERROR; - if (trsf->buffer_size == 0) - return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; + { /* Check validity of input parameters */ + int error = FOUG_DATAX_NO_ERROR; + if (!foug_check_transfer(&error, trsf)) + return error; + } parse_data.token = unknown_token; parse_data.error = 0; diff --git a/src/libstl/stla_write.c b/src/libstl/stla_write.c index 49c17fe..12fac91 100644 --- a/src/libstl/stla_write.c +++ b/src/libstl/stla_write.c @@ -1,6 +1,7 @@ #include "stla_write.h" #include "../error.h" +#include "../internal/libstl/stl_rw_common.h" #include "stl_error.h" #include @@ -124,16 +125,17 @@ int foug_stla_write(foug_stl_geom_t* geom, char coords_format[64]; int error = FOUG_DATAX_NO_ERROR; + /* Check validity of input parameters */ + foug_check_transfer(&error, trsf); + foug_stl_check_geom(&error, geom); if (real32_prec == 0 || real32_prec > 9) - return FOUG_STLA_WRITE_INVALID_REAL32_PRECISION; - if (buffer_iterator == NULL) - return FOUG_DATAX_NULL_BUFFER_ERROR; + error = FOUG_STLA_WRITE_INVALID_REAL32_PREC_ERROR; if (trsf->buffer_size < FOUG_STLA_FACET_SIZE_P2) - return FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; - if (geom->get_triangle_func == NULL) - return FOUG_STLA_WRITE_NULL_GET_TRIANGLE_FUNC; + error = FOUG_DATAX_INVALID_BUFFER_SIZE_ERROR; + if (foug_datax_error(error)) + return error; - { + { /* Create XYZ coords format string (for normal and vertex coords) */ char* coords_format_iterator = coords_format; coords_format_iterator = foug_write_stdio_format(coords_format_iterator, real32_prec); coords_format_iterator = foug_write_nspaces(coords_format_iterator, 2); diff --git a/src/libstl/stlb_read.c b/src/libstl/stlb_read.c index 656d91c..9cff934 100644 --- a/src/libstl/stlb_read.c +++ b/src/libstl/stlb_read.c @@ -6,8 +6,8 @@ #include "../internal/convert.h" #include "../internal/byte_swap.h" +#include "../internal/libstl/stl_rw_common.h" #include "../internal/libstl/stlb_byte_swap.h" -#include "../internal/libstl/stlb_rw_common.h" #include @@ -34,7 +34,7 @@ static void read_triangle_alignsafe(const uint8_t* buffer, foug_stl_triangle_t* static void foug_stlb_read_facets(foug_stl_geom_creator_t* creator, const uint8_t* buffer, - const foug_readwrite_helper* rparams) + const foug_stlb_readwrite_helper* rparams) { const uint32_t facet_count = rparams->facet_count; const uint32_t i_facet_offset = rparams->i_facet_offset; @@ -67,18 +67,17 @@ int foug_stlb_read(foug_stl_geom_creator_t *creator, foug_endianness_t byte_order) { const foug_endianness_t host_byte_order = foug_host_endianness(); - foug_readwrite_helper rparams; + foug_stlb_readwrite_helper rparams; uint8_t header_data[FOUG_STLB_HEADER_SIZE]; uint32_t total_facet_count = 0; /* Count of facets as declared in the stream */ int error = FOUG_DATAX_NO_ERROR; /* Helper variable to store function result error code */ /* Check validity of input parameters */ - error = foug_stlb_check_params(trsf, byte_order); - if (foug_datax_error(error)) + if (!foug_stlb_check_params(&error, trsf, byte_order)) return error; /* Initialize rparams */ - memset(&rparams, 0, sizeof(foug_readwrite_helper)); + memset(&rparams, 0, sizeof(foug_stlb_readwrite_helper)); if (host_byte_order != byte_order) rparams.fix_endian_func = foug_stl_triangle_bswap; diff --git a/src/libstl/stlb_write.c b/src/libstl/stlb_write.c index 7253491..07cf0d1 100644 --- a/src/libstl/stlb_write.c +++ b/src/libstl/stlb_write.c @@ -5,8 +5,8 @@ #include "stl_error.h" #include "../internal/byte_codec.h" +#include "../internal/libstl/stl_rw_common.h" #include "../internal/libstl/stlb_byte_swap.h" -#include "../internal/libstl/stlb_rw_common.h" #include @@ -32,7 +32,7 @@ static void write_triangle_alignsafe(const foug_stl_triangle_t* triangle, uint8_ static void foug_stlb_write_facets(const foug_stl_geom_t* geom, uint8_t* buffer, - const foug_readwrite_helper* wparams) + const foug_stlb_readwrite_helper* wparams) { const uint32_t facet_count = wparams->facet_count; const uint32_t i_facet_offset = wparams->i_facet_offset; @@ -65,20 +65,19 @@ int foug_stlb_write(const foug_stl_geom_t *geom, const uint8_t *header_data, foug_endianness_t byte_order) { - foug_readwrite_helper wparams; + foug_stlb_readwrite_helper wparams; const uint32_t facet_count = geom != NULL ? geom->triangle_count : 0; uint32_t i_facet = 0; int error = FOUG_DATAX_NO_ERROR; /* Check validity of input parameters */ - error = foug_stlb_check_params(trsf, byte_order); + foug_stl_check_geom(&error, geom); + foug_stlb_check_params(&error, trsf, byte_order); if (foug_datax_error(error)) return error; - if (geom == NULL || geom->get_triangle_func == NULL) - return FOUG_STLB_WRITE_NULL_GET_TRIANGLE_FUNC; /* Initialize wparams */ - memset(&wparams, 0, sizeof(foug_readwrite_helper)); + memset(&wparams, 0, sizeof(foug_stlb_readwrite_helper)); if (foug_host_endianness() != byte_order) wparams.fix_endian_func = foug_stl_triangle_bswap; wparams.facet_count = trsf->buffer_size / FOUG_STLB_TRIANGLE_RAWSIZE;