added qse_xli_setpairwithstr() and qse_xli_deletepair()

This commit is contained in:
2015-09-02 08:43:43 +00:00
parent b4a08c4fee
commit dc43385559
10 changed files with 187 additions and 61 deletions

View File

@ -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 */

View File

@ -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

View File

@ -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)
{

View File

@ -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 */

View File

@ -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 */

View File

@ -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;