wrote some functions in SkvEnv using xli functions
This commit is contained in:
@ -16,8 +16,6 @@ libqsexli_la_LIBADD = -lqsesi -lqsecmn
|
||||
if ENABLE_CXX
|
||||
lib_LTLIBRARIES += libqsexlixx.la
|
||||
libqsexlixx_la_SOURCES = SkvEnv.cpp
|
||||
libqsexlixx_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
||||
libqsexlixx_la_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
||||
libqsexlixx_la_LIBADD = -lqsexli -lqsecmnxx -lqsexli -lqsesi -lqsecmn $(LIBADD_LIB_COMMON)
|
||||
libqsexlixx_la_LIBADD = -lqsecmnxx -lqsexli -lqsesi -lqsecmn
|
||||
endif
|
||||
|
||||
|
@ -147,12 +147,8 @@ libqsexli_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(libqsexli_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||
libqsexlixx_la_DEPENDENCIES =
|
||||
am__libqsexlixx_la_SOURCES_DIST = SkvEnv.cpp
|
||||
@ENABLE_CXX_TRUE@am_libqsexlixx_la_OBJECTS = libqsexlixx_la-SkvEnv.lo
|
||||
@ENABLE_CXX_TRUE@am_libqsexlixx_la_OBJECTS = SkvEnv.lo
|
||||
libqsexlixx_la_OBJECTS = $(am_libqsexlixx_la_OBJECTS)
|
||||
libqsexlixx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
|
||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
|
||||
$(AM_CXXFLAGS) $(CXXFLAGS) $(libqsexlixx_la_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
@ENABLE_CXX_TRUE@am_libqsexlixx_la_rpath = -rpath $(libdir)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
@ -414,9 +410,7 @@ libqsexli_la_SOURCES = xli.h xli.c err.c \
|
||||
libqsexli_la_LDFLAGS = -L../cmn -L../si -version-info 1:0:0 -no-undefined
|
||||
libqsexli_la_LIBADD = -lqsesi -lqsecmn
|
||||
@ENABLE_CXX_TRUE@libqsexlixx_la_SOURCES = SkvEnv.cpp
|
||||
@ENABLE_CXX_TRUE@libqsexlixx_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
||||
@ENABLE_CXX_TRUE@libqsexlixx_la_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
||||
@ENABLE_CXX_TRUE@libqsexlixx_la_LIBADD = -lqsexli -lqsecmnxx -lqsexli -lqsesi -lqsecmn $(LIBADD_LIB_COMMON)
|
||||
@ENABLE_CXX_TRUE@libqsexlixx_la_LIBADD = -lqsecmnxx -lqsexli -lqsesi -lqsecmn
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
@ -490,7 +484,7 @@ libqsexli.la: $(libqsexli_la_OBJECTS) $(libqsexli_la_DEPENDENCIES) $(EXTRA_libqs
|
||||
$(AM_V_CCLD)$(libqsexli_la_LINK) -rpath $(libdir) $(libqsexli_la_OBJECTS) $(libqsexli_la_LIBADD) $(LIBS)
|
||||
|
||||
libqsexlixx.la: $(libqsexlixx_la_OBJECTS) $(libqsexlixx_la_DEPENDENCIES) $(EXTRA_libqsexlixx_la_DEPENDENCIES)
|
||||
$(AM_V_CXXLD)$(libqsexlixx_la_LINK) $(am_libqsexlixx_la_rpath) $(libqsexlixx_la_OBJECTS) $(libqsexlixx_la_LIBADD) $(LIBS)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(am_libqsexlixx_la_rpath) $(libqsexlixx_la_OBJECTS) $(libqsexlixx_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
@ -498,8 +492,8 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SkvEnv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqsexlixx_la-SkvEnv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read-ini.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read-json.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@
|
||||
@ -551,13 +545,6 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
|
||||
|
||||
libqsexlixx_la-SkvEnv.lo: SkvEnv.cpp
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqsexlixx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libqsexlixx_la-SkvEnv.lo -MD -MP -MF $(DEPDIR)/libqsexlixx_la-SkvEnv.Tpo -c -o libqsexlixx_la-SkvEnv.lo `test -f 'SkvEnv.cpp' || echo '$(srcdir)/'`SkvEnv.cpp
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libqsexlixx_la-SkvEnv.Tpo $(DEPDIR)/libqsexlixx_la-SkvEnv.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SkvEnv.cpp' object='libqsexlixx_la-SkvEnv.lo' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libqsexlixx_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libqsexlixx_la-SkvEnv.lo `test -f 'SkvEnv.cpp' || echo '$(srcdir)/'`SkvEnv.cpp
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
|
@ -25,36 +25,126 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <qsep/xli/SkvEnv.hpp>
|
||||
|
||||
#include <qse/xli/SkvEnv.hpp>
|
||||
#include <qse/xli/stdxli.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include "../cmn/mem-prv.h"
|
||||
|
||||
#define SCTN_KEY_SPLITTER QSE_T('*')
|
||||
|
||||
QSE_BEGIN_NAMESPACE(QSE)
|
||||
|
||||
const qse_char_t* SkvEnv::setItemValue (const qse_char_t* name, const qse_char_t* val)
|
||||
static qse_char_t splitter[2] = { SCTN_KEY_SPLITTER, QSE_T('\0') };
|
||||
|
||||
SkvEnv::SkvEnv (Mmgr* mmgr): Mmged(mmgr), xli(QSE_NULL)
|
||||
{
|
||||
qse_char_t* sctn, * key;
|
||||
}
|
||||
|
||||
SkvEnv::~SkvEnv ()
|
||||
{
|
||||
if (this->xli) qse_xli_close (this->xli);
|
||||
}
|
||||
|
||||
int SkvEnv::addItem (const qse_char_t* name, const qse_char_t* dval, ProbeProc probe)
|
||||
{
|
||||
qse_char_t* sctn, * key;
|
||||
qse_size_t sctn_len, key_len;
|
||||
ItemList::Node* np;
|
||||
|
||||
if (this->split_name(name, &sctn, &sctn_len, &key, &key_len) == -1) return -1;
|
||||
|
||||
for (np = this->item_list.getHeadNode(); np; np = np->getNextNode())
|
||||
{
|
||||
Item& item = np->getValue();
|
||||
if (qse_strxcmp(sctn, sctn_len, item.sctn) == 0 &&
|
||||
qse_strxcmp(key, key_len, item.key) == 0) return -1;
|
||||
}
|
||||
|
||||
try { np = this->item_list.append (Item()); }
|
||||
catch (...) { return -1; }
|
||||
|
||||
Item& item = np->getValue();
|
||||
qse_strxncpy (item.sctn, QSE_COUNTOF(item.sctn), sctn, sctn_len);
|
||||
qse_strxncpy (item.key, QSE_COUNTOF(item.key), key, key_len);
|
||||
|
||||
qse_strxjoin (
|
||||
item.name, QSE_COUNTOF(item.name),
|
||||
item.sctn, splitter, item.key, QSE_NULL);
|
||||
qse_strxcpy (item.dval, QSE_COUNTOF(item.dval), dval);
|
||||
item.probe = probe;
|
||||
|
||||
// set its default value
|
||||
if (this->setValue(name, item.dval) <= -1)
|
||||
{
|
||||
this->item_list.remove (np);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SkvEnv::removeItem (const qse_char_t* name)
|
||||
{
|
||||
qse_char_t* sctn, * key;
|
||||
qse_size_t sctn_len, key_len;
|
||||
|
||||
if (this->split_name(name, &sctn, &sctn_len, &key, &key_len) == -1) return QSE_NULL;
|
||||
if (this->split_name (name, &sctn, &sctn_len, &key, &key_len) == -1) return -1;
|
||||
|
||||
for (ItemList::Node* np = item_list.head(); np; np = np->forward())
|
||||
for (ItemList::Node* np = item_list.getHeadNode(); np; np = np->getNextNode())
|
||||
{
|
||||
Item& item = np->value;
|
||||
if (qse_strxcmp(sctn, sctn_len, item.sctn) == 0 &&
|
||||
qse_strxcmp(key, key_len, item.key) == 0)
|
||||
{
|
||||
if ((this->*item.probe)(val) == -1) return QSE_NULL;
|
||||
this->setValue (item.sctn, item.key, val);
|
||||
return val;
|
||||
this->item_list.remove (np);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return QSE_NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
const qse_char_t* SkvEnv::getValue (const qse_char_t* name) const
|
||||
{
|
||||
if (!this->xli) return QSE_NULL;
|
||||
|
||||
qse_xli_pair_t* pair = qse_xli_findpair(this->xli, QSE_NULL, name);
|
||||
if (!pair) return QSE_NULL;
|
||||
|
||||
QSE_ASSERT (pair->val != QSE_NULL);
|
||||
QSE_ASSERT (pair->val->type == QSE_XLI_STR);
|
||||
|
||||
return (((qse_xli_str_t*)pair->val))->ptr;
|
||||
}
|
||||
|
||||
int SkvEnv::setValue (const qse_char_t* name, const qse_char_t* value)
|
||||
{
|
||||
qse_char_t* sctn, * key;
|
||||
qse_size_t sctn_len, key_len;
|
||||
|
||||
if (this->split_name(name, &sctn, &sctn_len, &key, &key_len) <= -1) return -1;
|
||||
|
||||
if (!this->xli)
|
||||
{
|
||||
this->xli = qse_xli_openstdwithmmgr(this->getMmgr(), 0, 0, QSE_NULL);
|
||||
if (!this->xli) return -1;
|
||||
qse_xli_setopt (this->xli, QSE_XLI_KEYSPLITTER, splitter);
|
||||
}
|
||||
|
||||
// find if the name is a registered item name.
|
||||
for (ItemList::Node* np = this->item_list.getHeadNode(); np; np = np->getNextNode())
|
||||
{
|
||||
Item& item = np->value;
|
||||
if (qse_strxcmp(sctn, sctn_len, item.sctn) == 0 &&
|
||||
qse_strxcmp(key, key_len, item.key) == 0)
|
||||
{
|
||||
// if it's the registered item name, change the value.
|
||||
return this->set_value_with_item (item, value);
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int SkvEnv::split_name (const qse_char_t* name, qse_char_t** sctn, qse_size_t* sctn_len, qse_char_t** key, qse_size_t* key_len)
|
||||
{
|
||||
@ -64,21 +154,106 @@ int SkvEnv::split_name (const qse_char_t* name, qse_char_t** sctn, qse_size_t* s
|
||||
QSE_ASSERT (key != QSE_NULL);
|
||||
QSE_ASSERT (key_len != QSE_NULL);
|
||||
|
||||
qse_char_t* s, * k, * p;
|
||||
qse_size_t sl, kl;
|
||||
qse_char_t* p;
|
||||
qse_cstr_t s, k;
|
||||
|
||||
qse_char_t spr[] = { SCTN_KEY_SPLITTER, QSE_CHAR('\0') };
|
||||
p = qse_strtok(name, spr, &s, &sl);
|
||||
if (!p || sl == 0) return -1;
|
||||
qse_strtok(p, QSE_NULL, &k, &kl);
|
||||
if (kl == 0) return -1;
|
||||
p = qse_strtok(name, splitter, &s);
|
||||
if (!p || s.len == 0) return -1;
|
||||
qse_strtok(p, QSE_NULL, &k);
|
||||
if (k.len == 0) return -1;
|
||||
|
||||
*sctn = s;
|
||||
*sctn_len = sl;
|
||||
*key = k;
|
||||
*key_len = kl;
|
||||
*sctn = s.ptr;
|
||||
*sctn_len = s.len;
|
||||
*key = k.ptr;
|
||||
*key_len = k.len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SkvEnv::set_value_with_item (Item& item, const qse_char_t* value)
|
||||
{
|
||||
if (item.probe && (this->*item.probe)(value) <= -1) return -1;
|
||||
|
||||
qse_cstr_t v = { (qse_char_t*)value, qse_strlen(value) };
|
||||
|
||||
qse_xli_pair_t* pair;
|
||||
pair = qse_xli_setpairwithstr(this->xli, QSE_NULL, item.name, &v, QSE_NULL);
|
||||
if (!pair)
|
||||
{
|
||||
if (qse_xli_geterrnum(this->xli) != QSE_XLI_ENOENT) return -1;
|
||||
|
||||
pair = qse_xli_findpair(this->xli, QSE_NULL, item.sctn);
|
||||
if (!pair)
|
||||
{
|
||||
pair = qse_xli_insertpairwithemptylist(this->xli, QSE_NULL, QSE_NULL, item.sctn, QSE_NULL, QSE_NULL);
|
||||
if (!pair) return -1;
|
||||
}
|
||||
|
||||
QSE_ASSERT (pair->val != QSE_NULL);
|
||||
QSE_ASSERT (pair->val->type == QSE_XLI_LIST);
|
||||
|
||||
if (!qse_xli_insertpairwithstr(this->xli, (qse_xli_list_t*)pair->val, QSE_NULL, item.key, QSE_NULL, QSE_NULL, &v, QSE_NULL)) return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SkvEnv::load (const qse_char_t* path)
|
||||
{
|
||||
qse_xli_t* xli;
|
||||
|
||||
if (!this->xli)
|
||||
{
|
||||
// this means that no items have been registered with
|
||||
// this->addItem().
|
||||
return -1;
|
||||
}
|
||||
|
||||
xli = qse_xli_openstdwithmmgr (this->getMmgr(), 0, 0, QSE_NULL);
|
||||
if (!xli) return -1;
|
||||
|
||||
qse_xli_setopt (xli, QSE_XLI_KEYSPLITTER, splitter);
|
||||
|
||||
qse_xli_iostd_t in;
|
||||
QSE_MEMSET (&in, 0, QSE_SIZEOF(in));
|
||||
in.type = QSE_XLI_IOSTD_FILE;
|
||||
in.u.file.path = path;
|
||||
|
||||
if (qse_xli_readinistd(xli, &in) <= -1)
|
||||
{
|
||||
qse_xli_close (xli);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (ItemList::Node* np = this->item_list.getHeadNode(); np; np = np->getNextNode())
|
||||
{
|
||||
Item& item = np->value;
|
||||
qse_xli_pair_t* pair;
|
||||
|
||||
pair = qse_xli_findpair(xli, QSE_NULL, item.name);
|
||||
if (pair)
|
||||
{
|
||||
qse_xli_str_t* strv = (qse_xli_str_t*)pair->val;
|
||||
this->set_value_with_item (item, strv->ptr);
|
||||
// ignore failure.
|
||||
}
|
||||
}
|
||||
|
||||
qse_xli_close(xli);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SkvEnv::store (const qse_char_t* path)
|
||||
{
|
||||
if (!this->xli) return -1;
|
||||
|
||||
qse_xli_iostd_t out;
|
||||
|
||||
QSE_MEMSET (&out, 0, QSE_SIZEOF(out));
|
||||
out.type = QSE_XLI_IOSTD_FILE;
|
||||
out.u.file.path = path;
|
||||
|
||||
return qse_xli_writeinistd(this->xli, QSE_NULL, &out);
|
||||
}
|
||||
|
||||
QSE_END_NAMESPACE(QSE)
|
||||
|
@ -837,7 +837,7 @@ qse_xli_pair_t* qse_xli_findpair (qse_xli_t* xli, const qse_xli_list_t* list, co
|
||||
{
|
||||
qse_xli_pair_t* pair;
|
||||
|
||||
ptr = get_next_fqpn_segment (xli, ptr, &seg);
|
||||
ptr = get_next_fqpn_segment(xli, ptr, &seg);
|
||||
if (ptr == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (curlist->type != QSE_XLI_LIST)
|
||||
@ -852,15 +852,15 @@ qse_xli_pair_t* qse_xli_findpair (qse_xli_t* xli, const qse_xli_list_t* list, co
|
||||
switch (seg.idxtype)
|
||||
{
|
||||
case FQPN_SEG_IDX_NONE:
|
||||
pair = find_pair_by_key_and_alias (xli, curlist, &seg.key, QSE_NULL);
|
||||
pair = find_pair_by_key_and_alias(xli, curlist, &seg.key, QSE_NULL);
|
||||
break;
|
||||
|
||||
case FQPN_SEG_IDX_NUMBER:
|
||||
pair = find_pair_by_key_and_index (xli, curlist, &seg.key, seg.idx.number);
|
||||
pair = find_pair_by_key_and_index(xli, curlist, &seg.key, seg.idx.number);
|
||||
break;
|
||||
|
||||
default: /*case FQPN_SEG_IDX_ALIAS:*/
|
||||
pair = find_pair_by_key_and_alias (xli, curlist, &seg.key, &seg.idx.alias);
|
||||
pair = find_pair_by_key_and_alias(xli, curlist, &seg.key, &seg.idx.alias);
|
||||
break;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user