started writing the ini-style file reader in xli
This commit is contained in:
parent
b00eaada24
commit
e8fb5c1948
@ -409,100 +409,6 @@ static int xli_main (int argc, qse_char_t* argv[])
|
|||||||
qse_xli_setopt (xli, QSE_XLI_TRAIT, &g_trait);
|
qse_xli_setopt (xli, QSE_XLI_TRAIT, &g_trait);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
|
|
||||||
int i;
|
|
||||||
static struct
|
|
||||||
{
|
|
||||||
const qse_char_t* name;
|
|
||||||
qse_xli_scm_t scm;
|
|
||||||
} defs[] =
|
|
||||||
{
|
|
||||||
{ QSE_T("name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("max-nofile"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("max-nproc"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.ssl-cert-file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.ssl-key-file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.root"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.realm"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 0, 1 } },
|
|
||||||
{ QSE_T("server-default.auth"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 0, 1 } },
|
|
||||||
{ QSE_T("server-default.index"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 0xFFFF } },
|
|
||||||
{ QSE_T("server-default.auth-rule"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.auth-rule.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.auth-rule.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.auth-rule.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.auth-rule.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.cgi"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.cgi.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server-default.cgi.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server-default.cgi.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server-default.mime"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.mime.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.mime.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.mime.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.mime.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-access"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.dir-access.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-access.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-access.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-access.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.file-access"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server-default.file-access.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.file-access.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.file-access.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.file-access.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-head"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.dir-foot"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.error-head"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server-default.error-foot"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
|
|
||||||
{ QSE_T("server"), { QSE_XLI_SCM_VALLIST, 0, 0 } },
|
|
||||||
{ QSE_T("server.bind"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.ssl"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.ssl-cert-file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.ssl-key-file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYALIAS, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYALIAS, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.root"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.realm"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 0, 1 } },
|
|
||||||
{ QSE_T("server.host.location.auth"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 0, 1 } },
|
|
||||||
{ QSE_T("server.host.location.index"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 0xFFFF } },
|
|
||||||
{ QSE_T("server.host.location.auth-rule"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.auth-rule.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.auth-rule.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.auth-rule.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.auth-rule.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.cgi"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.cgi.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server.host.location.cgi.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server.host.location.cgi.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 0, 2 } },
|
|
||||||
{ QSE_T("server.host.location.mime"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.mime.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.mime.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.mime.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.mime.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-access"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.dir-access.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-access.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-access.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-access.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.file-access"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
|
||||||
{ QSE_T("server.host.location.file-access.prefix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.file-access.suffix"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.file-access.name"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYALIAS, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.file-access.other"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-head"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.dir-foot"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.error-head"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
|
||||||
{ QSE_T("server.host.location.error-foot"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < QSE_COUNTOF(defs); i++) qse_xli_definepair (xli, defs[i].name, &defs[i].scm);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
in.type = QSE_XLI_IOSTD_FILE;
|
in.type = QSE_XLI_IOSTD_FILE;
|
||||||
in.u.file.path = g_input_file;
|
in.u.file.path = g_input_file;
|
||||||
in.u.file.cmgr = g_infile_cmgr;
|
in.u.file.cmgr = g_infile_cmgr;
|
||||||
@ -628,7 +534,7 @@ int qse_main (int argc, qse_achar_t* argv[])
|
|||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
char locale[100];
|
char locale[100];
|
||||||
UINT codepage = GetConsoleOutputCP();
|
UINT codepage = GetConsoleOutputCP();
|
||||||
if (codepage == CP_UTF8)
|
if (codepage == CP_UTF8)
|
||||||
{
|
{
|
||||||
/*SetConsoleOUtputCP (CP_UTF8);*/
|
/*SetConsoleOUtputCP (CP_UTF8);*/
|
||||||
|
@ -721,6 +721,14 @@ QSE_EXPORT int qse_xli_read (
|
|||||||
qse_xli_io_impl_t io
|
qse_xli_io_impl_t io
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The qse_xli_readini() function reads the ini-styled text file.
|
||||||
|
*/
|
||||||
|
QSE_EXPORT int qse_xli_readini (
|
||||||
|
qse_xli_t* xli,
|
||||||
|
qse_xli_io_impl_t io
|
||||||
|
);
|
||||||
|
|
||||||
QSE_EXPORT int qse_xli_write (
|
QSE_EXPORT int qse_xli_write (
|
||||||
qse_xli_t* xli,
|
qse_xli_t* xli,
|
||||||
qse_xli_io_impl_t io
|
qse_xli_io_impl_t io
|
||||||
|
@ -5,7 +5,7 @@ AM_CPPFLAGS = \
|
|||||||
-I$(top_srcdir)/include
|
-I$(top_srcdir)/include
|
||||||
|
|
||||||
lib_LTLIBRARIES = libqsexli.la
|
lib_LTLIBRARIES = libqsexli.la
|
||||||
libqsexli_la_SOURCES = xli.h xli.c err.c read.c write.c std.c
|
libqsexli_la_SOURCES = xli.h xli.c err.c read.c read-ini.c write.c std.c
|
||||||
libqsexli_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
libqsexli_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||||
libqsexli_la_LIBADD = -lqsecmn
|
libqsexli_la_LIBADD = -lqsecmn
|
||||||
|
|
||||||
|
@ -126,7 +126,8 @@ am__uninstall_files_from_dir = { \
|
|||||||
am__installdirs = "$(DESTDIR)$(libdir)"
|
am__installdirs = "$(DESTDIR)$(libdir)"
|
||||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
libqsexli_la_DEPENDENCIES =
|
libqsexli_la_DEPENDENCIES =
|
||||||
am_libqsexli_la_OBJECTS = xli.lo err.lo read.lo write.lo std.lo
|
am_libqsexli_la_OBJECTS = xli.lo err.lo read.lo read-ini.lo write.lo \
|
||||||
|
std.lo
|
||||||
libqsexli_la_OBJECTS = $(am_libqsexli_la_OBJECTS)
|
libqsexli_la_OBJECTS = $(am_libqsexli_la_OBJECTS)
|
||||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
@ -377,7 +378,7 @@ AM_CPPFLAGS = \
|
|||||||
-I$(top_srcdir)/include
|
-I$(top_srcdir)/include
|
||||||
|
|
||||||
lib_LTLIBRARIES = libqsexli.la
|
lib_LTLIBRARIES = libqsexli.la
|
||||||
libqsexli_la_SOURCES = xli.h xli.c err.c read.c write.c std.c
|
libqsexli_la_SOURCES = xli.h xli.c err.c read.c read-ini.c write.c std.c
|
||||||
libqsexli_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
libqsexli_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
|
||||||
libqsexli_la_LIBADD = -lqsecmn
|
libqsexli_la_LIBADD = -lqsecmn
|
||||||
all: all-am
|
all: all-am
|
||||||
@ -460,6 +461,7 @@ distclean-compile:
|
|||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read-ini.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.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)/std.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write.Plo@am__quote@
|
||||||
|
233
qse/lib/xli/read-ini.c
Normal file
233
qse/lib/xli/read-ini.c
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
/*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "xli.h"
|
||||||
|
#include <qse/cmn/chr.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [SECTION1]
|
||||||
|
* key1 = value1
|
||||||
|
* key2 = value2
|
||||||
|
* [SECTION2]
|
||||||
|
* key1 = value1
|
||||||
|
* --------------------------------
|
||||||
|
*
|
||||||
|
* SECTION1 = {
|
||||||
|
* key1 = value1;
|
||||||
|
* key2 = value2;
|
||||||
|
* }
|
||||||
|
* SECTION2 = {
|
||||||
|
* key1 = value1;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GET_CHAR(xli) \
|
||||||
|
do { if (qse_xli_getchar(xli) <= -1) return -1; } while(0)
|
||||||
|
|
||||||
|
#define GET_CHAR_TO(xli,c) \
|
||||||
|
do { \
|
||||||
|
if (qse_xli_getchar(xli) <= -1) return -1; \
|
||||||
|
c = (xli)->rio.last.c; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define ADD_TOKEN_CHAR(xli,tok,c) \
|
||||||
|
do { \
|
||||||
|
if (qse_str_ccat((tok)->name,(c)) == (qse_size_t)-1) \
|
||||||
|
{ \
|
||||||
|
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define ADD_TOKEN_STR(xli,tok,s,l) \
|
||||||
|
do { \
|
||||||
|
if (qse_str_ncat((tok)->name,(s),(l)) == (qse_size_t)-1) \
|
||||||
|
{ \
|
||||||
|
qse_xli_seterrnum (xli, QSE_XLI_ENOMEM, QSE_NULL); \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
static int skip_spaces (qse_xli_t* xli)
|
||||||
|
{
|
||||||
|
qse_cint_t c = xli->rio.last.c;
|
||||||
|
while (QSE_ISSPACE(c)) GET_CHAR_TO (xli, c);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int skip_comment (qse_xli_t* xli, qse_xli_tok_t* tok)
|
||||||
|
{
|
||||||
|
qse_cint_t c = xli->rio.last.c;
|
||||||
|
|
||||||
|
if (c == QSE_T(';'))
|
||||||
|
{
|
||||||
|
/* skip up to \n */
|
||||||
|
/* TODO: support a different line terminator */
|
||||||
|
qse_str_clear (tok->name);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
GET_CHAR_TO (xli, c);
|
||||||
|
if (c == QSE_T('\n') || c == QSE_CHAR_EOF) break;
|
||||||
|
|
||||||
|
if (xli->opt.trait & QSE_XLI_KEEPTEXT) ADD_TOKEN_CHAR (xli, tok, c);
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
if ((xli->opt.trait & QSE_XLI_KEEPTEXT) &&
|
||||||
|
qse_xli_inserttext (xli, xli->parlink->list, QSE_NULL, QSE_STR_PTR(tok->name)) == QSE_NULL) return -1;
|
||||||
|
|
||||||
|
GET_CHAR (xli); /* eat the new line letter */
|
||||||
|
return 1; /* comment by # */
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get_token_into (qse_xli_t* xli, qse_xli_tok_t* tok)
|
||||||
|
{
|
||||||
|
qse_cint_t c;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
/*retry:*/
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (skip_spaces (xli) <= -1) return -1;
|
||||||
|
if ((n = skip_comment (xli, tok)) <= -1) return -1;
|
||||||
|
}
|
||||||
|
while (n >= 1);
|
||||||
|
|
||||||
|
qse_str_clear (tok->name);
|
||||||
|
tok->loc.file = xli->rio.last.file;
|
||||||
|
tok->loc.line = xli->rio.last.line;
|
||||||
|
tok->loc.colm = xli->rio.last.colm;
|
||||||
|
|
||||||
|
c = xli->rio.last.c;
|
||||||
|
|
||||||
|
if (c == QSE_CHAR_EOF)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
n = end_include (xli, 0);
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
if (n >= 1)
|
||||||
|
{
|
||||||
|
/*xli->rio.last = xli->rio.inp->last;*/
|
||||||
|
/* mark that i'm retrying after end of an included file */
|
||||||
|
skip_semicolon_after_include = 1;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_TOKEN_STR (xli, tok, QSE_T("<EOF>"), 5);
|
||||||
|
SET_TOKEN_TYPE (xli, tok, TOK_EOF);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __read_list (qse_xli_t* xli, const qse_xli_scm_t* override)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_root_list (qse_xli_t* xli)
|
||||||
|
{
|
||||||
|
qse_xli_list_link_t* link;
|
||||||
|
|
||||||
|
link = qse_xli_makelistlink (xli, &xli->root->list);
|
||||||
|
if (!link) return -1;
|
||||||
|
|
||||||
|
if (qse_xli_getchar (xli) <= -1 || __read_list (xli, QSE_NULL) <= -1)
|
||||||
|
{
|
||||||
|
qse_xli_freelistlink (xli, link);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_ASSERT (link == xli->parlink);
|
||||||
|
qse_xli_freelistlink (xli, link);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_xli_readini (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||||
|
{
|
||||||
|
if (!io)
|
||||||
|
{
|
||||||
|
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSE_MEMSET (&xli->rio, 0, QSE_SIZEOF(xli->rio));
|
||||||
|
xli->rio.impl = io;
|
||||||
|
xli->rio.top.line = 1;
|
||||||
|
xli->rio.top.colm = 1;
|
||||||
|
xli->rio.inp = &xli->rio.top;
|
||||||
|
|
||||||
|
qse_xli_seterrnum (xli, QSE_XLI_ENOERR, QSE_NULL);
|
||||||
|
qse_xli_clearrionames (xli);
|
||||||
|
|
||||||
|
QSE_ASSERT (QSE_STR_LEN(xli->dotted_curkey) == 0);
|
||||||
|
|
||||||
|
if (qse_xli_openstream (xli, xli->rio.inp) <= -1) return -1;
|
||||||
|
/* the input stream is open now */
|
||||||
|
|
||||||
|
if (read_root_list (xli) <= -1) goto oops;
|
||||||
|
|
||||||
|
QSE_ASSERT (xli->parlink == QSE_NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (!MATCH (xli, TOK_EOF))
|
||||||
|
{
|
||||||
|
qse_xli_seterror (xli, QSE_XLI_ESYNTAX, QSE_NULL, &xli->tok.loc);
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
QSE_ASSERT (xli->rio.inp == &xli->rio.top);
|
||||||
|
qse_xli_closecurrentstream (xli);
|
||||||
|
qse_str_clear (xli->tok.name);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
oops:
|
||||||
|
/* an error occurred and control has reached here
|
||||||
|
* probably, some included files might not have been
|
||||||
|
* closed. close them */
|
||||||
|
while (xli->rio.inp != &xli->rio.top)
|
||||||
|
{
|
||||||
|
qse_xli_io_arg_t* prev;
|
||||||
|
|
||||||
|
/* nothing much to do about a close error */
|
||||||
|
qse_xli_closecurrentstream (xli);
|
||||||
|
|
||||||
|
prev = xli->rio.inp->prev;
|
||||||
|
QSE_ASSERT (xli->rio.inp->name != QSE_NULL);
|
||||||
|
QSE_MMGR_FREE (xli->mmgr, xli->rio.inp);
|
||||||
|
xli->rio.inp = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_xli_closecurrentstream (xli);
|
||||||
|
qse_str_clear (xli->tok.name);
|
||||||
|
return -1;
|
||||||
|
}
|
@ -27,7 +27,6 @@
|
|||||||
#include "xli.h"
|
#include "xli.h"
|
||||||
#include <qse/cmn/chr.h>
|
#include <qse/cmn/chr.h>
|
||||||
|
|
||||||
static int get_char (qse_xli_t* xli);
|
|
||||||
static int get_token (qse_xli_t* xli);
|
static int get_token (qse_xli_t* xli);
|
||||||
static int read_list (qse_xli_t* xli, qse_xli_list_t* list, const qse_xli_scm_t* override);
|
static int read_list (qse_xli_t* xli, qse_xli_list_t* list, const qse_xli_scm_t* override);
|
||||||
|
|
||||||
@ -38,7 +37,22 @@ enum
|
|||||||
|
|
||||||
static qse_xli_scm_t scm_val_iffy = { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 };
|
static qse_xli_scm_t scm_val_iffy = { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 };
|
||||||
|
|
||||||
static int close_current_stream (qse_xli_t* xli)
|
int qse_xli_openstream (qse_xli_t* xli, qse_xli_io_arg_t* arg)
|
||||||
|
{
|
||||||
|
qse_ssize_t n;
|
||||||
|
|
||||||
|
n = xli->rio.impl (xli, QSE_XLI_IO_OPEN, arg, QSE_NULL, 0);
|
||||||
|
if (n <= -1)
|
||||||
|
{
|
||||||
|
if (xli->errnum == QSE_XLI_ENOERR)
|
||||||
|
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int qse_xli_closecurrentstream (qse_xli_t* xli)
|
||||||
{
|
{
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
|
|
||||||
@ -73,11 +87,11 @@ enum tok_t
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define GET_CHAR(xli) \
|
#define GET_CHAR(xli) \
|
||||||
do { if (get_char(xli) <= -1) return -1; } while(0)
|
do { if (qse_xli_getchar(xli) <= -1) return -1; } while(0)
|
||||||
|
|
||||||
#define GET_CHAR_TO(xli,c) \
|
#define GET_CHAR_TO(xli,c) \
|
||||||
do { \
|
do { \
|
||||||
if (get_char(xli) <= -1) return -1; \
|
if (qse_xli_getchar(xli) <= -1) return -1; \
|
||||||
c = (xli)->rio.last.c; \
|
c = (xli)->rio.last.c; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
@ -119,7 +133,7 @@ static kwent_t kwtab[] =
|
|||||||
{ { QSE_T("@include"), 8 }, TOK_XINCLUDE }
|
{ { QSE_T("@include"), 8 }, TOK_XINCLUDE }
|
||||||
};
|
};
|
||||||
|
|
||||||
static int get_char (qse_xli_t* xli)
|
int qse_xli_getchar (qse_xli_t* xli)
|
||||||
{
|
{
|
||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
|
|
||||||
@ -351,12 +365,7 @@ static int begin_include (qse_xli_t* xli)
|
|||||||
/* let the argument's prev point field to the current */
|
/* let the argument's prev point field to the current */
|
||||||
arg->prev = xli->rio.inp;
|
arg->prev = xli->rio.inp;
|
||||||
|
|
||||||
if (xli->rio.impl (xli, QSE_XLI_IO_OPEN, arg, QSE_NULL, 0) <= -1)
|
if (qse_xli_openstream(xli, arg) <= -1) goto oops;
|
||||||
{
|
|
||||||
if (xli->errnum == QSE_XLI_ENOERR)
|
|
||||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
|
||||||
goto oops;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* i update the current pointer after opening is successful */
|
/* i update the current pointer after opening is successful */
|
||||||
xli->rio.inp = arg;
|
xli->rio.inp = arg;
|
||||||
@ -365,7 +374,7 @@ static int begin_include (qse_xli_t* xli)
|
|||||||
/* read in the first character in the included file.
|
/* read in the first character in the included file.
|
||||||
* so the next call to get_token() sees the character read
|
* so the next call to get_token() sees the character read
|
||||||
* from this file. */
|
* from this file. */
|
||||||
if (get_char (xli) <= -1 || get_token (xli) <= -1)
|
if (qse_xli_getchar (xli) <= -1 || get_token (xli) <= -1)
|
||||||
{
|
{
|
||||||
end_include (xli, 1);
|
end_include (xli, 1);
|
||||||
/* i don't jump to oops since i've called
|
/* i don't jump to oops since i've called
|
||||||
@ -426,7 +435,7 @@ retry:
|
|||||||
|
|
||||||
ADD_TOKEN_STR (xli, tok, QSE_T("<EOF>"), 5);
|
ADD_TOKEN_STR (xli, tok, QSE_T("<EOF>"), 5);
|
||||||
SET_TOKEN_TYPE (xli, tok, TOK_EOF);
|
SET_TOKEN_TYPE (xli, tok, TOK_EOF);
|
||||||
}
|
}
|
||||||
else if (c == QSE_T('@'))
|
else if (c == QSE_T('@'))
|
||||||
{
|
{
|
||||||
/* keyword/directive - start with @ */
|
/* keyword/directive - start with @ */
|
||||||
@ -985,7 +994,7 @@ oops:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qse_xli_list_link_t* make_list_link (qse_xli_t* xli, qse_xli_list_t* parlist)
|
qse_xli_list_link_t* qse_xli_makelistlink (qse_xli_t* xli, qse_xli_list_t* parlist)
|
||||||
{
|
{
|
||||||
qse_xli_list_link_t* link;
|
qse_xli_list_link_t* link;
|
||||||
|
|
||||||
@ -999,7 +1008,7 @@ static qse_xli_list_link_t* make_list_link (qse_xli_t* xli, qse_xli_list_t* parl
|
|||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_list_link (qse_xli_t* xli, qse_xli_list_link_t* link)
|
void qse_xli_freelistlink (qse_xli_t* xli, qse_xli_list_link_t* link)
|
||||||
{
|
{
|
||||||
xli->parlink = link->next;
|
xli->parlink = link->next;
|
||||||
qse_xli_freemem (xli, link);
|
qse_xli_freemem (xli, link);
|
||||||
@ -1071,7 +1080,7 @@ static int read_list (qse_xli_t* xli, qse_xli_list_t* parlist, const qse_xli_scm
|
|||||||
{
|
{
|
||||||
qse_xli_list_link_t* link;
|
qse_xli_list_link_t* link;
|
||||||
|
|
||||||
link = make_list_link (xli, parlist);
|
link = qse_xli_makelistlink (xli, parlist);
|
||||||
if (link == QSE_NULL) return -1;
|
if (link == QSE_NULL) return -1;
|
||||||
|
|
||||||
/* get_token() here is to read the token after the left brace.
|
/* get_token() here is to read the token after the left brace.
|
||||||
@ -1079,12 +1088,12 @@ static int read_list (qse_xli_t* xli, qse_xli_list_t* parlist, const qse_xli_scm
|
|||||||
* in case there are comments at the beginning of the list */
|
* in case there are comments at the beginning of the list */
|
||||||
if (get_token (xli) <= -1 || __read_list (xli, override) <= -1)
|
if (get_token (xli) <= -1 || __read_list (xli, override) <= -1)
|
||||||
{
|
{
|
||||||
free_list_link (xli, link);
|
qse_xli_freelistlink (xli, link);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSE_ASSERT (link == xli->parlink);
|
QSE_ASSERT (link == xli->parlink);
|
||||||
free_list_link (xli, link);
|
qse_xli_freelistlink (xli, link);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1093,17 +1102,17 @@ static int read_root_list (qse_xli_t* xli)
|
|||||||
{
|
{
|
||||||
qse_xli_list_link_t* link;
|
qse_xli_list_link_t* link;
|
||||||
|
|
||||||
link = make_list_link (xli, &xli->root->list);
|
link = qse_xli_makelistlink (xli, &xli->root->list);
|
||||||
if (link == QSE_NULL) return -1;
|
if (!link) return -1;
|
||||||
|
|
||||||
if (get_char (xli) <= -1 || get_token (xli) <= -1 || __read_list (xli, QSE_NULL) <= -1)
|
if (qse_xli_getchar (xli) <= -1 || get_token (xli) <= -1 || __read_list (xli, QSE_NULL) <= -1)
|
||||||
{
|
{
|
||||||
free_list_link (xli, link);
|
qse_xli_freelistlink (xli, link);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSE_ASSERT (link == xli->parlink);
|
QSE_ASSERT (link == xli->parlink);
|
||||||
free_list_link (xli, link);
|
qse_xli_freelistlink (xli, link);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1121,9 +1130,7 @@ void qse_xli_clearrionames (qse_xli_t* xli)
|
|||||||
|
|
||||||
int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
||||||
{
|
{
|
||||||
qse_ssize_t n;
|
if (!io)
|
||||||
|
|
||||||
if (io == QSE_NULL)
|
|
||||||
{
|
{
|
||||||
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1140,13 +1147,7 @@ int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
|||||||
|
|
||||||
QSE_ASSERT (QSE_STR_LEN(xli->dotted_curkey) == 0);
|
QSE_ASSERT (QSE_STR_LEN(xli->dotted_curkey) == 0);
|
||||||
|
|
||||||
n = xli->rio.impl (xli, QSE_XLI_IO_OPEN, xli->rio.inp, QSE_NULL, 0);
|
if (qse_xli_openstream (xli, xli->rio.inp) <= -1) return -1;
|
||||||
if (n <= -1)
|
|
||||||
{
|
|
||||||
if (xli->errnum == QSE_XLI_ENOERR)
|
|
||||||
qse_xli_seterrnum (xli, QSE_XLI_EIOUSR, QSE_NULL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* the input stream is open now */
|
/* the input stream is open now */
|
||||||
|
|
||||||
if (read_root_list (xli) <= -1) goto oops;
|
if (read_root_list (xli) <= -1) goto oops;
|
||||||
@ -1160,7 +1161,7 @@ int qse_xli_read (qse_xli_t* xli, qse_xli_io_impl_t io)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QSE_ASSERT (xli->rio.inp == &xli->rio.top);
|
QSE_ASSERT (xli->rio.inp == &xli->rio.top);
|
||||||
close_current_stream (xli);
|
qse_xli_closecurrentstream (xli);
|
||||||
qse_str_clear (xli->tok.name);
|
qse_str_clear (xli->tok.name);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1173,7 +1174,7 @@ oops:
|
|||||||
qse_xli_io_arg_t* prev;
|
qse_xli_io_arg_t* prev;
|
||||||
|
|
||||||
/* nothing much to do about a close error */
|
/* nothing much to do about a close error */
|
||||||
close_current_stream (xli);
|
qse_xli_closecurrentstream (xli);
|
||||||
|
|
||||||
prev = xli->rio.inp->prev;
|
prev = xli->rio.inp->prev;
|
||||||
QSE_ASSERT (xli->rio.inp->name != QSE_NULL);
|
QSE_ASSERT (xli->rio.inp->name != QSE_NULL);
|
||||||
@ -1181,7 +1182,7 @@ oops:
|
|||||||
xli->rio.inp = prev;
|
xli->rio.inp = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
close_current_stream (xli);
|
qse_xli_closecurrentstream (xli);
|
||||||
qse_str_clear (xli->tok.name);
|
qse_str_clear (xli->tok.name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -118,6 +118,14 @@ const qse_char_t* qse_xli_dflerrstr (
|
|||||||
void qse_xli_clearrionames (qse_xli_t* xli);
|
void qse_xli_clearrionames (qse_xli_t* xli);
|
||||||
void qse_xli_clearwionames (qse_xli_t* xli);
|
void qse_xli_clearwionames (qse_xli_t* xli);
|
||||||
|
|
||||||
|
|
||||||
|
int qse_xli_getchar (qse_xli_t* xli);
|
||||||
|
int qse_xli_openstream (qse_xli_t* xli, qse_xli_io_arg_t* arg);
|
||||||
|
int qse_xli_closecurrentstream (qse_xli_t* xli);
|
||||||
|
|
||||||
|
qse_xli_list_link_t* qse_xli_makelistlink (qse_xli_t* xli, qse_xli_list_t* parlist);
|
||||||
|
void qse_xli_freelistlink (qse_xli_t* xli, qse_xli_list_link_t* link);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user