commit 69757d03fa6ea40dd0fd419afb7506a57131406a
parent bdc6ea4e418cc394a990437e3d9ce4b7a8e31ba4
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Thu, 6 Oct 2022 17:30:28 +0200
Restructuring city parsing and adding a functor to init building data
Diffstat:
6 files changed, 113 insertions(+), 63 deletions(-)
diff --git a/src/cg_building.h b/src/cg_building.h
@@ -44,6 +44,7 @@ struct building {
void* data_cad;
/* functors depending model */
+ res_T (*init)(struct building* building);
res_T (*build_cad)(struct building* building);
res_T (*build_footprint)
(struct building* building,
diff --git a/src/cg_building_model0.c b/src/cg_building_model0.c
@@ -23,6 +23,7 @@
#define ERR(Expr) if((res = (Expr)) != RES_OK) goto error; else (void)0
+
static res_T
build_floor_footprint
(const struct pg_polygon* pg,
@@ -411,6 +412,36 @@ error:
goto exit;
}
+/*----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------*/
+
+res_T
+init_model0
+ (struct building* building)
+{
+ res_T res = RES_OK;
+ struct data_model0 data;
+
+ data.wall = 0.2;
+ data.floor = 0.3;
+ building->data = malloc(sizeof(struct data_model0));
+ if (!building->data) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ *(struct data_model0*)(building->data) = data;
+ building->build_cad = &build_cad_model0;
+ building->export_stl = &export_stl_model0;
+ building->release = &release_model0;
+ building->build_footprint = &build_footprint_model0;
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
res_T
build_cad_model0(struct building* building)
{
diff --git a/src/cg_building_model0.h b/src/cg_building_model0.h
@@ -41,6 +41,9 @@ struct data_cad_model0 {
};
res_T
+init_model0(struct building* building);
+
+res_T
build_cad_model0(struct building* building);
res_T
diff --git a/src/cg_city.c b/src/cg_city.c
@@ -30,49 +30,28 @@ res_T
city_init(struct logger* logger, struct city* city, struct args* args)
{
res_T res = RES_OK;
+ size_t i=0;
struct txtrdr* reader = NULL;
- char* line = NULL;
- struct building* building = NULL;
- struct building b;
- struct data_model0 data0;
ERR(txtrdr_file(NULL, str_cget(&args->city_model_file), '#', &reader));
-
- ERR(txtrdr_read_line(reader));
-parse:
- while (txtrdr_get_line(reader)){
- line = txtrdr_get_line(reader);
- ERR(strtolower(line, line));
- if (strcmp(line, "[building]") == 0) {
- ERR(parse_building(logger, reader, &b));
- b.model = MODEL0;
- b.data = malloc(sizeof(struct data_model0));
- data0.wall = 0.2;
- data0.floor = 0.3;
- *(struct data_model0*)(b.data) = data0;
- b.build_cad = &build_cad_model0;
- b.export_stl = &export_stl_model0;
- b.release = &release_model0;
- b.build_footprint = &build_footprint_model0;
- sa_push(city->building, b);
- goto parse;
- }
- if (strcmp(line, "[ground]") == 0) {
- ERR(parse_ground(logger, reader, &city->ground));
- goto parse;
- }
- ERR(txtrdr_read_line(reader));
- }
-
- city->n = sa_size(city->building);
+ ERR(parse_city(logger, reader, city));
+
+ for (i=0; i<city->n ; ++i) {
+ switch(city->building[i].model) {
+ case MODEL0:
+ city->building[i].init = &init_model0;
+ break;
+ default:
+ res = RES_BAD_ARG;
+ goto error;
+ }
+ ERR(city->building[i].init(&city->building[i]));
+ }
+
exit:
return res;
-
error:
- if (building[0].pg) free(building[0].pg);
- if (building[1].pg) free(building[1].pg);
- if (building) free(building);
goto exit;
}
diff --git a/src/cg_parsing.c b/src/cg_parsing.c
@@ -18,6 +18,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <rsys/cstr.h>
+#include <rsys/stretchy_array.h>
#include "cg_parsing.h"
@@ -47,7 +48,7 @@ remove_spaces(char *string)
return string;
}
-res_T
+static res_T
strtolower(const char * src, char* dst ) {
res_T res = RES_OK;
@@ -64,7 +65,7 @@ error:
goto exit;
}
-res_T
+static res_T
parse_ground
(struct logger* logger,
struct txtrdr* reader,
@@ -131,7 +132,7 @@ error:
}
-res_T
+static res_T
parse_building
(struct logger* logger,
struct txtrdr* reader,
@@ -188,22 +189,49 @@ parse_building
}
check:
-/* [>check depth<]*/
- /*if (ground->depth <= 0) {*/
- /*logger_print(logger, LOG_ERROR, */
- /*"[ground] depth value not valid: must be > 0.\n");*/
- /*res = RES_BAD_ARG;*/
- /*goto error;*/
- /*} */
-
- /*[>check extent<]*/
- /*if (ground->extent[0] >= ground->extent[1]*/
- /*|| ground->extent[2] >= ground->extent[3]) {*/
- /*logger_print(logger, LOG_ERROR, */
- /*"[ground] extent value not valid: xmax must be > xmin and ymax must be > ymin.\n");*/
- /*res = RES_BAD_ARG;*/
- /*goto error;*/
-/* }*/
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
+
+res_T
+parse_city
+ (struct logger* logger,
+ struct txtrdr* reader,
+ struct city* city)
+{
+ res_T res = RES_OK;
+ char* line = NULL;
+ struct building b;
+
+ ERR(txtrdr_read_line(reader));
+
+parse:
+ while (txtrdr_get_line(reader)){
+ line = txtrdr_get_line(reader);
+ ERR(strtolower(line, line));
+ if (strcmp(line, "[building]") == 0) {
+ ERR(parse_building(logger, reader, &b));
+ b.model = MODEL0;
+ sa_push(city->building, b);
+ goto parse;
+ }
+ if (strcmp(line, "[ground]") == 0) {
+ ERR(parse_ground(logger, reader, &city->ground));
+ goto parse;
+ }
+ if (strcmp(line, "[model]") == 0) {
+ /* TODO FINISH */
+ b.model = MODEL0;
+ goto parse;
+ }
+ ERR(txtrdr_read_line(reader));
+ }
+
+ city->n = sa_size(city->building);
exit:
diff --git a/src/cg_parsing.h b/src/cg_parsing.h
@@ -25,23 +25,31 @@
#include "cg_ground.h"
#include "cg_building.h"
+#include "cg_city.h"
#ifndef PARSING_H
#define PARSING_H
-res_T strtolower(const char * src, char* dst );
+/*res_T strtolower(const char * src, char* dst ); */
-res_T
-parse_ground
- (struct logger* logger,
- struct txtrdr* reader,
- struct ground* ground);
+/*res_T*/
+/*parse_ground*/
+ /*(struct logger* logger,*/
+ /*struct txtrdr* reader,*/
+ /*struct ground* ground);*/
+
+/*res_T*/
+/*parse_building*/
+ /*(struct logger* logger,*/
+ /*struct txtrdr* reader,*/
+ /*struct building* building);*/
res_T
-parse_building
+parse_city
(struct logger* logger,
struct txtrdr* reader,
- struct building* building);
+ struct city* city);
+
#endif /*PARSING_H*/