fixed a xli reader bug of not placing the comment text inside a proper list

This commit is contained in:
hyung-hwan 2013-07-02 13:10:11 +00:00
parent d2505bdbcd
commit 2bccba995c
2 changed files with 34 additions and 11 deletions

View File

@ -721,8 +721,6 @@ static int read_pair (qse_xli_t* xli)
{ {
xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR; xli->tok_status &= ~TOK_STATUS_ENABLE_NSTR;
if (get_token (xli) <= -1) goto oops;
/* insert a pair with an empty list */ /* insert a pair with an empty list */
pair = qse_xli_insertpairwithemptylist (xli, parlist, QSE_NULL, key, name); pair = qse_xli_insertpairwithemptylist (xli, parlist, QSE_NULL, key, name);
if (pair == QSE_NULL) goto oops; if (pair == QSE_NULL) goto oops;
@ -832,7 +830,10 @@ static int read_list (qse_xli_t* xli, qse_xli_list_t* parlist)
link = make_list_link (xli, parlist); link = make_list_link (xli, parlist);
if (link == QSE_NULL) return -1; if (link == QSE_NULL) return -1;
if (__read_list (xli) <= -1) /* get_token() here is to read the token after the left brace.
* it must be called after the xli->parlink has been updated
* in case there are comments at the beginning of the list */
if (get_token (xli) <= -1 || __read_list (xli) <= -1)
{ {
free_list_link (xli, link); free_list_link (xli, link);
return -1; return -1;

View File

@ -156,6 +156,32 @@ static int write_to_current_stream (qse_xli_t* xli, const qse_char_t* ptr, qse_s
return 0; return 0;
} }
static int write_indentation (qse_xli_t* xli, int depth)
{
static const qse_char_t tabs[16] =
{
QSE_T('\t'), QSE_T('\t'), QSE_T('\t'), QSE_T('\t'),
QSE_T('\t'), QSE_T('\t'), QSE_T('\t'), QSE_T('\t'),
QSE_T('\t'), QSE_T('\t'), QSE_T('\t'), QSE_T('\t'),
QSE_T('\t'), QSE_T('\t'), QSE_T('\t'), QSE_T('\t')
};
if (depth <= QSE_COUNTOF(tabs))
{
if (write_to_current_stream (xli, tabs, depth, 0) <= -1) return -1;
}
else
{
int i;
if (write_to_current_stream (xli, tabs, QSE_COUNTOF(tabs), 0) <= -1) return -1;
for (i = QSE_COUNTOF(tabs); i < depth; i++)
{
if (write_to_current_stream (xli, QSE_T("\t"), 1, 0) <= -1) return -1;
}
}
return 0;
}
static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth) static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth)
{ {
qse_xli_atom_t* curatom; qse_xli_atom_t* curatom;
@ -166,15 +192,10 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth)
{ {
case QSE_XLI_PAIR: case QSE_XLI_PAIR:
{ {
int i;
qse_xli_pair_t* pair = (qse_xli_pair_t*)curatom; qse_xli_pair_t* pair = (qse_xli_pair_t*)curatom;
for (i = 0; i < depth; i++) if (write_indentation (xli, depth) <= -1 ||
{ write_to_current_stream (xli, pair->key, qse_strlen(pair->key), 0) <= -1) return -1;
if (write_to_current_stream (xli, QSE_T("\t"), 1, 0) <= -1) return -1;
}
if (write_to_current_stream (xli, pair->key, qse_strlen(pair->key), 0) <= -1) return -1;
if (pair->alias) if (pair->alias)
{ {
@ -211,7 +232,8 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth)
case QSE_XLI_LIST: case QSE_XLI_LIST:
{ {
if (write_to_current_stream (xli, QSE_T(" {\n"), 3, 0) <= -1 || if (write_to_current_stream (xli, QSE_T(" {\n"), 3, 0) <= -1 ||
write_list (xli, (qse_xli_list_t*)pair->val, ++depth) <= -1 || write_list (xli, (qse_xli_list_t*)pair->val, depth + 1) <= -1 ||
write_indentation (xli, depth) <= -1 ||
write_to_current_stream (xli, QSE_T("}\n"), 2, 0) <= -1) return -1; write_to_current_stream (xli, QSE_T("}\n"), 2, 0) <= -1) return -1;
break; break;
} }