* added QSE_MBLEN_MAX
* added qse_getcclsid() and related functions * added qse_isblank() and realted code
This commit is contained in:
@ -36,10 +36,11 @@ host_triplet = @host@
|
||||
subdir = lib
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -38,10 +38,11 @@ host_triplet = @host@
|
||||
subdir = lib/awk
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c 551 2011-08-15 13:52:48Z hyunghwan.chung $
|
||||
* $Id: parse.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -5909,9 +5909,11 @@ retry:
|
||||
{
|
||||
/* not handled yet */
|
||||
if (c == QSE_T('\0'))
|
||||
{
|
||||
SETERR_ARG_LOC (
|
||||
awk, QSE_AWK_ELXCHR,
|
||||
QSE_T("<NUL>"), 5, &tok->loc);
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_char_t cc = (qse_char_t)c;
|
||||
|
@ -38,10 +38,11 @@ host_triplet = @host@
|
||||
subdir = lib/cmn
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: chr.c 441 2011-04-22 14:28:43Z hyunghwan.chung $
|
||||
* $Id: chr.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -19,61 +19,80 @@
|
||||
*/
|
||||
|
||||
#include <qse/cmn/chr.h>
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <wctype.h>
|
||||
|
||||
static qse_bool_t is_mupper (qse_mcint_t c) { return isupper(c); }
|
||||
static qse_bool_t is_mlower (qse_mcint_t c) { return islower(c); }
|
||||
static qse_bool_t is_malpha (qse_mcint_t c) { return isalpha(c); }
|
||||
static qse_bool_t is_mdigit (qse_mcint_t c) { return isdigit(c); }
|
||||
static qse_bool_t is_mxdigit (qse_mcint_t c) { return isxdigit(c); }
|
||||
static qse_bool_t is_malnum (qse_mcint_t c) { return isalnum(c); }
|
||||
static qse_bool_t is_mspace (qse_mcint_t c) { return isspace(c); }
|
||||
static qse_bool_t is_mprint (qse_mcint_t c) { return isprint(c); }
|
||||
static qse_bool_t is_mgraph (qse_mcint_t c) { return isgraph(c); }
|
||||
static qse_bool_t is_mblank (qse_mcint_t c)
|
||||
{
|
||||
#ifdef HAVE_ISBLANK
|
||||
return isblank(c);
|
||||
#else
|
||||
return c == QSE_MT(' ') || c == QSE_MT('\t');
|
||||
#endif
|
||||
}
|
||||
static qse_bool_t is_mcntrl (qse_mcint_t c) { return iscntrl(c); }
|
||||
static qse_bool_t is_mdigit (qse_mcint_t c) { return isdigit(c); }
|
||||
static qse_bool_t is_mgraph (qse_mcint_t c) { return isgraph(c); }
|
||||
static qse_bool_t is_mlower (qse_mcint_t c) { return islower(c); }
|
||||
static qse_bool_t is_mprint (qse_mcint_t c) { return isprint(c); }
|
||||
static qse_bool_t is_mpunct (qse_mcint_t c) { return ispunct(c); }
|
||||
static qse_bool_t is_mspace (qse_mcint_t c) { return isspace(c); }
|
||||
static qse_bool_t is_mupper (qse_mcint_t c) { return isupper(c); }
|
||||
static qse_bool_t is_mxdigit (qse_mcint_t c) { return isxdigit(c); }
|
||||
|
||||
|
||||
static qse_bool_t is_wupper (qse_wcint_t c) { return iswupper(c); }
|
||||
static qse_bool_t is_wlower (qse_wcint_t c) { return iswlower(c); }
|
||||
static qse_bool_t is_walpha (qse_wcint_t c) { return iswalpha(c); }
|
||||
static qse_bool_t is_wdigit (qse_wcint_t c) { return iswdigit(c); }
|
||||
static qse_bool_t is_wxdigit (qse_wcint_t c) { return iswxdigit(c); }
|
||||
static qse_bool_t is_walnum (qse_wcint_t c) { return iswalnum(c); }
|
||||
static qse_bool_t is_wspace (qse_wcint_t c) { return iswspace(c); }
|
||||
static qse_bool_t is_wprint (qse_wcint_t c) { return iswprint(c); }
|
||||
static qse_bool_t is_wgraph (qse_wcint_t c) { return iswgraph(c); }
|
||||
static qse_bool_t is_wblank (qse_wcint_t c)
|
||||
{
|
||||
#ifdef HAVE_ISWBLANK
|
||||
return iswblank(c);
|
||||
#else
|
||||
return c == QSE_WT(' ') || c == QSE_WT('\t');
|
||||
#endif
|
||||
}
|
||||
static qse_bool_t is_wcntrl (qse_wcint_t c) { return iswcntrl(c); }
|
||||
static qse_bool_t is_wdigit (qse_wcint_t c) { return iswdigit(c); }
|
||||
static qse_bool_t is_wgraph (qse_wcint_t c) { return iswgraph(c); }
|
||||
static qse_bool_t is_wlower (qse_wcint_t c) { return iswlower(c); }
|
||||
static qse_bool_t is_wprint (qse_wcint_t c) { return iswprint(c); }
|
||||
static qse_bool_t is_wpunct (qse_wcint_t c) { return iswpunct(c); }
|
||||
static qse_bool_t is_wspace (qse_wcint_t c) { return iswspace(c); }
|
||||
static qse_bool_t is_wupper (qse_wcint_t c) { return iswupper(c); }
|
||||
static qse_bool_t is_wxdigit (qse_wcint_t c) { return iswxdigit(c); }
|
||||
|
||||
qse_bool_t qse_mccls_is (qse_mcint_t c, qse_mccls_id_t type)
|
||||
qse_bool_t qse_ismccls (qse_mcint_t c, qse_mccls_id_t type)
|
||||
{
|
||||
/* TODO: use GetStringTypeW/A for WIN32 to implement these */
|
||||
|
||||
static qse_bool_t (*f[]) (qse_mcint_t) =
|
||||
{
|
||||
is_mupper,
|
||||
is_mlower,
|
||||
is_malpha,
|
||||
is_mdigit,
|
||||
is_mxdigit,
|
||||
is_malnum,
|
||||
is_mspace,
|
||||
is_mprint,
|
||||
is_mgraph,
|
||||
is_malpha,
|
||||
is_mblank,
|
||||
is_mcntrl,
|
||||
is_mpunct
|
||||
is_mdigit,
|
||||
is_mgraph,
|
||||
is_mlower,
|
||||
is_mprint,
|
||||
is_mpunct,
|
||||
is_mspace,
|
||||
is_mupper,
|
||||
is_mxdigit
|
||||
};
|
||||
|
||||
QSE_ASSERTX (type >= QSE_MCCLS_UPPER && type <= QSE_MCCLS_PUNCT,
|
||||
QSE_ASSERTX (type >= QSE_WCCLS_ALNUM && type <= QSE_WCCLS_XDIGIT,
|
||||
"The character type should be one of qse_mccls_id_t values");
|
||||
return f[type] (c);
|
||||
return f[type-1] (c);
|
||||
}
|
||||
|
||||
qse_mcint_t qse_mccls_to (qse_mcint_t c, qse_mccls_id_t type)
|
||||
qse_mcint_t qse_tomccls (qse_mcint_t c, qse_mccls_id_t type)
|
||||
{
|
||||
QSE_ASSERTX (type >= QSE_MCCLS_UPPER && type <= QSE_MCCLS_LOWER,
|
||||
QSE_ASSERTX (type == QSE_MCCLS_UPPER || type == QSE_MCCLS_LOWER,
|
||||
"The character type should be one of QSE_MCCLS_UPPER and QSE_MCCLS_LOWER");
|
||||
|
||||
if (type == QSE_MCCLS_UPPER) return toupper(c);
|
||||
@ -81,7 +100,7 @@ qse_mcint_t qse_mccls_to (qse_mcint_t c, qse_mccls_id_t type)
|
||||
return c;
|
||||
}
|
||||
|
||||
qse_bool_t qse_wccls_is (qse_wcint_t c, qse_wccls_id_t type)
|
||||
qse_bool_t qse_iswccls (qse_wcint_t c, qse_wccls_id_t type)
|
||||
{
|
||||
/*
|
||||
#ifdef HAVE_WCTYPE
|
||||
@ -124,28 +143,29 @@ qse_bool_t qse_wccls_is (qse_wcint_t c, qse_wccls_id_t type)
|
||||
*/
|
||||
static qse_bool_t (*f[]) (qse_wcint_t) =
|
||||
{
|
||||
is_wupper,
|
||||
is_wlower,
|
||||
is_walpha,
|
||||
is_wdigit,
|
||||
is_wxdigit,
|
||||
is_walnum,
|
||||
is_wspace,
|
||||
is_wprint,
|
||||
is_wgraph,
|
||||
is_walpha,
|
||||
is_wblank,
|
||||
is_wcntrl,
|
||||
is_wpunct
|
||||
is_wdigit,
|
||||
is_wgraph,
|
||||
is_wlower,
|
||||
is_wprint,
|
||||
is_wpunct,
|
||||
is_wspace,
|
||||
is_wupper,
|
||||
is_wxdigit
|
||||
};
|
||||
|
||||
QSE_ASSERTX (type >= QSE_WCCLS_UPPER && type <= QSE_WCCLS_PUNCT,
|
||||
QSE_ASSERTX (type >= QSE_WCCLS_ALNUM && type <= QSE_WCCLS_XDIGIT,
|
||||
"The character type should be one of qse_wccls_id_t values");
|
||||
return f[type] (c);
|
||||
return f[type-1] (c);
|
||||
/*
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
qse_wcint_t qse_wccls_to (qse_wcint_t c, qse_wccls_id_t type)
|
||||
qse_wcint_t qse_towccls (qse_wcint_t c, qse_wccls_id_t type)
|
||||
{
|
||||
/*
|
||||
#ifdef HAVE_WCTRANS
|
||||
@ -168,11 +188,189 @@ qse_wcint_t qse_wccls_to (qse_wcint_t c, qse_wccls_id_t type)
|
||||
return towctrans (c, desc[type]);
|
||||
#else
|
||||
*/
|
||||
QSE_ASSERTX (type >= QSE_WCCLS_UPPER && type <= QSE_WCCLS_LOWER,
|
||||
QSE_ASSERTX (type == QSE_WCCLS_UPPER || type == QSE_WCCLS_LOWER,
|
||||
"The type should be one of QSE_WCCLS_UPPER and QSE_WCCLS_LOWER");
|
||||
return (type == QSE_CCLS_UPPER)? towupper(c): towlower(c);
|
||||
if (type == QSE_WCCLS_UPPER) return towupper(c);
|
||||
if (type == QSE_WCCLS_LOWER) return towlower(c);
|
||||
return c;
|
||||
/*
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
static struct wtab_t
|
||||
{
|
||||
const qse_wchar_t* name;
|
||||
int class;
|
||||
} wtab[] =
|
||||
{
|
||||
{ QSE_WT("alnum"), QSE_WCCLS_ALNUM },
|
||||
{ QSE_WT("alpha"), QSE_WCCLS_ALPHA },
|
||||
{ QSE_WT("blank"), QSE_WCCLS_BLANK },
|
||||
{ QSE_WT("cntrl"), QSE_WCCLS_CNTRL },
|
||||
{ QSE_WT("digit"), QSE_WCCLS_DIGIT },
|
||||
{ QSE_WT("graph"), QSE_WCCLS_GRAPH },
|
||||
{ QSE_WT("lower"), QSE_WCCLS_LOWER },
|
||||
{ QSE_WT("print"), QSE_WCCLS_PRINT },
|
||||
{ QSE_WT("punct"), QSE_WCCLS_PUNCT },
|
||||
{ QSE_WT("space"), QSE_WCCLS_SPACE },
|
||||
{ QSE_WT("upper"), QSE_WCCLS_UPPER },
|
||||
{ QSE_WT("xdigit"), QSE_WCCLS_XDIGIT }
|
||||
};
|
||||
|
||||
int qse_getwcclsidbyname (const qse_wchar_t* name, qse_wccls_id_t* id)
|
||||
{
|
||||
int left = 0, right = QSE_COUNTOF(wtab) - 1, mid;
|
||||
while (left <= right)
|
||||
{
|
||||
int n;
|
||||
struct wtab_t* kwp;
|
||||
|
||||
mid = (left + right) / 2;
|
||||
kwp = &wtab[mid];
|
||||
|
||||
n = qse_wcscmp (name, wtab->name);
|
||||
if (n > 0)
|
||||
{
|
||||
/* if left, right, mid were of qse_size_t,
|
||||
* you would need the following line.
|
||||
if (mid == 0) break;
|
||||
*/
|
||||
right = mid - 1;
|
||||
}
|
||||
else if (n < 0) left = mid + 1;
|
||||
else
|
||||
{
|
||||
*id = kwp->class;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int qse_getwcclsidbyxname (const qse_wchar_t* name, qse_size_t len, qse_wccls_id_t* id)
|
||||
{
|
||||
int left = 0, right = QSE_COUNTOF(wtab) - 1, mid;
|
||||
while (left <= right)
|
||||
{
|
||||
int n;
|
||||
struct wtab_t* kwp;
|
||||
|
||||
mid = (left + right) / 2;
|
||||
kwp = &wtab[mid];
|
||||
|
||||
n = qse_wcsxcmp (name, len, wtab->name);
|
||||
if (n > 0)
|
||||
{
|
||||
/* if left, right, mid were of qse_size_t,
|
||||
* you would need the following line.
|
||||
if (mid == 0) break;
|
||||
*/
|
||||
right = mid - 1;
|
||||
}
|
||||
else if (n < 0) left = mid + 1;
|
||||
else
|
||||
{
|
||||
*id = kwp->class;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
qse_wccls_id_t qse_getwcclsid (const qse_wchar_t* name)
|
||||
{
|
||||
qse_wccls_id_t id;
|
||||
return (qse_getwcclsidbyname(name,&id) <= -1)? ((qse_wccls_id_t)0): id;
|
||||
}
|
||||
|
||||
static struct mtab_t
|
||||
{
|
||||
const qse_mchar_t* name;
|
||||
int class;
|
||||
} mtab[] =
|
||||
{
|
||||
{ QSE_MT("alnum"), QSE_MCCLS_ALNUM },
|
||||
{ QSE_MT("alpha"), QSE_MCCLS_ALPHA },
|
||||
{ QSE_MT("blank"), QSE_MCCLS_BLANK },
|
||||
{ QSE_MT("cntrl"), QSE_MCCLS_CNTRL },
|
||||
{ QSE_MT("digit"), QSE_MCCLS_DIGIT },
|
||||
{ QSE_MT("graph"), QSE_MCCLS_GRAPH },
|
||||
{ QSE_MT("lower"), QSE_MCCLS_LOWER },
|
||||
{ QSE_MT("print"), QSE_MCCLS_PRINT },
|
||||
{ QSE_MT("punct"), QSE_MCCLS_PUNCT },
|
||||
{ QSE_MT("space"), QSE_MCCLS_SPACE },
|
||||
{ QSE_MT("upper"), QSE_MCCLS_UPPER },
|
||||
{ QSE_MT("xdigit"), QSE_MCCLS_XDIGIT },
|
||||
{ QSE_NULL, 0 }
|
||||
};
|
||||
|
||||
int qse_getmcclsidbyname (const qse_mchar_t* name, qse_mccls_id_t* id)
|
||||
{
|
||||
int left = 0, right = QSE_COUNTOF(mtab) - 1, mid;
|
||||
while (left <= right)
|
||||
{
|
||||
int n;
|
||||
struct mtab_t* kwp;
|
||||
|
||||
mid = (left + right) / 2;
|
||||
kwp = &mtab[mid];
|
||||
|
||||
n = qse_mbscmp (name, mtab->name);
|
||||
if (n > 0)
|
||||
{
|
||||
/* if left, right, mid were of qse_size_t,
|
||||
* you would need the following line.
|
||||
if (mid == 0) break;
|
||||
*/
|
||||
right = mid - 1;
|
||||
}
|
||||
else if (n < 0) left = mid + 1;
|
||||
else
|
||||
{
|
||||
*id = kwp->class;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (qse_mccls_id_t)0;
|
||||
}
|
||||
|
||||
int qse_getmcclsidbyxname (const qse_mchar_t* name, qse_size_t len, qse_mccls_id_t* id)
|
||||
{
|
||||
int left = 0, right = QSE_COUNTOF(mtab) - 1, mid;
|
||||
while (left <= right)
|
||||
{
|
||||
int n;
|
||||
struct mtab_t* kwp;
|
||||
|
||||
mid = (left + right) / 2;
|
||||
kwp = &mtab[mid];
|
||||
|
||||
n = qse_mbsxcmp (name, len, mtab->name);
|
||||
if (n > 0)
|
||||
{
|
||||
/* if left, right, mid were of qse_size_t,
|
||||
* you would need the following line.
|
||||
if (mid == 0) break;
|
||||
*/
|
||||
right = mid - 1;
|
||||
}
|
||||
else if (n < 0) left = mid + 1;
|
||||
else
|
||||
{
|
||||
*id = kwp->class;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return (qse_mccls_id_t)0;
|
||||
}
|
||||
|
||||
qse_mccls_id_t qse_getmcclsid (const qse_mchar_t* name)
|
||||
{
|
||||
qse_mccls_id_t id;
|
||||
return (qse_getmcclsidbyname(name,&id) <= -1)? ((qse_mccls_id_t)0): id;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: chr_cnv.c 451 2011-05-03 14:00:38Z hyunghwan.chung $
|
||||
* $Id: chr_cnv.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -38,22 +38,22 @@
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
qse_size_t qse_mblen (const qse_mchar_t* mb, qse_size_t mblen)
|
||||
qse_size_t qse_mbrlen (
|
||||
const qse_mchar_t* mb, qse_size_t mbl, qse_mbstate_t* state)
|
||||
{
|
||||
#ifdef HAVE_MBRLEN
|
||||
size_t n;
|
||||
mbstate_t mbs = { 0 };
|
||||
|
||||
n = mbrlen (mb, mblen, &mbs);
|
||||
n = mbrlen (mb, mbl, (mbstate_t*)state);
|
||||
if (n == 0) return 1; /* a null character */
|
||||
|
||||
if (n == (size_t)-1) return 0; /* invalid sequence */
|
||||
if (n == (size_t)-2) return mblen + 1; /* incomplete sequence */
|
||||
if (n == (size_t)-2) return mbl + 1; /* incomplete sequence */
|
||||
|
||||
return (qse_size_t)n;
|
||||
|
||||
#if 0
|
||||
n = mblen (mb, mblen, &mbs);
|
||||
n = mblen (mb, mbl);
|
||||
if (n == 0) return 1; /* a null character */
|
||||
if (n == (size_t)-1) return 0; /* invalid or incomplete sequence */
|
||||
return (qse_size_t)n;
|
||||
@ -63,13 +63,14 @@ qse_size_t qse_mblen (const qse_mchar_t* mb, qse_size_t mblen)
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_size_t qse_mbtowc (const qse_mchar_t* mb, qse_size_t mblen, qse_wchar_t* wc)
|
||||
qse_size_t qse_mbrtowc (
|
||||
const qse_mchar_t* mb, qse_size_t mbl,
|
||||
qse_wchar_t* wc, qse_mbstate_t* state)
|
||||
{
|
||||
#ifdef HAVE_MBRTOWC
|
||||
size_t n;
|
||||
mbstate_t mbs = { 0 };
|
||||
|
||||
n = mbrtowc (wc, mb, mblen, &mbs);
|
||||
n = mbrtowc (wc, mb, mbl, (mbstate_t*)state);
|
||||
if (n == 0)
|
||||
{
|
||||
*wc = QSE_WT('\0');
|
||||
@ -77,51 +78,38 @@ qse_size_t qse_mbtowc (const qse_mchar_t* mb, qse_size_t mblen, qse_wchar_t* wc)
|
||||
}
|
||||
|
||||
if (n == (size_t)-1) return 0; /* invalid sequence */
|
||||
if (n == (size_t)-2) return mblen + 1; /* incomplete sequence */
|
||||
if (n == (size_t)-2) return mbl + 1; /* incomplete sequence */
|
||||
return (qse_size_t)n;
|
||||
#else
|
||||
#error #### NOT SUPPORTED ####
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_size_t qse_wctomb (qse_wchar_t wc, qse_mchar_t* mb, qse_size_t mblen)
|
||||
qse_size_t qse_wcrtomb (
|
||||
qse_wchar_t wc, qse_mchar_t* mb,
|
||||
qse_size_t mbl, qse_mbstate_t* state)
|
||||
{
|
||||
#ifdef HAVE_WCRTOMB
|
||||
size_t n;
|
||||
mbstate_t mbs = { 0 };
|
||||
|
||||
/* man mbsinit
|
||||
* For 8-bit encodings, all states are equivalent to the initial state.
|
||||
* For multibyte encodings like UTF-8, EUC-*, BIG5 or SJIS, the wide char‐
|
||||
* acter to multibyte conversion functions never produce non-initial
|
||||
* states, but the multibyte to wide-character conversion functions like
|
||||
* mbrtowc(3) do produce non-initial states when interrupted in the middle
|
||||
* of a character.
|
||||
*/
|
||||
|
||||
#ifdef _SCO_DS
|
||||
/* SCO defines MB_CUR_MAX as shown below:
|
||||
* extern unsigned char __ctype[];
|
||||
* #define MB_CUR_MAX ((int)__ctype[520])
|
||||
* Some hacks are needed for compilation with a C89 compiler. */
|
||||
# undef MB_CUR_MAX
|
||||
# define MB_CUR_MAX 32
|
||||
#endif
|
||||
|
||||
if (mblen < MB_CUR_MAX)
|
||||
if (mbl < QSE_MBLEN_MAX)
|
||||
{
|
||||
qse_mchar_t buf[MB_CUR_MAX];
|
||||
/* the buffer given is too small. try conversion on
|
||||
* a temporary buffer large enough to handle all locales
|
||||
* and copy the result to the original buffer.
|
||||
*/
|
||||
qse_mchar_t buf[QSE_MBLEN_MAX];
|
||||
|
||||
n = wcrtomb (buf, wc, &mbs);
|
||||
if (n > mblen) return mblen + 1; /* buffer to small */
|
||||
n = wcrtomb (buf, wc, (mbstate_t*)state);
|
||||
if (n > mbl) return mbl + 1; /* buffer to small */
|
||||
if (n == (size_t)-1) return 0; /* illegal character */
|
||||
|
||||
QSE_MEMCPY (mb, buf, mblen);
|
||||
QSE_MEMCPY (mb, buf, mbl);
|
||||
}
|
||||
else
|
||||
{
|
||||
n = wcrtomb (mb, wc, &mbs);
|
||||
if (n > mblen) return mblen + 1; /* buffer to small */
|
||||
n = wcrtomb (mb, wc, (mbstate_t*)state);
|
||||
if (n > mbl) return mbl + 1; /* buffer to small */
|
||||
if (n == (size_t)-1) return 0; /* illegal character */
|
||||
}
|
||||
|
||||
@ -131,3 +119,33 @@ qse_size_t qse_wctomb (qse_wchar_t wc, qse_mchar_t* mb, qse_size_t mblen)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* man mbsinit
|
||||
* For 8-bit encodings, all states are equivalent to the initial state.
|
||||
* For multibyte encodings like UTF-8, EUC-*, BIG5 or SJIS, the wide char‐
|
||||
* acter to multibyte conversion functions never produce non-initial
|
||||
* states, but the multibyte to wide-character conversion functions like
|
||||
* mbrtowc(3) do produce non-initial states when interrupted in the middle
|
||||
* of a character.
|
||||
*/
|
||||
qse_size_t qse_mblen (const qse_mchar_t* mb, qse_size_t mbl)
|
||||
{
|
||||
qse_mbstate_t state = { { 0, } };
|
||||
return qse_mbrlen (mb, mbl, &state);
|
||||
}
|
||||
|
||||
qse_size_t qse_mbtowc (const qse_mchar_t* mb, qse_size_t mbl, qse_wchar_t* wc)
|
||||
{
|
||||
qse_mbstate_t state = { { 0, } };
|
||||
return qse_mbrtowc (mb, mbl, wc, &state);
|
||||
}
|
||||
|
||||
qse_size_t qse_wctomb (qse_wchar_t wc, qse_mchar_t* mb, qse_size_t mbl)
|
||||
{
|
||||
qse_mbstate_t state = { { 0, } };
|
||||
return qse_wcrtomb (wc, mb, mbl, &state);
|
||||
}
|
||||
|
||||
int qse_mbcurmax (void)
|
||||
{
|
||||
return MB_CUR_MAX;
|
||||
}
|
||||
|
@ -139,6 +139,13 @@ void* qse_fma_alloc (qse_fma_t* fma, qse_size_t size)
|
||||
return blk;
|
||||
}
|
||||
|
||||
void* qse_fma_calloc (qse_fma_t* fma, qse_size_t size)
|
||||
{
|
||||
void* ptr = qse_fma_alloc (fma, size);
|
||||
if (size) QSE_MEMSET (ptr, 0, size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* qse_fma_realloc (qse_fma_t* fma, void* blk, qse_size_t size)
|
||||
{
|
||||
if (blk)
|
||||
|
@ -380,46 +380,46 @@ static void adjust (rbt_t* rbt, pair_t* pair)
|
||||
{
|
||||
while (pair != rbt->root)
|
||||
{
|
||||
pair_t* tmp, * tmp2, * xpar;
|
||||
pair_t* tmp, * tmp2, * x_par;
|
||||
int leftwise;
|
||||
|
||||
xpar = pair->parent;
|
||||
if (xpar->color == QSE_RBT_BLACK) break;
|
||||
x_par = pair->parent;
|
||||
if (x_par->color == QSE_RBT_BLACK) break;
|
||||
|
||||
QSE_ASSERT (xpar->parent != QSE_NULL);
|
||||
QSE_ASSERT (x_par->parent != QSE_NULL);
|
||||
|
||||
if (xpar == xpar->parent->child[LEFT])
|
||||
if (x_par == x_par->parent->child[LEFT])
|
||||
{
|
||||
tmp = xpar->parent->child[RIGHT];
|
||||
tmp2 = xpar->child[RIGHT];
|
||||
tmp = x_par->parent->child[RIGHT];
|
||||
tmp2 = x_par->child[RIGHT];
|
||||
leftwise = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = xpar->parent->child[LEFT];
|
||||
tmp2 = xpar->child[LEFT];
|
||||
tmp = x_par->parent->child[LEFT];
|
||||
tmp2 = x_par->child[LEFT];
|
||||
leftwise = 0;
|
||||
}
|
||||
|
||||
if (tmp->color == QSE_RBT_RED)
|
||||
{
|
||||
xpar->color = QSE_RBT_BLACK;
|
||||
x_par->color = QSE_RBT_BLACK;
|
||||
tmp->color = QSE_RBT_BLACK;
|
||||
xpar->parent->color = QSE_RBT_RED;
|
||||
pair = xpar->parent;
|
||||
x_par->parent->color = QSE_RBT_RED;
|
||||
pair = x_par->parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pair == tmp2)
|
||||
{
|
||||
pair = xpar;
|
||||
pair = x_par;
|
||||
rotate (rbt, pair, leftwise);
|
||||
xpar = pair->parent;
|
||||
x_par = pair->parent;
|
||||
}
|
||||
|
||||
xpar->color = QSE_RBT_BLACK;
|
||||
xpar->parent->color = QSE_RBT_RED;
|
||||
rotate (rbt, xpar->parent, !leftwise);
|
||||
x_par->color = QSE_RBT_BLACK;
|
||||
x_par->parent->color = QSE_RBT_RED;
|
||||
rotate (rbt, x_par->parent, !leftwise);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -510,24 +510,24 @@ static pair_t* change_pair_val (
|
||||
static pair_t* insert (
|
||||
rbt_t* rbt, void* kptr, size_t klen, void* vptr, size_t vlen, int opt)
|
||||
{
|
||||
pair_t* xcur = rbt->root;
|
||||
pair_t* xpar = QSE_NULL;
|
||||
pair_t* xnew;
|
||||
pair_t* x_cur = rbt->root;
|
||||
pair_t* x_par = QSE_NULL;
|
||||
pair_t* x_new;
|
||||
|
||||
while (!IS_NIL(rbt,xcur))
|
||||
while (!IS_NIL(rbt,x_cur))
|
||||
{
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(xcur), KLEN(xcur));
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur));
|
||||
if (n == 0)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case UPSERT:
|
||||
case UPDATE:
|
||||
return change_pair_val (rbt, xcur, vptr, vlen);
|
||||
return change_pair_val (rbt, x_cur, vptr, vlen);
|
||||
|
||||
case ENSERT:
|
||||
/* return existing pair */
|
||||
return xcur;
|
||||
return x_cur;
|
||||
|
||||
case INSERT:
|
||||
/* return failure */
|
||||
@ -535,44 +535,44 @@ static pair_t* insert (
|
||||
}
|
||||
}
|
||||
|
||||
xpar = xcur;
|
||||
x_par = x_cur;
|
||||
|
||||
if (n > 0) xcur = xcur->right;
|
||||
else /* if (n < 0) */ xcur = xcur->left;
|
||||
if (n > 0) x_cur = x_cur->right;
|
||||
else /* if (n < 0) */ x_cur = x_cur->left;
|
||||
}
|
||||
|
||||
if (opt == UPDATE) return QSE_NULL;
|
||||
|
||||
xnew = qse_rbt_allocpair (rbt, kptr, klen, vptr, vlen);
|
||||
if (xnew == QSE_NULL) return QSE_NULL;
|
||||
x_new = qse_rbt_allocpair (rbt, kptr, klen, vptr, vlen);
|
||||
if (x_new == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (xpar == QSE_NULL)
|
||||
if (x_par == QSE_NULL)
|
||||
{
|
||||
/* the tree contains no pair */
|
||||
QSE_ASSERT (rbt->root == &rbt->nil);
|
||||
rbt->root = xnew;
|
||||
rbt->root = x_new;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* perform normal binary insert */
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(xpar), KLEN(xpar));
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par));
|
||||
if (n > 0)
|
||||
{
|
||||
QSE_ASSERT (xpar->right == &rbt->nil);
|
||||
xpar->right = xnew;
|
||||
QSE_ASSERT (x_par->right == &rbt->nil);
|
||||
x_par->right = x_new;
|
||||
}
|
||||
else
|
||||
{
|
||||
QSE_ASSERT (xpar->left == &rbt->nil);
|
||||
xpar->left = xnew;
|
||||
QSE_ASSERT (x_par->left == &rbt->nil);
|
||||
x_par->left = x_new;
|
||||
}
|
||||
|
||||
xnew->parent = xpar;
|
||||
adjust (rbt, xnew);
|
||||
x_new->parent = x_par;
|
||||
adjust (rbt, x_new);
|
||||
}
|
||||
|
||||
rbt->root->color = QSE_RBT_BLACK;
|
||||
return xnew;
|
||||
return x_new;
|
||||
}
|
||||
|
||||
pair_t* qse_rbt_upsert (
|
||||
@ -603,95 +603,95 @@ pair_t* qse_rbt_update (
|
||||
pair_t* qse_rbt_cbsert (
|
||||
rbt_t* rbt, void* kptr, size_t klen, cbserter_t cbserter, void* ctx)
|
||||
{
|
||||
pair_t* xcur = rbt->root;
|
||||
pair_t* xpar = QSE_NULL;
|
||||
pair_t* xnew;
|
||||
pair_t* x_cur = rbt->root;
|
||||
pair_t* x_par = QSE_NULL;
|
||||
pair_t* x_new;
|
||||
|
||||
while (!IS_NIL(rbt,xcur))
|
||||
while (!IS_NIL(rbt,x_cur))
|
||||
{
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(xcur), KLEN(xcur));
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur));
|
||||
if (n == 0)
|
||||
{
|
||||
/* back up the contents of the current pair
|
||||
* in case it is reallocated */
|
||||
pair_t tmp = *xcur;
|
||||
pair_t tmp = *x_cur;
|
||||
|
||||
/* call the callback function to manipulate the pair */
|
||||
xnew = cbserter (rbt, xcur, kptr, klen, ctx);
|
||||
if (xnew == QSE_NULL)
|
||||
x_new = cbserter (rbt, x_cur, kptr, klen, ctx);
|
||||
if (x_new == QSE_NULL)
|
||||
{
|
||||
/* error returned by the callback function */
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
if (xnew != xcur)
|
||||
if (x_new != x_cur)
|
||||
{
|
||||
/* the current pair has been reallocated, which implicitly
|
||||
* means the previous contents were wiped out. so the contents
|
||||
* backed up will be used for restoration/migration */
|
||||
|
||||
xnew->color = tmp.color;
|
||||
xnew->left = tmp.left;
|
||||
xnew->right = tmp.right;
|
||||
xnew->parent = tmp.parent;
|
||||
x_new->color = tmp.color;
|
||||
x_new->left = tmp.left;
|
||||
x_new->right = tmp.right;
|
||||
x_new->parent = tmp.parent;
|
||||
|
||||
if (tmp.parent)
|
||||
{
|
||||
if (tmp.parent->left == xcur)
|
||||
if (tmp.parent->left == x_cur)
|
||||
{
|
||||
tmp.parent->left = xnew;
|
||||
tmp.parent->left = x_new;
|
||||
}
|
||||
else
|
||||
{
|
||||
QSE_ASSERT (tmp.parent->right == xcur);
|
||||
tmp.parent->right = xnew;
|
||||
QSE_ASSERT (tmp.parent->right == x_cur);
|
||||
tmp.parent->right = x_new;
|
||||
}
|
||||
}
|
||||
if (!IS_NIL(rbt,tmp.left)) tmp.left->parent = xnew;
|
||||
if (!IS_NIL(rbt,tmp.right)) tmp.right->parent = xnew;
|
||||
if (!IS_NIL(rbt,tmp.left)) tmp.left->parent = x_new;
|
||||
if (!IS_NIL(rbt,tmp.right)) tmp.right->parent = x_new;
|
||||
|
||||
if (xcur == rbt->root) rbt->root = xnew;
|
||||
if (x_cur == rbt->root) rbt->root = x_new;
|
||||
}
|
||||
|
||||
return xnew;
|
||||
return x_new;
|
||||
}
|
||||
|
||||
xpar = xcur;
|
||||
x_par = x_cur;
|
||||
|
||||
if (n > 0) xcur = xcur->right;
|
||||
else /* if (n < 0) */ xcur = xcur->left;
|
||||
if (n > 0) x_cur = x_cur->right;
|
||||
else /* if (n < 0) */ x_cur = x_cur->left;
|
||||
}
|
||||
|
||||
xnew = cbserter (rbt, QSE_NULL, kptr, klen, ctx);
|
||||
if (xnew == QSE_NULL) return QSE_NULL;
|
||||
x_new = cbserter (rbt, QSE_NULL, kptr, klen, ctx);
|
||||
if (x_new == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (xpar == QSE_NULL)
|
||||
if (x_par == QSE_NULL)
|
||||
{
|
||||
/* the tree contains no pair */
|
||||
QSE_ASSERT (rbt->root == &rbt->nil);
|
||||
rbt->root = xnew;
|
||||
rbt->root = x_new;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* perform normal binary insert */
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(xpar), KLEN(xpar));
|
||||
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par));
|
||||
if (n > 0)
|
||||
{
|
||||
QSE_ASSERT (xpar->right == &rbt->nil);
|
||||
xpar->right = xnew;
|
||||
QSE_ASSERT (x_par->right == &rbt->nil);
|
||||
x_par->right = x_new;
|
||||
}
|
||||
else
|
||||
{
|
||||
QSE_ASSERT (xpar->left == &rbt->nil);
|
||||
xpar->left = xnew;
|
||||
QSE_ASSERT (x_par->left == &rbt->nil);
|
||||
x_par->left = x_new;
|
||||
}
|
||||
|
||||
xnew->parent = xpar;
|
||||
adjust (rbt, xnew);
|
||||
x_new->parent = x_par;
|
||||
adjust (rbt, x_new);
|
||||
}
|
||||
|
||||
rbt->root->color = QSE_RBT_BLACK;
|
||||
return xnew;
|
||||
return x_new;
|
||||
}
|
||||
|
||||
|
||||
@ -910,65 +910,65 @@ static QSE_INLINE qse_rbt_walk_t walk_recursively (
|
||||
static QSE_INLINE void walk (
|
||||
rbt_t* rbt, walker_t walker, void* ctx, int l, int r)
|
||||
{
|
||||
pair_t* xcur = rbt->root;
|
||||
pair_t* x_cur = rbt->root;
|
||||
pair_t* prev = rbt->root->parent;
|
||||
|
||||
while (xcur && !IS_NIL(rbt,xcur))
|
||||
while (x_cur && !IS_NIL(rbt,x_cur))
|
||||
{
|
||||
if (prev == xcur->parent)
|
||||
if (prev == x_cur->parent)
|
||||
{
|
||||
/* the previous node is the parent of the current node.
|
||||
* it indicates that we're going down to the child[l] */
|
||||
if (!IS_NIL(rbt,xcur->child[l]))
|
||||
if (!IS_NIL(rbt,x_cur->child[l]))
|
||||
{
|
||||
/* go to the child[l] child */
|
||||
prev = xcur;
|
||||
xcur = xcur->child[l];
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->child[l];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (walker (rbt, xcur, ctx) == QSE_RBT_WALK_STOP) break;
|
||||
if (walker (rbt, x_cur, ctx) == QSE_RBT_WALK_STOP) break;
|
||||
|
||||
if (!IS_NIL(rbt,xcur->child[r]))
|
||||
if (!IS_NIL(rbt,x_cur->child[r]))
|
||||
{
|
||||
/* go down to the right node if exists */
|
||||
prev = xcur;
|
||||
xcur = xcur->child[r];
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->child[r];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* otherwise, move up to the parent */
|
||||
prev = xcur;
|
||||
xcur = xcur->parent;
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (prev == xcur->child[l])
|
||||
else if (prev == x_cur->child[l])
|
||||
{
|
||||
/* the left child has been already traversed */
|
||||
|
||||
if (walker (rbt, xcur, ctx) == QSE_RBT_WALK_STOP) break;
|
||||
if (walker (rbt, x_cur, ctx) == QSE_RBT_WALK_STOP) break;
|
||||
|
||||
if (!IS_NIL(rbt,xcur->child[r]))
|
||||
if (!IS_NIL(rbt,x_cur->child[r]))
|
||||
{
|
||||
/* go down to the right node if it exists */
|
||||
prev = xcur;
|
||||
xcur = xcur->child[r];
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->child[r];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* otherwise, move up to the parent */
|
||||
prev = xcur;
|
||||
xcur = xcur->parent;
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->parent;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* both the left child and the right child have been traversed */
|
||||
QSE_ASSERT (prev == xcur->child[r]);
|
||||
QSE_ASSERT (prev == x_cur->child[r]);
|
||||
/* just move up to the parent */
|
||||
prev = xcur;
|
||||
xcur = xcur->parent;
|
||||
prev = x_cur;
|
||||
x_cur = x_cur->parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: rex.c 471 2011-05-22 14:14:36Z hyunghwan.chung $
|
||||
* $Id: rex.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -497,7 +497,7 @@ struct ccinfo_t
|
||||
|
||||
static int cc_isalnum (exec_t* e, qse_char_t c) { return QSE_ISALNUM (c); }
|
||||
static int cc_isalpha (exec_t* e, qse_char_t c) { return QSE_ISALPHA (c); }
|
||||
static int cc_isblank (exec_t* e, qse_char_t c) { return ISBLANK(c); }
|
||||
static int cc_isblank (exec_t* e, qse_char_t c) { return QSE_ISBLANK(c); }
|
||||
static int cc_iscntrl (exec_t* e, qse_char_t c) { return QSE_ISCNTRL (c); }
|
||||
static int cc_isdigit (exec_t* e, qse_char_t c) { return QSE_ISDIGIT (c); }
|
||||
static int cc_isgraph (exec_t* e, qse_char_t c) { return QSE_ISGRAPH (c); }
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: str_cnv.c 504 2011-07-11 16:31:33Z hyunghwan.chung $
|
||||
* $Id: str_cnv.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -134,18 +134,24 @@ qse_ulong_t qse_strxtoulong (const qse_char_t* str, qse_size_t len)
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TODO: fix wrong mbstate handling
|
||||
*/
|
||||
|
||||
qse_size_t qse_mbstowcslen (const qse_mchar_t* mcs, qse_size_t* wcslen)
|
||||
{
|
||||
qse_wchar_t wc;
|
||||
qse_size_t n, ml, wl = 0;
|
||||
const qse_mchar_t* p = mcs;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
while (*p != '\0') p++;
|
||||
ml = p - mcs;
|
||||
|
||||
for (p = mcs; ml > 0; p += n, ml -= n)
|
||||
{
|
||||
n = qse_mbtowc (p, ml, &wc);
|
||||
n = qse_mbrtowc (p, ml, &wc, &state);
|
||||
/* insufficient input or wrong sequence */
|
||||
if (n == 0 || n > ml) break;
|
||||
wl++;
|
||||
@ -155,15 +161,17 @@ qse_size_t qse_mbstowcslen (const qse_mchar_t* mcs, qse_size_t* wcslen)
|
||||
return p - mcs;
|
||||
}
|
||||
|
||||
qse_size_t qse_mbsntowcsnlen (const qse_mchar_t* mcs, qse_size_t mcslen, qse_size_t* wcslen)
|
||||
qse_size_t qse_mbsntowcsnlen (
|
||||
const qse_mchar_t* mcs, qse_size_t mcslen, qse_size_t* wcslen)
|
||||
{
|
||||
qse_wchar_t wc;
|
||||
qse_size_t n, ml = mcslen, wl = 0;
|
||||
const qse_mchar_t* p = mcs;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
for (p = mcs; ml > 0; p += n, ml -= n)
|
||||
{
|
||||
n = qse_mbtowc (p, ml, &wc);
|
||||
n = qse_mbrtowc (p, ml, &wc, &state);
|
||||
/* insufficient or invalid sequence */
|
||||
if (n == 0 || n > ml) break;
|
||||
wl++;
|
||||
@ -212,12 +220,13 @@ qse_size_t qse_mbsntowcsn (
|
||||
qse_size_t mlen = mbslen, n;
|
||||
const qse_mchar_t* p;
|
||||
qse_wchar_t* q, * qend ;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
qend = wcs + *wcslen;
|
||||
|
||||
for (p = mbs, q = wcs; mlen > 0 && q < qend; p += n, mlen -= n)
|
||||
{
|
||||
n = qse_mbtowc (p, mlen, q);
|
||||
n = qse_mbrtowc (p, mlen, q, &state);
|
||||
if (n == 0 || n > mlen)
|
||||
{
|
||||
/* wrong sequence or insufficient input */
|
||||
@ -236,10 +245,11 @@ qse_size_t qse_wcstombslen (const qse_wchar_t* wcs, qse_size_t* mbslen)
|
||||
const qse_wchar_t* p = wcs;
|
||||
qse_mchar_t mbs[32];
|
||||
qse_size_t mlen = 0;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
while (*p != QSE_WT('\0'))
|
||||
{
|
||||
qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs));
|
||||
qse_size_t n = qse_wcrtomb (*p, mbs, QSE_COUNTOF(mbs), &state);
|
||||
if (n == 0) break; /* illegal character */
|
||||
|
||||
/* it assumes that mbs is large enough to hold a character */
|
||||
@ -265,10 +275,11 @@ qse_size_t qse_wcsntombsnlen (
|
||||
const qse_wchar_t* end = wcs + wcslen;
|
||||
qse_mchar_t mbs[32];
|
||||
qse_size_t mlen = 0;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
while (p < end)
|
||||
{
|
||||
qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs));
|
||||
qse_size_t n = qse_wcrtomb (*p, mbs, QSE_COUNTOF(mbs), &state);
|
||||
if (n == 0) break; /* illegal character */
|
||||
|
||||
/* it assumes that mbs is large enough to hold a character */
|
||||
@ -291,10 +302,11 @@ qse_size_t qse_wcstombs (
|
||||
{
|
||||
const qse_wchar_t* p = wcs;
|
||||
qse_size_t rem = *mbslen;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
while (*p != QSE_WT('\0') && rem > 1)
|
||||
{
|
||||
qse_size_t n = qse_wctomb (*p, mbs, rem);
|
||||
qse_size_t n = qse_wcrtomb (*p, mbs, rem, &state);
|
||||
if (n == 0 || n > rem)
|
||||
{
|
||||
/* illegal character or buffer not enough */
|
||||
@ -330,10 +342,11 @@ qse_size_t qse_wcsntombsn (
|
||||
const qse_wchar_t* p = wcs;
|
||||
const qse_wchar_t* end = wcs + wcslen;
|
||||
qse_size_t len = *mbslen;
|
||||
qse_mbstate_t state = {{ 0, }};
|
||||
|
||||
while (p < end && len > 0)
|
||||
{
|
||||
qse_size_t n = qse_wctomb (*p, mbs, len);
|
||||
qse_size_t n = qse_wcrtomb (*p, mbs, len, &state);
|
||||
if (n == 0 || n > len)
|
||||
{
|
||||
/* illegal character or buffer not enough */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio_get.c 441 2011-04-22 14:28:43Z hyunghwan.chung $
|
||||
* $Id: tio_get.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -79,7 +79,8 @@ static qse_ssize_t tio_getc (qse_tio_t* tio, qse_char_t* c)
|
||||
#else
|
||||
left = tio->inbuf_len - tio->inbuf_curp;
|
||||
|
||||
n = qse_mbtowc (&tio->inbuf[tio->inbuf_curp], left, &curc);
|
||||
n = qse_mbrtowc (
|
||||
&tio->inbuf[tio->inbuf_curp], left, &curc, &tio->mbstate.in);
|
||||
if (n == 0)
|
||||
{
|
||||
/* illegal sequence */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio_put.c 441 2011-04-22 14:28:43Z hyunghwan.chung $
|
||||
* $Id: tio_put.c 554 2011-08-22 05:26:26Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -23,9 +23,9 @@
|
||||
|
||||
static qse_ssize_t tio_putc (qse_tio_t* tio, qse_char_t c)
|
||||
{
|
||||
#ifndef QSE_CHAR_IS_MCHAR
|
||||
#ifdef QSE_CHAR_IS_WCHAR
|
||||
qse_size_t n, i;
|
||||
qse_mchar_t mc[50];
|
||||
qse_mchar_t mc[QSE_MBLEN_MAX];
|
||||
#endif
|
||||
|
||||
if (tio->outbuf_len >= QSE_COUNTOF(tio->outbuf))
|
||||
@ -38,12 +38,14 @@ static qse_ssize_t tio_putc (qse_tio_t* tio, qse_char_t c)
|
||||
}
|
||||
|
||||
#ifdef QSE_CHAR_IS_MCHAR
|
||||
|
||||
tio->outbuf[tio->outbuf_len++] = c;
|
||||
if (tio->outbuf_len >= QSE_COUNTOF(tio->outbuf))
|
||||
return qse_tio_flush (tio);
|
||||
#else
|
||||
|
||||
n = qse_wctomb (c, mc, QSE_COUNTOF(mc));
|
||||
#else /* QSE_CHAR_IS_WCHAR */
|
||||
|
||||
n = qse_wcrtomb (c, mc, QSE_COUNTOF(mc), &tio->mbstate.out);
|
||||
if (n == 0)
|
||||
{
|
||||
tio->errnum = QSE_TIO_EILCHR;
|
||||
@ -63,6 +65,7 @@ static qse_ssize_t tio_putc (qse_tio_t* tio, qse_char_t c)
|
||||
if (qse_tio_flush (tio) == -1) return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (c == QSE_T('\n') && tio->outbuf_len > 0)
|
||||
|
@ -521,6 +521,13 @@ static void* _realloc_merge (qse_xma_t* xma, void* b, qse_size_t size)
|
||||
return b;
|
||||
}
|
||||
|
||||
void* qse_xma_calloc (qse_xma_t* xma, qse_size_t size)
|
||||
{
|
||||
void* ptr = qse_xma_alloc (xma, size);
|
||||
if (size) QSE_MEMSET (ptr, 0, size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* qse_xma_realloc (qse_xma_t* xma, void* b, qse_size_t size)
|
||||
{
|
||||
void* n;
|
||||
|
@ -38,10 +38,11 @@ host_triplet = @host@
|
||||
subdir = lib/cut
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -167,7 +167,7 @@ void qse_cut_clear (qse_cut_t* cut)
|
||||
int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
{
|
||||
const qse_char_t* p = str;
|
||||
const qse_char_t* xnd = str + len;
|
||||
const qse_char_t* lastp = str + len;
|
||||
qse_cint_t c;
|
||||
int sel = QSE_SED_SEL_CHAR;
|
||||
|
||||
@ -189,13 +189,13 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
if (len <= 0) return 0;
|
||||
|
||||
/* compile the selector string */
|
||||
xnd--; c = CC (p, xnd);
|
||||
lastp--; c = CC (p, lastp);
|
||||
while (1)
|
||||
{
|
||||
qse_size_t start = 0, end = 0;
|
||||
int mask = 0;
|
||||
|
||||
while (QSE_ISSPACE(c)) c = NC (p, xnd);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, lastp);
|
||||
if (EOF(c))
|
||||
{
|
||||
if (cut->sel.count > 0)
|
||||
@ -212,7 +212,7 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
/* the next character is the input delimiter.
|
||||
* the output delimiter defaults to the input
|
||||
* delimiter. */
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
if (EOF(c))
|
||||
{
|
||||
SETERR0 (cut, QSE_CUT_ESELNV);
|
||||
@ -221,13 +221,13 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
cut->sel.din = c;
|
||||
cut->sel.dout = c;
|
||||
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
}
|
||||
else if (c == QSE_T('D'))
|
||||
{
|
||||
/* the next two characters are the input and
|
||||
* the output delimiter each. */
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
if (EOF(c))
|
||||
{
|
||||
SETERR0 (cut, QSE_CUT_ESELNV);
|
||||
@ -235,7 +235,7 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
}
|
||||
cut->sel.din = c;
|
||||
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
if (EOF(c))
|
||||
{
|
||||
SETERR0 (cut, QSE_CUT_ESELNV);
|
||||
@ -243,15 +243,15 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
}
|
||||
cut->sel.dout = c;
|
||||
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (c == QSE_T('c') || c == QSE_T('f'))
|
||||
{
|
||||
sel = c;
|
||||
c = NC (p, xnd);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, lastp);
|
||||
}
|
||||
|
||||
if (QSE_ISDIGIT(c))
|
||||
@ -259,33 +259,33 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
do
|
||||
{
|
||||
start = start * 10 + (c - QSE_T('0'));
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
}
|
||||
while (QSE_ISDIGIT(c));
|
||||
|
||||
while (QSE_ISSPACE(c)) c = NC (p, xnd);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, lastp);
|
||||
mask |= MASK_START;
|
||||
}
|
||||
else start++;
|
||||
|
||||
if (c == QSE_T('-'))
|
||||
{
|
||||
c = NC (p, xnd);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, lastp);
|
||||
|
||||
if (QSE_ISDIGIT(c))
|
||||
{
|
||||
do
|
||||
{
|
||||
end = end * 10 + (c - QSE_T('0'));
|
||||
c = NC (p, xnd);
|
||||
c = NC (p, lastp);
|
||||
}
|
||||
while (QSE_ISDIGIT(c));
|
||||
mask |= MASK_END;
|
||||
}
|
||||
else end = MAX;
|
||||
|
||||
while (QSE_ISSPACE(c)) c = NC (p, xnd);
|
||||
while (QSE_ISSPACE(c)) c = NC (p, lastp);
|
||||
}
|
||||
else end = start;
|
||||
|
||||
@ -313,7 +313,7 @@ int qse_cut_comp (qse_cut_t* cut, const qse_char_t* str, qse_size_t len)
|
||||
}
|
||||
|
||||
if (EOF(c)) break;
|
||||
if (c == QSE_T(',')) c = NC (p, xnd);
|
||||
if (c == QSE_T(',')) c = NC (p, lastp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -37,10 +37,11 @@ host_triplet = @host@
|
||||
subdir = lib/net
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -38,10 +38,11 @@ host_triplet = @host@
|
||||
subdir = lib/sed
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
@ -37,10 +37,11 @@ host_triplet = @host@
|
||||
subdir = lib/stx
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_numval.m4 \
|
||||
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
|
Reference in New Issue
Block a user