From 31f07a07caf6421cec82c844762b539b948d19ed Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 22 Feb 2016 17:14:47 +0100 Subject: [PATCH] gmio_stla: copy token string on next_token error --- src/gmio_stl/internal/stla_infos_get.c | 4 +- src/gmio_stl/internal/stla_parsing.h | 8 +++- src/gmio_stl/stla_read.c | 62 +++++++++++++++++--------- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/gmio_stl/internal/stla_infos_get.c b/src/gmio_stl/internal/stla_infos_get.c index a7dcb19..f011306 100644 --- a/src/gmio_stl/internal/stla_infos_get.c +++ b/src/gmio_stl/internal/stla_infos_get.c @@ -94,11 +94,10 @@ int gmio_stla_infos_get( if (flag_stla_solidname) { struct gmio_stla_parse_data parse_data = {0}; - const struct gmio_string* strbuff = &parse_data.strbuff; char fixed_buffer[GMIO_STLA_READ_STRING_MAX_LEN] = {0}; parse_data.strstream = sstream; - parse_data.strbuff = gmio_string(fixed_buffer, 0, sizeof(fixed_buffer)); + parse_data.token_str = gmio_string(fixed_buffer, 0, sizeof(fixed_buffer)); /* Skip "\s*solid" */ gmio_stringstream_skip_ascii_spaces(&parse_data.strstream); @@ -109,6 +108,7 @@ int gmio_stla_infos_get( /* Copy parsed solid name into infos->stla_solid_name */ { + const struct gmio_string* strbuff = &parse_data.token_str; const size_t name_len_for_cpy = GMIO_MIN(infos->stla_solidname_maxlen - 1, strbuff->len); diff --git a/src/gmio_stl/internal/stla_parsing.h b/src/gmio_stl/internal/stla_parsing.h index 0710d25..29f1072 100644 --- a/src/gmio_stl/internal/stla_parsing.h +++ b/src/gmio_stl/internal/stla_parsing.h @@ -55,11 +55,17 @@ struct gmio_stringstream_stla_cookie /* gmio_stla_parse_data */ struct gmio_stla_parse_data { + /* Current token type */ enum gmio_stla_token token; + /* Current token string */ + struct gmio_string token_str; + /* Any actual error ? */ bool error; + /* The stringstream object used to read the input stream */ struct gmio_stringstream strstream; + /* The cookie in strstream */ struct gmio_stringstream_stla_cookie strstream_cookie; - struct gmio_string strbuff; + /* The mesh creator callbacks */ struct gmio_stl_mesh_creator* creator; }; diff --git a/src/gmio_stl/stla_read.c b/src/gmio_stl/stla_read.c index 9ec3994..6745296 100644 --- a/src/gmio_stl/stla_read.c +++ b/src/gmio_stl/stla_read.c @@ -130,7 +130,7 @@ int gmio_stla_read( parse_data.strstream.func_stream_read_hook = gmio_stringstream_stla_read_hook; gmio_stringstream_init_pos(&parse_data.strstream); - parse_data.strbuff = gmio_string(fixed_buffer, 0, sizeof(fixed_buffer)); + parse_data.token_str = gmio_string(fixed_buffer, 0, sizeof(fixed_buffer)); parse_data.creator = &mesh_creator; @@ -351,11 +351,9 @@ void stla_error_msg(struct gmio_stla_parse_data* data, const char* msg) fprintf(stderr, "\n" "gmio_stla_read() parsing error: %s\n" - " current token: <%s>\n" " current token string: \"%s\"\n", msg, - stla_token_to_string(data->token), - data->strbuff.ptr); + data->token_str.ptr); data->error = true; data->token = unknown_token; } @@ -365,7 +363,7 @@ void stla_error_token_expected( { char msg[256] = {0}; sprintf(msg, - "token <%s> expected, got <%s>", + "expected <%s>, got <%s>", stla_token_to_string(token), stla_token_to_string(data->token)); stla_error_msg(data, msg); @@ -379,14 +377,14 @@ int gmio_stla_eat_next_token( struct gmio_stla_parse_data* data, enum gmio_stla_token expected_token) { - struct gmio_string* strbuff = &data->strbuff; + struct gmio_string* token_str = &data->token_str; enum gmio_eat_word_error eat_error; - strbuff->len = 0; - eat_error = gmio_stringstream_eat_word(&data->strstream, strbuff); + token_str->len = 0; + eat_error = gmio_stringstream_eat_word(&data->strstream, token_str); if (eat_error == GMIO_EAT_WORD_ERROR_OK) { const char* expected_token_str = stla_token_to_string(expected_token); - if (gmio_ascii_stricmp(strbuff->ptr, expected_token_str) == 0) { + if (gmio_ascii_stricmp(token_str->ptr, expected_token_str) == 0) { data->token = expected_token; return 0; } @@ -426,11 +424,35 @@ int gmio_stla_eat_next_token_inplace( { error = true; } - stream_char = gmio_stringstream_next_char(sstream); - ++expected_token_str; + else { + stream_char = gmio_stringstream_next_char(sstream); + ++expected_token_str; + } } if (error) { + /* Copy the wrong token in data->token_str */ + size_t i = 0; + /* -- Copy the matching part of the expected token */ + { + const char* it = stla_token_to_string(expected_token); + while (it != expected_token_str) + data->token_str.ptr[i++] = *(it++); + } + /* -- Copy the non matching part */ + while (i < data->token_str.max_len + && stream_char != NULL + && !gmio_ascii_isspace(*stream_char)) + { + data->token_str.ptr[i++] = *stream_char; + stream_char = gmio_stringstream_next_char(sstream); + } + /* -- Fill remaining space with NUL byte */ + memset(data->token_str.ptr + i, '\0', data->token_str.max_len - i); + data->token_str.len = i; + data->token = stla_find_token_from_string(&data->token_str); + + /* Notify error */ stla_error_token_expected(data, expected_token); return GMIO_STLA_PARSE_ERROR; } @@ -443,7 +465,7 @@ int gmio_stla_eat_until_token( { if (!stla_token_match_candidate(data->token, end_tokens)) { struct gmio_stringstream* sstream = &data->strstream; - struct gmio_string* strbuff = &data->strbuff; + struct gmio_string* strbuff = &data->token_str; bool end_token_found = false; do { @@ -493,9 +515,9 @@ bool stla_parsing_can_continue(const struct gmio_stla_parse_data* data) int gmio_stla_parse_solidname_beg(struct gmio_stla_parse_data* data) { if (gmio_stla_eat_next_token(data, unknown_token) == 0) { - data->token = stla_find_token_from_string(&data->strbuff); + data->token = stla_find_token_from_string(&data->token_str); if (data->token == FACET_token || data->token == ENDSOLID_token) { - gmio_string_clear(&data->strbuff); + gmio_string_clear(&data->token_str); return 0; } else { @@ -521,7 +543,7 @@ int parse_beginsolid(struct gmio_stla_parse_data* data) if (gmio_stla_parse_solidname_beg(data) == 0) { struct gmio_stl_mesh_creator_infos infos = {0}; infos.format = GMIO_STL_FORMAT_ASCII; - infos.stla_solid_name = data->strbuff.ptr; + infos.stla_solid_name = data->token_str.ptr; infos.stla_stream_size = data->strstream_cookie.stream_size; gmio_stl_mesh_creator_begin_solid(data->creator, &infos); return 0; @@ -572,7 +594,7 @@ int parse_xyz_coords(struct gmio_stla_parse_data* data, struct gmio_stl_coords* errc += !is_float_char(strbuff); coords->z = gmio_stringstream_parse_float32(sstream); - data->strbuff.len = 0; + data->token_str.len = 0; data->token = unknown_token; return errc; @@ -610,7 +632,7 @@ void parse_facets(struct gmio_stla_parse_data* data) const gmio_stl_mesh_creator_func_add_triangle_t func_add_triangle = data->creator->func_add_triangle; void* creator_cookie = data->creator->cookie; - struct gmio_string* strbuff = &data->strbuff; + struct gmio_string* token_str = &data->token_str; uint32_t i_facet = 0; struct gmio_stl_triangle facet; @@ -621,9 +643,9 @@ void parse_facets(struct gmio_stla_parse_data* data) if (func_add_triangle != NULL) func_add_triangle(creator_cookie, i_facet, &facet); /* Eat next unknown token */ - strbuff->len = 0; - gmio_stringstream_eat_word(&data->strstream, strbuff); - data->token = stla_find_token_from_string(strbuff); + token_str->len = 0; + gmio_stringstream_eat_word(&data->strstream, token_str); + data->token = stla_find_token_from_string(token_str); ++i_facet; } else {