gmio_stla: copy token string on next_token error
This commit is contained in:
parent
706fc26b0e
commit
31f07a07ca
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user