From d8cb7f4ef10321283163e0ff44bfed29648eeb22 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 1 Jul 2013 09:26:39 +0000 Subject: [PATCH] fixed the xli writing bug of not writing multi-segment string properly and added qse_xli_clearwionames() --- qse/lib/xli/write.c | 54 ++++++++++++++++++++++++++++++++++++--------- qse/lib/xli/xli.c | 1 + qse/lib/xli/xli.h | 2 ++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/qse/lib/xli/write.c b/qse/lib/xli/write.c index 2d583c88..3f8f9a6b 100644 --- a/qse/lib/xli/write.c +++ b/qse/lib/xli/write.c @@ -60,20 +60,27 @@ static int open_new_stream (qse_xli_t* xli, const qse_char_t* path, int old_dept } else { + qse_link_t* link; qse_size_t plen; arg_data_t* arg_data; plen = qse_strlen (path); - arg = (qse_xli_io_arg_t*) qse_xli_callocmem (xli, - QSE_SIZEOF(*arg) + QSE_SIZEOF(*arg_data) + (plen + 1) * QSE_SIZEOF(*path)); + link = (qse_link_t*) qse_xli_callocmem (xli, + QSE_SIZEOF(*link) + QSE_SIZEOF(qse_char_t) * (plen + 1)); + if (link == QSE_NULL) return -1; + + qse_strcpy ((qse_char_t*)(link + 1), path); + link->link = xli->wio_names; + xli->wio_names = link; + + arg = (qse_xli_io_arg_t*) qse_xli_callocmem (xli, QSE_SIZEOF(*arg) + QSE_SIZEOF(*arg_data)); if (arg == QSE_NULL) return -1; arg_data = (arg_data_t*)(arg + 1); arg_data->org_depth = old_depth; - - qse_strcpy ((qse_char_t*)(arg_data + 1), path); - arg->name = (const qse_char_t*)(arg_data + 1); + + arg->name = (const qse_char_t*)(link + 1); arg->prev = xli->wio.inp; } @@ -82,7 +89,11 @@ static int open_new_stream (qse_xli_t* xli, const qse_char_t* path, int old_dept { if (xli->errnum == QSE_XLI_ENOERR) qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL); - if (arg != &xli->wio.top) qse_xli_freemem (xli, arg); + if (arg != &xli->wio.top) + { + qse_xli_freemem (xli, arg); + /* don't clean up 'link' since it's linked to xli->wio_names */ + } return -1; } @@ -182,16 +193,26 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth) case QSE_XLI_STR: { qse_xli_str_t* str = (qse_xli_str_t*)pair->val; - if (write_to_current_stream (xli, QSE_T(" = \""), 4, 0) <= -1 || - write_to_current_stream (xli, str->ptr, str->len, 1) <= -1 || - write_to_current_stream (xli, QSE_T("\";\n"), 3, 0) <= -1) return -1; + + if (write_to_current_stream (xli, QSE_T(" = "), 3, 0) <= -1) return -1; + while (1) + { + if (write_to_current_stream (xli, QSE_T("\""), 1, 0) <= -1 || + write_to_current_stream (xli, str->ptr, str->len, 1) <= -1 || + write_to_current_stream (xli, QSE_T("\""), 1, 0) <= -1) return -1; + if (!str->next) break; + + if (write_to_current_stream (xli, QSE_T(", "), 2, 0) <= -1) return -1; + str = str->next; + } + if (write_to_current_stream (xli, QSE_T(";\n"), 2, 0) <= -1) return -1; break; } case QSE_XLI_LIST: { if (write_to_current_stream (xli, QSE_T(" {\n"), 3, 0) <= -1 || - write_list (xli, pair->val, ++depth) <= -1 || + write_list (xli, (qse_xli_list_t*)pair->val, ++depth) <= -1 || write_to_current_stream (xli, QSE_T("}\n"), 2, 0) <= -1) return -1; break; } @@ -243,6 +264,17 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth) return 0; } +void qse_xli_clearwionames (qse_xli_t* xli) +{ + qse_link_t* cur; + while (xli->wio_names) + { + cur = xli->wio_names; + xli->wio_names = cur->link; + QSE_MMGR_FREE (xli->mmgr, cur); + } +} + int qse_xli_write (qse_xli_t* xli, qse_xli_io_impl_t io) { int n; @@ -256,7 +288,7 @@ int qse_xli_write (qse_xli_t* xli, qse_xli_io_impl_t io) QSE_MEMSET (&xli->wio, 0, QSE_SIZEOF(xli->wio)); xli->wio.impl = io; xli->wio.inp = &xli->wio.top; - /*qse_xli_clearwionames (xli);*/ + qse_xli_clearwionames (xli); /* open the top level stream */ if (open_new_stream (xli, QSE_NULL, 0) <= -1) return -1; diff --git a/qse/lib/xli/xli.c b/qse/lib/xli/xli.c index 1f8d4fee..8ce3ecf4 100644 --- a/qse/lib/xli/xli.c +++ b/qse/lib/xli/xli.c @@ -95,6 +95,7 @@ void qse_xli_fini (qse_xli_t* xli) } qse_xli_clearrionames (xli); + qse_xli_clearwionames (xli); } qse_mmgr_t* qse_xli_getmmgr (qse_xli_t* xli) diff --git a/qse/lib/xli/xli.h b/qse/lib/xli/xli.h index b6072cd2..37fc0e47 100644 --- a/qse/lib/xli/xli.h +++ b/qse/lib/xli/xli.h @@ -79,6 +79,7 @@ struct qse_xli_t qse_xli_io_arg_t top; /* for top level */ qse_xli_io_arg_t* inp; /* current */ } wio; + qse_link_t* wio_names; }; @@ -94,6 +95,7 @@ const qse_char_t* qse_xli_dflerrstr ( const qse_xli_t* xli, qse_xli_errnum_t errnum); void qse_xli_clearrionames (qse_xli_t* xli); +void qse_xli_clearwionames (qse_xli_t* xli); #if defined(__cplusplus) }