added qse_xli_setpairwithstr() and qse_xli_deletepair()
This commit is contained in:
@ -5764,7 +5764,7 @@ static int get_string (
|
||||
|
||||
static int get_rexstr (qse_awk_t* awk, qse_awk_tok_t* tok)
|
||||
{
|
||||
if (awk->sio.last.c == QSE_T('/'))
|
||||
if (awk->sio.last.c == QSE_T('/'))
|
||||
{
|
||||
/* handle an empty regular expression.
|
||||
*
|
||||
@ -5778,17 +5778,17 @@ static int get_rexstr (qse_awk_t* awk, qse_awk_tok_t* tok)
|
||||
GET_CHAR (awk);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
qse_size_t preescaped = 0;
|
||||
if (awk->sio.last.c == QSE_T('\\'))
|
||||
{
|
||||
if (awk->sio.last.c == QSE_T('\\'))
|
||||
{
|
||||
/* for input like /\//, this condition is met.
|
||||
* the initial escape character is added when the
|
||||
* second charater is handled in get_string() */
|
||||
preescaped = 1;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
/* add other initial characters here as get_string()
|
||||
* begins with reading the next character */
|
||||
|
@ -28,20 +28,25 @@
|
||||
#include <qse/cmn/chr.h>
|
||||
|
||||
/*
|
||||
* It reads key-value pairs under sections as shown below:
|
||||
*
|
||||
* [SECTION1]
|
||||
* key1 = value1
|
||||
* key2 = value2
|
||||
* [SECTION2]
|
||||
* key1 = value1
|
||||
* --------------------------------
|
||||
*
|
||||
* The above can get translated to the native XLI format shown below:
|
||||
*
|
||||
* SECTION1 {
|
||||
* key1 = value1;
|
||||
* key2 = value2;
|
||||
* key1 = "value1";
|
||||
* key2 = "value2";
|
||||
* }
|
||||
* SECTION2 {
|
||||
* key1 = value1;
|
||||
* key1 = "value1";
|
||||
* }
|
||||
*
|
||||
* The ini-format reader doesn't support file inclusion via @include.
|
||||
*/
|
||||
|
||||
enum
|
||||
|
@ -633,7 +633,7 @@ int qse_xli_readinistd (qse_xli_t* xli, qse_xli_iostd_t* in)
|
||||
}
|
||||
|
||||
|
||||
int qse_xli_writestd (qse_xli_t* xli, qse_xli_iostd_t* out)
|
||||
int qse_xli_writestd (qse_xli_t* xli, qse_xli_list_t* root_list, qse_xli_iostd_t* out)
|
||||
{
|
||||
int n;
|
||||
xtn_t* xtn = (xtn_t*) QSE_XTN (xli);
|
||||
@ -648,7 +648,7 @@ int qse_xli_writestd (qse_xli_t* xli, qse_xli_iostd_t* out)
|
||||
}
|
||||
|
||||
xtn->s.out.x = out;
|
||||
n = qse_xli_write (xli, sf_out);
|
||||
n = qse_xli_write (xli, root_list, sf_out);
|
||||
|
||||
if (out->type == QSE_XLI_IOSTD_STR)
|
||||
{
|
||||
@ -663,7 +663,7 @@ int qse_xli_writestd (qse_xli_t* xli, qse_xli_iostd_t* out)
|
||||
return n;
|
||||
}
|
||||
|
||||
int qse_xli_writeinistd (qse_xli_t* xli, qse_xli_iostd_t* out)
|
||||
int qse_xli_writeinistd (qse_xli_t* xli, qse_xli_list_t* root_list, qse_xli_iostd_t* out)
|
||||
{
|
||||
int n;
|
||||
xtn_t* xtn = (xtn_t*) QSE_XTN (xli);
|
||||
@ -678,7 +678,7 @@ int qse_xli_writeinistd (qse_xli_t* xli, qse_xli_iostd_t* out)
|
||||
}
|
||||
|
||||
xtn->s.out.x = out;
|
||||
n = qse_xli_writeini (xli, sf_out);
|
||||
n = qse_xli_writeini (xli, root_list, sf_out);
|
||||
|
||||
if (out->type == QSE_XLI_IOSTD_STR)
|
||||
{
|
||||
|
@ -148,7 +148,7 @@ static int write_list (qse_xli_t* xli, qse_xli_list_t* list, int depth)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_xli_writeini (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
int qse_xli_writeini (qse_xli_t* xli, qse_xli_list_t* root_list, qse_xli_io_impl_t io)
|
||||
{
|
||||
int n;
|
||||
|
||||
@ -169,7 +169,7 @@ int qse_xli_writeini (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
if (qse_xli_openwstream (xli, QSE_NULL, 0) <= -1) return -1;
|
||||
|
||||
/* begin writing the root list */
|
||||
n = write_list (xli, &xli->root->list, 0);
|
||||
n = write_list (xli, (root_list? root_list: &xli->root->list), 0);
|
||||
|
||||
/* close all open streams. there should be only the
|
||||
* top-level stream here if there occurred no errors */
|
||||
|
@ -317,7 +317,7 @@ void qse_xli_clearwionames (qse_xli_t* xli)
|
||||
}
|
||||
}
|
||||
|
||||
int qse_xli_write (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
int qse_xli_write (qse_xli_t* xli, qse_xli_list_t* root_list, qse_xli_io_impl_t io)
|
||||
{
|
||||
int n;
|
||||
|
||||
@ -338,7 +338,7 @@ int qse_xli_write (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
if (qse_xli_openwstream (xli, QSE_NULL, 0) <= -1) return -1;
|
||||
|
||||
/* begin writing the root list */
|
||||
n = write_list (xli, &xli->root->list, 0);
|
||||
n = write_list (xli, (root_list? root_list: &xli->root->list), 0);
|
||||
|
||||
/* close all open streams. there should be only the
|
||||
* top-level stream here if there occurred no errors */
|
||||
|
@ -308,6 +308,37 @@ qse_xli_pair_t* qse_xli_insertpair (
|
||||
return insert_pair (xli, parent, peer, &k, ap, tp, value);
|
||||
}
|
||||
|
||||
void qse_xli_deletepair (qse_xli_t* xli, qse_xli_pair_t* pair)
|
||||
{
|
||||
qse_xli_list_t* list;
|
||||
|
||||
list = pair->super;
|
||||
|
||||
if (pair->prev)
|
||||
{
|
||||
pair->prev->next = pair->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
QSE_ASSERT (list->head == pair);
|
||||
list->head = pair->next;
|
||||
}
|
||||
|
||||
if (pair->next)
|
||||
{
|
||||
pair->next->prev = pair->prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
QSE_ASSERT (list->tail == pair);
|
||||
list->tail = pair->prev;
|
||||
}
|
||||
|
||||
free_val (xli->root, pair->val);
|
||||
QSE_MMGR_FREE (xli->mmgr, pair);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
qse_xli_pair_t* qse_xli_insertpairwithemptylist (
|
||||
qse_xli_t* xli, qse_xli_list_t* parent, qse_xli_atom_t* peer,
|
||||
const qse_char_t* key, const qse_char_t* alias, const qse_char_t* keytag)
|
||||
@ -351,7 +382,7 @@ qse_xli_pair_t* qse_xli_insertpairwithstr (
|
||||
qse_strcpy ((qse_char_t*)val->tag, strtag);
|
||||
}
|
||||
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, alias, keytag, (qse_xli_val_t*)val);
|
||||
tmp = qse_xli_insertpair (xli, parent, peer, key, alias, keytag, (qse_xli_val_t*)val);
|
||||
if (!tmp) qse_xli_freemem (xli, val);
|
||||
return tmp;
|
||||
}
|
||||
@ -788,6 +819,56 @@ noent:
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_xli_pair_t* qse_xli_setpairwithstr (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* fqpn, const qse_cstr_t* value, const qse_char_t* strtag)
|
||||
{
|
||||
qse_xli_pair_t* pair, * xpair;
|
||||
|
||||
pair = qse_xli_findpair (xli, list, fqpn);
|
||||
if (pair)
|
||||
{
|
||||
if (xli->opt.trait & QSE_XLI_VALIDATE)
|
||||
{
|
||||
qse_rbt_pair_t* scm_pair;
|
||||
const qse_xli_scm_t* scm;
|
||||
|
||||
scm_pair = qse_rbt_search (xli->schema, fqpn, qse_strlen(fqpn));
|
||||
if (!scm_pair)
|
||||
{
|
||||
qse_cstr_t key;
|
||||
|
||||
key.ptr = (qse_char_t*)fqpn;
|
||||
key.len = qse_strlen(fqpn);
|
||||
|
||||
qse_xli_seterror (xli, QSE_XLI_EUDKEY, &key, QSE_NULL);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
scm = (qse_xli_scm_t*)QSE_RBT_VPTR(scm_pair);
|
||||
|
||||
if (scm && !(scm->flags & QSE_XLI_SCM_VALSTR))
|
||||
{
|
||||
/* check the value type */
|
||||
qse_cstr_t key;
|
||||
|
||||
key.ptr = (qse_char_t*)fqpn;
|
||||
key.len = qse_strlen(fqpn);
|
||||
|
||||
qse_xli_seterror (xli, QSE_XLI_EILVAL, (const qse_cstr_t*)&key, QSE_NULL);
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
xpair = qse_xli_insertpairwithstr (xli, pair->super, (qse_xli_atom_t*)pair, pair->key, pair->alias, pair->tag, value, strtag);
|
||||
if (xpair) qse_xli_deletepair (xli, pair);
|
||||
return xpair;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: insert a new pair */
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
qse_size_t qse_xli_countpairs (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* fqpn)
|
||||
{
|
||||
|
||||
@ -881,7 +962,7 @@ qse_xli_str_t* qse_xli_addsegtostr (
|
||||
val->tag = val->ptr + val->len + 1;
|
||||
qse_strcpy ((qse_char_t*)val->tag, tag);
|
||||
}
|
||||
|
||||
|
||||
val->next = str->next;
|
||||
str->next = val;
|
||||
return str->next;
|
||||
|
Reference in New Issue
Block a user