added AM_SILENT_RULES to configure.ac
This commit is contained in:
@ -6,7 +6,7 @@ AM_CPPFLAGS = \
|
||||
-I$(includedir)
|
||||
|
||||
lib_LTLIBRARIES = libqsexli.la
|
||||
libqsexli_la_SOURCES = xli.h xli.c read.c write.c std.c
|
||||
libqsexli_la_SOURCES = xli.h xli.c err.c read.c write.c std.c
|
||||
libqsexli_la_LDFLAGS = -L../cmn -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
libqsexli_la_LIBADD = -lqsecmn
|
||||
|
||||
|
@ -79,9 +79,12 @@ am__uninstall_files_from_dir = { \
|
||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libqsexli_la_DEPENDENCIES =
|
||||
am_libqsexli_la_OBJECTS = xli.lo read.lo write.lo std.lo
|
||||
am_libqsexli_la_OBJECTS = xli.lo err.lo read.lo write.lo std.lo
|
||||
libqsexli_la_OBJECTS = $(am_libqsexli_la_OBJECTS)
|
||||
libqsexli_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
libqsexli_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(libqsexli_la_LDFLAGS) $(LDFLAGS) -o $@
|
||||
DEFAULT_INCLUDES =
|
||||
@ -90,13 +93,26 @@ am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
SOURCES = $(libqsexli_la_SOURCES)
|
||||
DIST_SOURCES = $(libqsexli_la_SOURCES)
|
||||
ETAGS = etags
|
||||
@ -104,6 +120,7 @@ CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ARGZ_H = @ARGZ_H@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
@ -282,7 +299,7 @@ AM_CPPFLAGS = \
|
||||
-I$(includedir)
|
||||
|
||||
lib_LTLIBRARIES = libqsexli.la
|
||||
libqsexli_la_SOURCES = xli.h xli.c read.c write.c std.c
|
||||
libqsexli_la_SOURCES = xli.h xli.c err.c read.c write.c std.c
|
||||
libqsexli_la_LDFLAGS = -L../cmn -L$(libdir) -version-info 1:0:0 -no-undefined
|
||||
libqsexli_la_LIBADD = -lqsecmn
|
||||
all: all-am
|
||||
@ -351,7 +368,7 @@ clean-libLTLIBRARIES:
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
libqsexli.la: $(libqsexli_la_OBJECTS) $(libqsexli_la_DEPENDENCIES) $(EXTRA_libqsexli_la_DEPENDENCIES)
|
||||
$(libqsexli_la_LINK) -rpath $(libdir) $(libqsexli_la_OBJECTS) $(libqsexli_la_LIBADD) $(LIBS)
|
||||
$(AM_V_CCLD)$(libqsexli_la_LINK) -rpath $(libdir) $(libqsexli_la_OBJECTS) $(libqsexli_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
@ -359,31 +376,32 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/std.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xli.Plo@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
123
qse/lib/xli/err.c
Normal file
123
qse/lib/xli/err.c
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
Copyright 2006-2012 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
|
||||
QSE is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
QSE is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "xli.h"
|
||||
#include "../cmn/mem.h"
|
||||
|
||||
const qse_char_t* qse_xli_dflerrstr (
|
||||
const qse_xli_t* xli, qse_xli_errnum_t errnum)
|
||||
{
|
||||
static const qse_char_t* errstr[] =
|
||||
{
|
||||
QSE_T("no error"),
|
||||
QSE_T("other error"),
|
||||
QSE_T("not implemented"),
|
||||
QSE_T("subsystem error"),
|
||||
QSE_T("internal error that should never have happened"),
|
||||
|
||||
QSE_T("insufficient memory"),
|
||||
QSE_T("invalid parameter or data"),
|
||||
QSE_T("'${0}' not found"),
|
||||
QSE_T("'${0}' already exists"),
|
||||
QSE_T("I/O error with file '${0}'"),
|
||||
QSE_T("error returned by user I/O handler"),
|
||||
|
||||
QSE_T("semicolon expected in place of '${0}'"),
|
||||
QSE_T("left-brace or equal-sign expected in place of '${0}'"),
|
||||
QSE_T("right-brace expected in place of '${0}'"),
|
||||
QSE_T("pair value expected in place of '${0}'")
|
||||
};
|
||||
|
||||
return (errnum >= 0 && errnum < QSE_COUNTOF(errstr))?
|
||||
errstr[errnum]: QSE_T("unknown error");
|
||||
}
|
||||
|
||||
qse_xli_errstr_t qse_xli_geterrstr (const qse_xli_t* xli)
|
||||
{
|
||||
return xli->errstr;
|
||||
}
|
||||
|
||||
void qse_xli_seterrstr (qse_xli_t* xli, qse_xli_errstr_t errstr)
|
||||
{
|
||||
xli->errstr = errstr;
|
||||
}
|
||||
|
||||
qse_xli_errnum_t qse_xli_geterrnum (const qse_xli_t* xli)
|
||||
{
|
||||
return xli->errnum;
|
||||
}
|
||||
|
||||
const qse_xli_loc_t* qse_xli_geterrloc (const qse_xli_t* xli)
|
||||
{
|
||||
return &xli->errloc;
|
||||
}
|
||||
|
||||
const qse_char_t* qse_xli_geterrmsg (const qse_xli_t* xli)
|
||||
{
|
||||
return (xli->errmsg[0] == QSE_T('\0'))?
|
||||
qse_xli_geterrstr(xli)(xli,xli->errnum): xli->errmsg;
|
||||
}
|
||||
|
||||
void qse_xli_geterror (
|
||||
const qse_xli_t* xli, qse_xli_errnum_t* errnum,
|
||||
const qse_char_t** errmsg, qse_xli_loc_t* errloc)
|
||||
{
|
||||
if (errnum != QSE_NULL) *errnum = xli->errnum;
|
||||
if (errmsg != QSE_NULL)
|
||||
{
|
||||
*errmsg = (xli->errmsg[0] == QSE_T('\0'))?
|
||||
qse_xli_geterrstr(xli)(xli,xli->errnum):
|
||||
xli->errmsg;
|
||||
}
|
||||
if (errloc != QSE_NULL) *errloc = xli->errloc;
|
||||
}
|
||||
|
||||
void qse_xli_seterrnum (
|
||||
qse_xli_t* xli, qse_xli_errnum_t errnum, const qse_cstr_t* errarg)
|
||||
{
|
||||
qse_xli_seterror (xli, errnum, errarg, QSE_NULL);
|
||||
}
|
||||
|
||||
void qse_xli_seterrmsg (
|
||||
qse_xli_t* xli, qse_xli_errnum_t errnum,
|
||||
const qse_char_t* errmsg, const qse_xli_loc_t* errloc)
|
||||
{
|
||||
xli->errnum = errnum;
|
||||
qse_strxcpy (xli->errmsg, QSE_COUNTOF(xli->errmsg), errmsg);
|
||||
if (errloc != QSE_NULL) xli->errloc = *errloc;
|
||||
else QSE_MEMSET (&xli->errloc, 0, QSE_SIZEOF(xli->errloc));
|
||||
}
|
||||
|
||||
void qse_xli_seterror (
|
||||
qse_xli_t* xli, qse_xli_errnum_t errnum,
|
||||
const qse_cstr_t* errarg, const qse_xli_loc_t* errloc)
|
||||
{
|
||||
const qse_char_t* errfmt;
|
||||
|
||||
xli->errnum = errnum;
|
||||
|
||||
errfmt = qse_xli_geterrstr(xli)(xli,xli->errnum);
|
||||
QSE_ASSERT (errfmt != QSE_NULL);
|
||||
qse_strxfncpy (xli->errmsg, QSE_COUNTOF(xli->errmsg), errfmt, errarg);
|
||||
|
||||
if (errloc != QSE_NULL) xli->errloc = *errloc;
|
||||
else QSE_MEMSET (&xli->errloc, 0, QSE_SIZEOF(xli->errloc));
|
||||
}
|
||||
|
@ -29,11 +29,11 @@ static int close_stream (qse_xli_t* xli)
|
||||
{
|
||||
qse_ssize_t n;
|
||||
|
||||
xli->errnum = QSE_XLI_ENOERR;
|
||||
n = xli->sio.inf (xli, QSE_XLI_IO_CLOSE, xli->sio.inp, QSE_NULL, 0);
|
||||
if (n <= -1)
|
||||
{
|
||||
if (xli->errnum == QSE_XLI_ENOERR) xli->errnum = QSE_XLI_EIOUSR;
|
||||
if (xli->errnum == QSE_XLI_ENOERR)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ enum tok_t
|
||||
do { \
|
||||
if (qse_str_ccat((tok)->name,(c)) == (qse_size_t)-1) \
|
||||
{ \
|
||||
xli->errnum = QSE_XLI_ENOMEM; \
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); \
|
||||
return -1; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -78,7 +78,7 @@ enum tok_t
|
||||
do { \
|
||||
if (qse_str_ncat((tok)->name,(s),(l)) == (qse_size_t)-1) \
|
||||
{ \
|
||||
xli->errnum = QSE_XLI_ENOMEM; \
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); \
|
||||
return -1; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -108,7 +108,6 @@ static int get_char (qse_xli_t* xli)
|
||||
|
||||
if (xli->sio.inp->b.pos >= xli->sio.inp->b.len)
|
||||
{
|
||||
xli->errnum = QSE_XLI_ENOERR;
|
||||
n = xli->sio.inf (
|
||||
xli, QSE_XLI_IO_READ, xli->sio.inp,
|
||||
xli->sio.inp->b.buf, QSE_COUNTOF(xli->sio.inp->b.buf)
|
||||
@ -116,7 +115,7 @@ static int get_char (qse_xli_t* xli)
|
||||
if (n <= -1)
|
||||
{
|
||||
if (xli->errnum == QSE_XLI_ENOERR)
|
||||
xli->errnum = QSE_XLI_EIOUSR;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -267,7 +266,6 @@ static int end_include (qse_xli_t* xli)
|
||||
/* if it is an included file, close it and
|
||||
* retry to read a character from an outer file */
|
||||
|
||||
xli->errnum = QSE_XLI_ENOERR;
|
||||
x = xli->sio.inf (
|
||||
xli, QSE_XLI_IO_CLOSE,
|
||||
xli->sio.inp, QSE_NULL, 0);
|
||||
@ -288,7 +286,8 @@ static int end_include (qse_xli_t* xli)
|
||||
if (x != 0)
|
||||
{
|
||||
/* the failure mentioned above is returned here */
|
||||
if (xli->errnum == QSE_XLI_ENOERR) xli->errnum = QSE_XLI_EIOUSR;
|
||||
if (xli->errnum == QSE_XLI_ENOERR)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -334,11 +333,11 @@ static int begin_include (qse_xli_t* xli)
|
||||
arg->line = 1;
|
||||
arg->colm = 1;
|
||||
|
||||
xli->errnum = QSE_XLI_ENOERR;
|
||||
op = xli->sio.inf (xli, QSE_XLI_IO_OPEN, arg, QSE_NULL, 0);
|
||||
if (op <= -1)
|
||||
{
|
||||
if (xli->errnum == QSE_XLI_ENOERR) xli->errnum = QSE_XLI_EIOUSR;
|
||||
if (xli->errnum == QSE_XLI_ENOERR)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
@ -537,41 +536,100 @@ static int read_pair (qse_xli_t* xli, qse_xli_list_t* list)
|
||||
{
|
||||
qse_char_t* key = QSE_NULL;
|
||||
qse_char_t* name = QSE_NULL;
|
||||
int got_eq = 0;
|
||||
qse_xli_pair_t* pair;
|
||||
|
||||
if (xli->opt.trait & QSE_XLI_NODUPKEY)
|
||||
{
|
||||
qse_xli_atom_t* atom;
|
||||
|
||||
/* find any key conflicts in the current scope */
|
||||
atom = list->tail;
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
atom = atom->prev;
|
||||
}
|
||||
}
|
||||
|
||||
key = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr);
|
||||
if (key == QSE_NULL)
|
||||
{
|
||||
xli->errnum = QSE_XLI_ENOMEM;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
if (MATCH (xli, TOK_SQSTR) || MATCH(xli, TOK_DQSTR))
|
||||
{
|
||||
name = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr);
|
||||
if (name == QSE_NULL)
|
||||
{
|
||||
xli->errnum = QSE_XLI_ENOMEM;
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
if (xli->opt.trait & QSE_XLI_NAMEDKEY)
|
||||
{
|
||||
/* the name part must be unique for the same key(s) */
|
||||
if (MATCH (xli, TOK_SQSTR) || MATCH(xli, TOK_DQSTR))
|
||||
{
|
||||
qse_xli_atom_t* atom;
|
||||
|
||||
atom = list->tail;
|
||||
while (atom)
|
||||
{
|
||||
if (atom->type == QSE_XLI_PAIR &&
|
||||
((qse_xli_pair_t*)atom)->name &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->key, key) == 0 &&
|
||||
qse_strcmp (((qse_xli_pair_t*)atom)->name, QSE_STR_PTR(xli->tok.name)) == 0)
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EEXIST, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
atom = atom->prev;
|
||||
}
|
||||
|
||||
name = qse_strdup (QSE_STR_PTR(xli->tok.name), xli->mmgr);
|
||||
if (name == QSE_NULL)
|
||||
{
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
if (MATCH (xli, TOK_EQ))
|
||||
{
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
got_eq = 1;
|
||||
|
||||
if (MATCH (xli, TOK_SQSTR) || MATCH (xli, TOK_DQSTR))
|
||||
{
|
||||
pair = qse_xli_insertpairwithstr (
|
||||
xli, list, QSE_NULL, key, name,
|
||||
QSE_STR_PTR(xli->tok.name), MATCH (xli, TOK_SQSTR));
|
||||
if (pair == QSE_NULL) goto oops;
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
/* semicolon is mandatory for a string */
|
||||
if (!MATCH (xli, TOK_SEMICOLON))
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_ESCOLON, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_xli_seterror (xli, QSE_XLI_EPAVAL, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
if (MATCH (xli, TOK_LBRACE))
|
||||
else if (MATCH (xli, TOK_LBRACE))
|
||||
{
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
/* TODO: make it optional??? check duplicate entries... */
|
||||
|
||||
/* insert a pair with an empty list */
|
||||
pair = qse_xli_insertpairwithemptylist (xli, list, QSE_NULL, key, name);
|
||||
if (pair == QSE_NULL) goto oops;
|
||||
@ -580,7 +638,7 @@ static int read_pair (qse_xli_t* xli, qse_xli_list_t* list)
|
||||
|
||||
if (!MATCH (xli, TOK_RBRACE))
|
||||
{
|
||||
/* TODO: syntax error */
|
||||
qse_xli_seterror (xli, QSE_XLI_ERBRCE, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
@ -593,33 +651,9 @@ static int read_pair (qse_xli_t* xli, qse_xli_list_t* list)
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
}
|
||||
}
|
||||
else if (MATCH (xli, TOK_SQSTR) || MATCH (xli, TOK_DQSTR))
|
||||
{
|
||||
if (!got_eq)
|
||||
{
|
||||
/* TODO: syntax error */
|
||||
goto oops;
|
||||
}
|
||||
|
||||
pair = qse_xli_insertpairwithstr (
|
||||
xli, list, QSE_NULL, key, name,
|
||||
QSE_STR_PTR(xli->tok.name), MATCH (xli, TOK_SQSTR));
|
||||
if (pair == QSE_NULL) goto oops;
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
|
||||
/* semicolon is mandatory for a string */
|
||||
if (!MATCH (xli, TOK_SEMICOLON))
|
||||
{
|
||||
/* TODO: syntax error */
|
||||
goto oops;
|
||||
}
|
||||
|
||||
if (get_token (xli) <= -1) goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: syntax error */
|
||||
qse_xli_seterror (xli, QSE_XLI_ELBREQ, QSE_STR_CSTR(xli->tok.name), &xli->tok.loc);
|
||||
goto oops;
|
||||
}
|
||||
|
||||
@ -674,7 +708,7 @@ int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
|
||||
if (io == QSE_NULL)
|
||||
{
|
||||
xli->errnum = QSE_XLI_EINVAL;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -685,11 +719,11 @@ int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||
xli->sio.inp = &xli->sio.arg;
|
||||
qse_htb_clear (xli->sio_names);
|
||||
|
||||
xli->errnum = QSE_XLI_ENOERR;
|
||||
n = xli->sio.inf (xli, QSE_XLI_IO_OPEN, xli->sio.inp, QSE_NULL, 0);
|
||||
if (n <= -1)
|
||||
{
|
||||
if (xli->errnum == QSE_XLI_ENOERR) xli->errnum = QSE_XLI_EIOUSR;
|
||||
if (xli->errnum == QSE_XLI_ENOERR)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
/* the input stream is open now */
|
||||
|
@ -53,6 +53,7 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
|
||||
{
|
||||
QSE_MEMSET (xli, 0, QSE_SIZEOF(*xli));
|
||||
xli->mmgr = mmgr;
|
||||
xli->errstr = qse_xli_dflerrstr;
|
||||
|
||||
xli->tok.name = qse_str_open (mmgr, 0, 128);
|
||||
if (xli->tok.name == QSE_NULL) goto oops;
|
||||
@ -69,7 +70,7 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
xli->errnum = QSE_XLI_ENOMEM;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
if (xli->sio_names) qse_htb_close (xli->sio_names);
|
||||
if (xli->tok.name) qse_str_close (xli->tok.name);
|
||||
return -1;
|
||||
@ -101,7 +102,7 @@ int qse_xli_setopt (qse_xli_t* xli, qse_xli_opt_t id, const void* value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
xli->errnum = QSE_XLI_EINVAL;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -114,7 +115,7 @@ int qse_xli_getopt (qse_xli_t* xli, qse_xli_opt_t id, void* value)
|
||||
return 0;
|
||||
};
|
||||
|
||||
xli->errnum = QSE_XLI_EINVAL;
|
||||
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -138,7 +139,8 @@ void* qse_xli_allocmem (qse_xli_t* xli, qse_size_t size)
|
||||
void* ptr;
|
||||
|
||||
ptr = QSE_MMGR_ALLOC (xli->mmgr, size);
|
||||
if (ptr == QSE_NULL) xli->errnum = QSE_XLI_ENOMEM;
|
||||
if (ptr == QSE_NULL)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@ -147,7 +149,8 @@ void* qse_xli_callocmem (qse_xli_t* xli, qse_size_t size)
|
||||
void* ptr;
|
||||
|
||||
ptr = QSE_MMGR_ALLOC (xli->mmgr, size);
|
||||
if (ptr == QSE_NULL) xli->errnum = QSE_XLI_ENOMEM;
|
||||
if (ptr == QSE_NULL)
|
||||
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL);
|
||||
else QSE_MEMSET (ptr, 0, size);
|
||||
return ptr;
|
||||
}
|
||||
@ -197,6 +200,7 @@ qse_xli_pair_t* qse_xli_insertpair (
|
||||
{
|
||||
qse_xli_pair_t* pair;
|
||||
qse_size_t klen, nlen;
|
||||
qse_char_t* kptr, * nptr;
|
||||
|
||||
klen = qse_strlen (key);
|
||||
nlen = name? qse_strlen (name): 0;
|
||||
@ -207,13 +211,15 @@ qse_xli_pair_t* qse_xli_insertpair (
|
||||
((nlen + 1) * QSE_SIZEOF(*name)));
|
||||
if (pair == QSE_NULL) return QSE_NULL;
|
||||
|
||||
pair->type = QSE_XLI_PAIR;
|
||||
pair->key = (const qse_char_t*)(pair + 1);
|
||||
pair->name = pair->key + klen + 1;
|
||||
pair->val = value; /* this assumes it points to a dynamically allocated atom */
|
||||
kptr = (qse_char_t*)(pair + 1);
|
||||
nptr = kptr + klen + 1;
|
||||
qse_strcpy (kptr, key);
|
||||
if (name) qse_strcpy (nptr, name);
|
||||
|
||||
qse_strcpy (pair->key, key);
|
||||
if (name) qse_strcpy (pair->name, name);
|
||||
pair->type = QSE_XLI_PAIR;
|
||||
pair->key = kptr;
|
||||
pair->name = nptr;
|
||||
pair->val = value; /* this assumes it points to a dynamically allocated atom */
|
||||
|
||||
insert_atom (xli, parent, peer, (qse_xli_atom_t*)pair);
|
||||
return pair;
|
||||
|
@ -38,7 +38,11 @@ struct qse_xli_tok_t
|
||||
struct qse_xli_t
|
||||
{
|
||||
qse_mmgr_t* mmgr;
|
||||
qse_xli_errnum_t errnum;
|
||||
|
||||
qse_xli_errstr_t errstr; /**< error string getter */
|
||||
qse_xli_errnum_t errnum; /**< stores an error number */
|
||||
qse_char_t errmsg[128]; /**< error message holder */
|
||||
qse_xli_loc_t errloc; /**< location of the last error */
|
||||
|
||||
struct
|
||||
{
|
||||
@ -69,6 +73,9 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr);
|
||||
|
||||
void qse_xli_fini (qse_xli_t* xli);
|
||||
|
||||
const qse_char_t* qse_xli_dflerrstr (
|
||||
const qse_xli_t* xli, qse_xli_errnum_t errnum);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user