commit afe7ab461f39b3be4609690866d2bccb40f4d922
parent fb07d7b9647fa30361039fea0260c373c57237e3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 4 Jun 2020 18:39:36 +0200
Remove a hack and add missing return codes checks
Diffstat:
4 files changed, 40 insertions(+), 130 deletions(-)
diff --git a/src/green-compute.c b/src/green-compute.c
@@ -120,21 +120,21 @@ build_green_table
name = get_description_name(desc);
if(DESC_IS_T(desc->type)) {
MK_VAR("%s.T");
- str_set(&green->table[i].end_name, buf);
+ ERR(str_set(&green->table[i].end_name, buf));
green->table[i].end_value = desc->d.t_boundary.imposed_temperature;
green->table[i].end_defined = 1;
INSERT(i, end);
}
else if(DESC_IS_H(desc->type)) {
MK_VAR("%s.T");
- str_set(&green->table[i].end_name, buf);
+ ERR(str_set(&green->table[i].end_name, buf));
green->table[i].end_value = desc->d.h_boundary.imposed_temperature;
green->table[i].end_defined = 1;
INSERT(i, end);
}
else if(DESC_IS_F(desc->type)) {
MK_VAR("%s.F");
- str_set(&green->table[i].other_name, buf);
+ ERR(str_set(&green->table[i].other_name, buf));
green->table[i].other_value = desc->d.f_boundary.imposed_flux;
green->table[i].other_defined = 1;
INSERT(i, other);
@@ -142,19 +142,19 @@ build_green_table
else if(DESC_IS_MEDIUM(desc->type)) {
if(desc->type == DESC_MAT_SOLID) {
MK_VAR("%s.T");
- str_set(&green->table[i].end_name, buf);
+ ERR(str_set(&green->table[i].end_name, buf));
green->table[i].end_value = desc->d.solid.imposed_temperature;
green->table[i].end_defined = 1;
if(green->table[i].end_value < 0) green->table[i].end_unknown = 1;
INSERT(i, end);
MK_VAR("%s.VP");
- str_set(&green->table[i].other_name, buf);
+ ERR(str_set(&green->table[i].other_name, buf));
green->table[i].other_value = desc->d.solid.vpower;
green->table[i].other_defined = 1;
INSERT(i, other);
} else {
MK_VAR("%s.T");
- str_set(&green->table[i].end_name, buf);
+ ERR(str_set(&green->table[i].end_name, buf));
green->table[i].end_value = desc->d.fluid.imposed_temperature;
green->table[i].end_defined = 1;
if(green->table[i].end_value < 0) green->table[i].end_unknown = 1;
@@ -169,7 +169,7 @@ build_green_table
/* Ambient ID is desc_count */
ambient_id = green->counts.desc_count;
desc = green->descriptions + ambient_id;
- str_set(&green->table[ambient_id].end_name, "AMBIENT");
+ ERR(str_set(&green->table[ambient_id].end_name, "AMBIENT"));
green->table[ambient_id].end_value = green->ambient_temp;
green->table[ambient_id].end_defined = 1;
INSERT(ambient_id, end);
@@ -246,27 +246,29 @@ green_compute_1
static res_T
parse_line
(const char* file_name,
- char* line,
+ const int64_t idx,
struct green* green,
struct applied_settings_elt* settings)
{
res_T res = RES_OK;
- struct str keep;
int name_count = 0;
struct str name;
- char* tk = NULL, * tok_ctx = NULL;
+ char* tk = NULL;
+ char* tok_ctx = NULL;
+ const struct str* keep_line = darray_str_cdata_get(&green->settings) + idx;
+ struct str line;
- ASSERT(file_name && line && green);
+ ASSERT(file_name && green);
- str_init(green->allocator, &keep);
+ str_init(green->allocator, &line);
str_init(green->allocator, &name);
- ERR(str_set(&keep, line));
+ ERR(str_set(&line, str_cget(keep_line)));
/* At least one name=value, no name without value */
for(;;) {
struct variable_data* vd;
- tk = strtok_r(name_count ? NULL : line, "=", &tok_ctx);
+ tk = strtok_r(name_count ? NULL : str_get(&line), "=", &tok_ctx);
if(tk) {
char* c;
c = tk + strlen(tk) - 1;
@@ -287,14 +289,14 @@ parse_line
}
else break;
}
- str_set(&name, tk);
+ ERR(str_set(&name, tk));
CHK_TOK(strtok_r(NULL, " \t", &tok_ctx), "value");
vd = htable_variable_ptr_find(&green->variable_ptrs, &name);
if(!vd || !vd->used) {
/* Name should exist */
if(!vd) {
logger_print(green->logger, LOG_ERROR,
- "Invalid data (unknown name: '%s')",
+ "Invalid variable name: '%s'\n",
str_cget(&name));
res = RES_BAD_ARG;
goto error;
@@ -302,20 +304,20 @@ parse_line
logger_print(green->logger, LOG_WARNING,
"Attempt to change unused variable '%s'\n", str_cget(&name));
logger_print(green->logger, LOG_WARNING, "In file '%s':\n", file_name);
- logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(&keep));
+ logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(keep_line));
}
ERR(cstr_to_double(tk, ((double*)settings) + vd->idx));
name_count++;
}
end:
- str_release(&keep);
+ str_release(&line);
str_release(&name);
return res;
error:
logger_print(green->logger, LOG_ERROR,
"Invalid line in file '%s':\n", file_name);
- logger_print(green->logger, LOG_ERROR, "%s\n", str_cget(&keep));
+ logger_print(green->logger, LOG_ERROR, "%s\n", str_cget(keep_line));
goto end;
}
@@ -330,7 +332,7 @@ green_compute
struct applied_settings_elt** settings = NULL;
ASSERT(green && in_name);
- sz = darray_line_size_get(&green->settings);
+ sz = darray_str_size_get(&green->settings);
ASSERT(sz < INT64_MAX);
settings = MEM_CALLOC(green->allocator, green->nthreads, sizeof(*settings));
@@ -342,7 +344,6 @@ green_compute
omp_set_num_threads((int)green->nthreads);
#pragma omp parallel for schedule(static)
for(i = 0; i < (int64_t)sz; i++) {
- char* line = darray_char_data_get(darray_line_data_get(&green->settings) + i);
struct result* result = darray_result_data_get(&green->results) + i;
res_T tmp_res = RES_OK;
int t = omp_get_thread_num();
@@ -361,12 +362,9 @@ green_compute
/* Apply settings */
applied_settings_set_defaults(green, settings[t]);
- tmp_res = parse_line(in_name, line, green, settings[t]);
+ tmp_res = parse_line(in_name, i, green, settings[t]);
if(tmp_res != RES_OK) {
res = tmp_res;
- logger_print(green->logger, LOG_ERROR,
- "Cannot parse settings line: %s\n",
- str_cget(&result->keep));
continue;
}
/* Compute */
diff --git a/src/green-input.c b/src/green-input.c
@@ -127,48 +127,6 @@ error:
goto end;
}
-
-/* BEGIN HACK */
-
-#include <rsys/ref_count.h>
-struct txtrdr {
- FILE* stream; /* Stream of the text to read */
- struct str name; /* Stream name */
- size_t nlines; /* # read lines */
- struct darray_char line; /* Buffer storing the read line */
-
- /* String of chars from which the remaining line chars are skipped */
- char reject[4];
-
- /* Boolean defining if the stream is internally managed or not, i.e. if it
- * has to be closed on text_reader release or not */
- int manage_stream;
-
- struct mem_allocator* allocator;
- ref_T ref;
-};
-
-static INLINE res_T
-txtrdr_copy_line_and_release
- (struct txtrdr* txtrdr,
- struct darray_char* line)
-{
- res_T res = RES_OK;
- ASSERT(txtrdr && line);
- ERR(darray_char_copy_and_release(line, &txtrdr->line));
- ERR(darray_char_resize(&txtrdr->line, 32));
-exit:
- return res;
-error:
- goto exit;
-}
-
-
-/* END HACK */
-
-
-
-
res_T
green_read_settings
(struct green* green,
@@ -181,7 +139,7 @@ green_read_settings
ASSERT(green && in_name);
stream = fopen(in_name, "r");
- if (!stream) {
+ if(!stream) {
logger_print(green->logger, LOG_ERROR,
"Cannot open model file '%s'\n",
in_name);
@@ -189,25 +147,24 @@ green_read_settings
goto error;
}
txtrdr_stream(green->allocator, stream, in_name, '#', &txtrdr);
- for (;;) {
+ for(;;) {
char* line;
size_t sz;
ERR(txtrdr_read_line(txtrdr));
line = txtrdr_get_line(txtrdr);
- if (!line) break;
- sz = darray_line_size_get(&green->settings);
- ERR(darray_line_resize(&green->settings, 1 + sz));
- ERR(darray_result_resize(&green->results, 1 + sz));
- ERR(txtrdr_copy_line_and_release(txtrdr,
- darray_line_data_get(&green->settings) + sz));
- str_set(&darray_result_data_get(&green->results)[sz].keep, line);
+ if(!line) break;
+ sz = darray_str_size_get(&green->settings);
+ ERR(darray_str_resize(&green->settings, 1 + sz));
+ ERR(str_set(darray_str_data_get(&green->settings) + sz, line));
}
+ ERR(darray_result_resize(&green->results,
+ darray_str_size_get(&green->settings)));
txtrdr_ref_put(txtrdr);
txtrdr = NULL;
exit:
- if (stream) fclose(stream);
- if (txtrdr) txtrdr_ref_put(txtrdr);
+ if(stream) fclose(stream);
+ if(txtrdr) txtrdr_ref_put(txtrdr);
return res;
error:
goto exit;
diff --git a/src/green-output.c b/src/green-output.c
@@ -106,13 +106,13 @@ green_print_result
size_t i, sz;
ASSERT(green && out_stream);
- sz = darray_line_size_get(&green->settings);
+ sz = darray_str_size_get(&green->settings);
for (i = 0; i < sz; i++) {
struct result* result = darray_result_data_get(&green->results) + i;
+ const char* line = str_cget(darray_str_data_get(&green->settings) + i);
if (mode & MODE_EXTENTED_RESULTS)
- fprintf(out_stream, "%g +/- %g ; %s\n", result->E, result->STD,
- str_cget(&result->keep));
+ fprintf(out_stream, "%g +/- %g ; %s\n", result->E, result->STD, line);
else fprintf(out_stream, "%g %g\n", result->E, result->STD);
}
}
diff --git a/src/green-types.h b/src/green-types.h
@@ -21,6 +21,7 @@
#include <rsys/hash_table.h>
#include <rsys/dynamic_array.h>
#include <rsys/dynamic_array_char.h>
+#include <rsys/dynamic_array_str.h>
#include <string.h>
#include <omp.h>
@@ -239,57 +240,12 @@ struct variable_data {
#define HTABLE_KEY_FUNCTOR_COPY_AND_RELEASE str_copy_and_release
#include <rsys/hash_table.h>
-#define DARRAY_NAME line
-#define DARRAY_DATA struct darray_char
-#define DARRAY_FUNCTOR_INIT darray_char_init
-#define DARRAY_FUNCTOR_RELEASE darray_char_release
-#define DARRAY_FUNCTOR_COPY darray_char_copy
-#define DARRAY_FUNCTOR_COPY_AND_RELEASE darray_char_copy_and_release
-#include <rsys/dynamic_array.h>
-
struct result {
double E, STD;
- struct str keep;
};
-static FINLINE void
-result_init(struct mem_allocator* alloc, struct result* data)
-{
- ASSERT(alloc && data);
- str_init(alloc, &data->keep);
-}
-
-static FINLINE void
-result_release(struct result* data)
-{
- ASSERT(data);
- str_release(&data->keep);
-}
-
-static FINLINE res_T
-result_copy(struct result* dst, struct result const* src)
-{
- ASSERT(dst && src);
- dst->E = src->E;
- dst->STD = src->STD;
- return str_copy(&dst->keep, &src->keep);
-}
-
-static FINLINE res_T
-result_copy_and_release(struct result* dst, struct result* src)
-{
- ASSERT(dst && src);
- dst->E = src->E;
- dst->STD = src->STD;
- return str_copy_and_release(&dst->keep, &src->keep);
-}
-
#define DARRAY_NAME result
#define DARRAY_DATA struct result
-#define DARRAY_FUNCTOR_INIT result_init
-#define DARRAY_FUNCTOR_RELEASE result_release
-#define DARRAY_FUNCTOR_COPY result_copy
-#define DARRAY_FUNCTOR_COPY_AND_RELEASE result_copy_and_release
#include <rsys/dynamic_array.h>
/*
@@ -307,7 +263,7 @@ struct green {
int references_checked, unused_variables, unknown_variables;
unsigned nthreads;
struct htable_variable_ptr variable_ptrs;
- struct darray_line settings;
+ struct darray_str settings;
struct darray_result results;
};
@@ -333,7 +289,7 @@ green_init
green->unknown_variables = 0;
green->nthreads = MMIN(nthreads, (unsigned)omp_get_num_procs());
htable_variable_ptr_init(alloc, &green->variable_ptrs);
- darray_line_init(alloc, &green->settings);
+ darray_str_init(alloc, &green->settings);
darray_result_init(alloc, &green->results);
}
@@ -354,7 +310,7 @@ green_release
MEM_RM(green->allocator, green->samples);
green->allocator = NULL;
htable_variable_ptr_release(&green->variable_ptrs);
- darray_line_release(&green->settings);
+ darray_str_release(&green->settings);
darray_result_release(&green->results);
}
@@ -368,7 +324,6 @@ green_read_settings
(struct green* green,
const char* in_name);
-
/*
* Different types of descriptions read from the binary file
*/