interim commit while writing qse_pio_t functions.

- enhanced qse_pio_init() to handle a wide character string.
- added qse_wcsntombsnlen().
This commit is contained in:
2009-01-11 09:25:33 +00:00
parent c010af38cb
commit cf09e22560
15 changed files with 289 additions and 230 deletions

View File

@ -871,7 +871,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
/* check if it coincides to be a global variable name */
g = find_global (awk, name, name_len);
if (g != QSE_LDA_INVALID)
if (g != QSE_LDA_NIL)
{
SETERRARG (
awk, QSE_AWK_EGBLRED, awk->token.line,
@ -952,7 +952,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
/* check if a parameter conflicts with other parameters */
if (qse_lda_search (awk->parse.params,
0, param, param_len) != QSE_LDA_INVALID)
0, param, param_len) != QSE_LDA_NIL)
{
QSE_AWK_FREE (awk, name_dup);
qse_lda_clear (awk->parse.params);
@ -977,7 +977,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk)
if (qse_lda_insert (
awk->parse.params,
QSE_LDA_SIZE(awk->parse.params),
param, param_len) == QSE_LDA_INVALID)
param, param_len) == QSE_LDA_NIL)
{
QSE_AWK_FREE (awk, name_dup);
qse_lda_clear (awk->parse.params);
@ -1397,7 +1397,7 @@ int qse_awk_initglobals (qse_awk_t* awk)
QSE_LDA_SIZE(awk->parse.globals),
(qse_char_t*)gtab[id].name,
gtab[id].name_len);
if (g == QSE_LDA_INVALID) return -1;
if (g == QSE_LDA_NIL) return -1;
QSE_ASSERT ((int)g == id);
@ -1479,7 +1479,7 @@ static qse_size_t get_global (
cg.name.ptr = name;
cg.name.len = len;
cg.index = QSE_LDA_INVALID;
cg.index = QSE_LDA_NIL;
cg.walk = QSE_LDA_WALK_BACKWARD;
/* return qse_lda_rsearch (
@ -1497,7 +1497,7 @@ static qse_size_t find_global (
cg.name.ptr = name;
cg.name.len = len;
cg.index = QSE_LDA_INVALID;
cg.index = QSE_LDA_NIL;
cg.walk = QSE_LDA_WALK_FORWARD;
/* return qse_lda_search (awk->parse.globals, 0, name, len); */
@ -1548,7 +1548,7 @@ static int add_global (
#endif
/* check if it conflicts with other global variable names */
if (find_global (awk, name, len) != QSE_LDA_INVALID)
if (find_global (awk, name, len) != QSE_LDA_NIL)
{
SETERRARG (awk, QSE_AWK_EDUPGBL, line, name, len);
return -1;
@ -1563,7 +1563,7 @@ static int add_global (
if (qse_lda_insert (awk->parse.globals,
QSE_LDA_SIZE(awk->parse.globals),
(qse_char_t*)name, len) == QSE_LDA_INVALID)
(qse_char_t*)name, len) == QSE_LDA_NIL)
{
SETERRLIN (awk, QSE_AWK_ENOMEM, line);
return -1;
@ -1625,7 +1625,7 @@ int qse_awk_delglobal (
n = qse_lda_search (awk->parse.globals,
QSE_AWK_NUM_STATIC_GLOBALS, name, len);
if (n == QSE_LDA_INVALID)
if (n == QSE_LDA_NIL)
{
SETERRARG (awk, QSE_AWK_ENOENT, 0, name, len);
return -1;
@ -1748,7 +1748,7 @@ static qse_awk_t* collect_locals (
{
/* check if it conflicts with a paremeter name */
n = qse_lda_search (awk->parse.params, 0, local.ptr, local.len);
if (n != QSE_LDA_INVALID)
if (n != QSE_LDA_NIL)
{
SETERRARG (
awk, QSE_AWK_EPARRED, awk->token.line,
@ -1762,7 +1762,7 @@ static qse_awk_t* collect_locals (
awk->parse.locals,
nlocals, /*((awk->option&QSE_AWK_SHADING)? nlocals:0)*/
local.ptr, local.len);
if (n != QSE_LDA_INVALID)
if (n != QSE_LDA_NIL)
{
SETERRARG (
awk, QSE_AWK_EDUPLCL, awk->token.line,
@ -1772,7 +1772,7 @@ static qse_awk_t* collect_locals (
/* check if it conflicts with global variable names */
n = find_global (awk, local.ptr, local.len);
if (n != QSE_LDA_INVALID)
if (n != QSE_LDA_NIL)
{
if (n < awk->tree.nbglobals)
{
@ -1804,7 +1804,7 @@ static qse_awk_t* collect_locals (
if (qse_lda_insert (
awk->parse.locals,
QSE_LDA_SIZE(awk->parse.locals),
local.ptr, local.len) == QSE_LDA_INVALID)
local.ptr, local.len) == QSE_LDA_NIL)
{
SETERRLIN (awk, QSE_AWK_ENOMEM, awk->token.line);
return QSE_NULL;
@ -3211,7 +3211,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line)
if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup);
return (qse_awk_nde_t*)nde;
}
else if ((idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name_dup, name_len)) != QSE_LDA_INVALID)
else if ((idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name_dup, name_len)) != QSE_LDA_NIL)
{
/* local variable */
@ -3245,7 +3245,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line)
return (qse_awk_nde_t*)nde;
}
else if ((idxa = qse_lda_search (awk->parse.params, 0, name_dup, name_len)) != QSE_LDA_INVALID)
else if ((idxa = qse_lda_search (awk->parse.params, 0, name_dup, name_len)) != QSE_LDA_NIL)
{
/* parameter */
@ -3279,7 +3279,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line)
return (qse_awk_nde_t*)nde;
}
else if ((idxa = get_global (awk, name_dup, name_len)) != QSE_LDA_INVALID)
else if ((idxa = get_global (awk, name_dup, name_len)) != QSE_LDA_NIL)
{
/* global variable */
@ -3486,7 +3486,7 @@ static qse_awk_nde_t* parse_hashidx (
/* search the local variable list */
idxa = qse_lda_rsearch (awk->parse.locals, QSE_LDA_SIZE(awk->parse.locals), name, name_len);
if (idxa != QSE_LDA_INVALID)
if (idxa != QSE_LDA_NIL)
{
nde->type = QSE_AWK_NDE_LOCALIDX;
nde->line = line;
@ -3502,7 +3502,7 @@ static qse_awk_nde_t* parse_hashidx (
/* search the parameter name list */
idxa = qse_lda_search (awk->parse.params, 0, name, name_len);
if (idxa != QSE_LDA_INVALID)
if (idxa != QSE_LDA_NIL)
{
nde->type = QSE_AWK_NDE_ARGIDX;
nde->line = line;
@ -3518,7 +3518,7 @@ static qse_awk_nde_t* parse_hashidx (
/* gets the global variable index */
idxa = get_global (awk, name, name_len);
if (idxa != QSE_LDA_INVALID)
if (idxa != QSE_LDA_NIL)
{
nde->type = QSE_AWK_NDE_GLOBALIDX;
nde->line = line;

View File

@ -4,7 +4,7 @@ AM_CFLAGS = -I$(top_builddir)/include
lib_LTLIBRARIES = libqsecmn.la
libqsecmn_la_SOURCES = mem.h chr.h \
mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c \
mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c str_utl.c \
lda.c map.c sll.c dll.c opt.c \
fio.c pio.c sio.c tio.c tio_get.c tio_put.c \
time.c \

View File

@ -52,9 +52,9 @@ libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libqsecmn_la_DEPENDENCIES =
am_libqsecmn_la_OBJECTS = mem.lo chr.lo chr_cnv.lo rex.lo str_bas.lo \
str_cnv.lo str_dyn.lo lda.lo map.lo sll.lo dll.lo opt.lo \
fio.lo pio.lo sio.lo tio.lo tio_get.lo tio_put.lo time.lo \
misc.lo
str_cnv.lo str_dyn.lo str_utl.lo lda.lo map.lo sll.lo dll.lo \
opt.lo fio.lo pio.lo sio.lo tio.lo tio_get.lo tio_put.lo \
time.lo misc.lo
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -196,7 +196,7 @@ AUTOMAKE_OPTIONS = nostdinc
AM_CFLAGS = -I$(top_builddir)/include
lib_LTLIBRARIES = libqsecmn.la
libqsecmn_la_SOURCES = mem.h chr.h \
mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c \
mem.c chr.c chr_cnv.c rex.c str_bas.c str_cnv.c str_dyn.c str_utl.c \
lda.c map.c sll.c dll.c opt.c \
fio.c pio.c sio.c tio.c tio_get.c tio_put.c \
time.c \
@ -289,6 +289,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_bas.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_cnv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_dyn.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_utl.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tio_get.Plo@am__quote@

View File

@ -34,7 +34,6 @@
#define TOB(lda,len) ((len)*(lda)->scale)
#define DPTR(node) ((node)->dptr)
#define DLEN(node) ((node)->dlen)
#define INVALID QSE_LDA_INVALID
static int comp_data (lda_t* lda,
const void* dptr1, size_t dlen1,
@ -308,7 +307,7 @@ size_t qse_lda_search (lda_t* lda, size_t pos, const void* dptr, size_t dlen)
dptr, dlen) == 0) return i;
}
return INVALID;
return QSE_LDA_NIL;
}
size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen)
@ -329,7 +328,7 @@ size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen)
}
}
return INVALID;
return QSE_LDA_NIL;
}
size_t qse_lda_upsert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
@ -345,7 +344,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
/* allocate the node first */
node = alloc_node (lda, dptr, dlen);
if (node == QSE_NULL) return INVALID;
if (node == QSE_NULL) return QSE_LDA_NIL;
/* do resizeing if necessary.
* resizing is performed after node allocation because that way, it
@ -378,7 +377,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
if (lda->freeer)
lda->freeer (lda, DPTR(node), DLEN(node));
QSE_MMGR_FREE (lda->mmgr, node);
return INVALID;
return QSE_LDA_NIL;
}
}
@ -388,7 +387,7 @@ size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen)
if (lda->freeer)
lda->freeer (lda, DPTR(node), DLEN(node));
QSE_MMGR_FREE (lda->mmgr, node);
return INVALID;
return QSE_LDA_NIL;
}
/* fill in the gap with QSE_NULL */
@ -410,14 +409,14 @@ size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen)
{
node_t* c;
if (pos >= lda->size) return INVALID;
if (pos >= lda->size) return QSE_LDA_NIL;
c = lda->node[pos];
if (c == QSE_NULL)
{
/* no previous data */
lda->node[pos] = alloc_node (lda, dptr, dlen);
if (lda->node[pos] == QSE_NULL) return INVALID;
if (lda->node[pos] == QSE_NULL) return QSE_LDA_NIL;
}
else
{
@ -430,7 +429,7 @@ size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen)
{
/* updated to different data */
node_t* node = alloc_node (lda, dptr, dlen);
if (node == QSE_NULL) return INVALID;
if (node == QSE_NULL) return QSE_LDA_NIL;
if (lda->freeer != QSE_NULL)
lda->freeer (lda, DPTR(c), DLEN(c));

View File

@ -17,6 +17,7 @@
*/
#include <qse/cmn/pio.h>
#include <qse/cmn/str.h>
#include "mem.h"
#ifdef _WIN32
@ -67,7 +68,15 @@ qse_pio_t* qse_pio_init (
qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags)
{
qse_pio_pid_t pid;
qse_pio_hnd_t handle[6] = { -1, -1, -1, -1, -1, -1 };
qse_pio_hnd_t handle[6] =
{
QSE_PIO_HND_NIL,
QSE_PIO_HND_NIL,
QSE_PIO_HND_NIL,
QSE_PIO_HND_NIL,
QSE_PIO_HND_NIL,
QSE_PIO_HND_NIL
};
int i, minidx = -1, maxidx = -1;
QSE_ASSERT (QSE_COUNTOF(pio->hanlde) == QSE_COUNTOF(handle));
@ -107,6 +116,14 @@ qse_pio_t* qse_pio_init (
{
/* child */
qse_pio_hnd_t devnull;
qse_mchar_t* mcmd;
extern char** environ;
int fcnt = 0;
#ifndef QSE_CHAR_IS_MCHAR
qse_size_t n, mn, wl;
qse_char_t* wcmd = QSE_NULL;
qse_mchar_t buf[64];
#endif
if (flags & QSE_PIO_WRITEIN)
{
@ -171,40 +188,88 @@ qse_pio_t* qse_pio_init (
if (flags & QSE_PIO_DROPOUT) QSE_CLOSE(1);
if (flags & QSE_PIO_DROPERR) QSE_CLOSE(2);
#ifdef QSE_CHAR_IS_MCHAR
if (flags & QSE_PIO_SHELL) mcmd = (qse_char_t*)cmd;
else
{
mcmd = qse_strdup (cmd, pio->mmgr);
if (mcmd == QSE_NULL) goto child_oops;
fcnt = qse_strspl (mcmd, QSE_T(""),
QSE_T('\"'), QSE_T('\"'), QSE_T('\''));
if (fcnt <= 0)
{
/* no field or an error */
goto child_oops;
}
}
#else
if (flags & QSE_PIO_SHELL)
{
const qse_mchar_t* mcmd;
qse_mchar_t* argv[4];
extern char** environ;
#ifdef QSE_CHAR_IS_MCHAR
mcmd = cmd;
#else
qse_size_t n, mn;
qse_mchar_t buf[64];
n = qse_wcstombslen (cmd, &mn);
n = qse_wcstombslen (cmd, &mn);
if (cmd[n] != QSE_WT('\0'))
{
/* cmd has illegal sequence */
goto child_oops;
}
}
else
{
wcmd = qse_strdup (cmd, pio->mmgr);
if (wcmd == QSE_NULL) goto child_oops;
mn = mn + 1;
if (mn <= QSE_COUNTOF(buf))
fcnt = qse_strspl (wcmd, QSE_T(""),
QSE_T('\"'), QSE_T('\"'), QSE_T('\''));
if (fcnt <= 0)
{
mcmd = buf;
mn = QSE_COUNTOF(buf);
/* no field or an error */
goto child_oops;
}
else
for (wl = 0, n = fcnt; n > 0; )
{
mcmd = QSE_MMGR_ALLOC (
pio->mmgr, mn*QSE_SIZEOF(*mcmd));
if (mcmd == QSE_NULL) goto child_oops;
if (wcmd[wl++] == QSE_T('\0')) n--;
}
n = qse_wcstombs (cmd, mcmd, &mn);
n = qse_wcsntombsnlen (wcmd, wl, &mn);
if (n != wl) goto child_oops;
}
mn = mn + 1;
if (mn <= QSE_COUNTOF(buf))
{
mcmd = buf;
mn = QSE_COUNTOF(buf);
}
else
{
mcmd = QSE_MMGR_ALLOC (
pio->mmgr, mn*QSE_SIZEOF(*mcmd));
if (mcmd == QSE_NULL) goto child_oops;
}
if (flags & QSE_PIO_SHELL)
{
/* qse_wcstombs() should succeed as
* qse_wcstombslen() was successful above */
qse_wcstombs (cmd, mcmd, &mn);
/* qse_wcstombs() null-terminate mcmd */
}
else
{
QSE_ASSERT (wcmd != QSE_NULL);
/* qse_wcsntombsn() should succeed as
* qse_wcsntombsnlen() was successful above */
qse_wcsntombsn (wcmd, wl, mcmd, &mn);
/* qse_wcsntombsn() doesn't null-terminate mcmd */
mcmd[mn] = QSE_MT('\0');
}
#endif
if (flags & QSE_PIO_SHELL)
{
const qse_mchar_t* argv[4];
argv[0] = QSE_MT("/bin/sh");
argv[1] = QSE_MT("-c");
@ -215,14 +280,26 @@ qse_pio_t* qse_pio_init (
}
else
{
/* TODO: need to parse the command in a simple manner */
QSE_EXECVE (mcmd, argv, environ);
int i;
qse_mchar_t** argv;
argv = QSE_MMGR_ALLOC (pio->mmgr, (fcnt+1)*QSE_SIZEOF(argv[0]));
if (argv == QSE_NULL) goto child_oops;
for (i = 0; i < fcnt; i++)
{
argv[i] = mcmd;
while (*mcmd != QSE_MT('\0')) mcmd++;
mcmd++;
}
argv[i] = QSE_NULL;
QSE_EXECVE (argv[0], argv, environ);
}
child_oops:
QSE_EXIT(127);
}
#endif
/* parent */
pio->child = pid;
@ -235,7 +312,7 @@ qse_pio_t* qse_pio_init (
* X
* WRITE => 1
*/
QSE_CLOSE (handle[0]); handle[0] = -1;
QSE_CLOSE (handle[0]); handle[0] = QSE_PIO_HND_NIL;
}
if (flags & QSE_PIO_READOUT)
@ -246,7 +323,7 @@ qse_pio_t* qse_pio_init (
* X
* READ => 2
*/
QSE_CLOSE (handle[3]); handle[3] = -1;
QSE_CLOSE (handle[3]); handle[3] = QSE_PIO_HND_NIL;
}
if (flags & QSE_PIO_READERR)
@ -257,7 +334,7 @@ qse_pio_t* qse_pio_init (
* X
* READ => 4
*/
QSE_CLOSE (handle[5]); handle[5] = -1;
QSE_CLOSE (handle[5]); handle[5] = QSE_PIO_HND_NIL;
}
#endif
@ -303,7 +380,7 @@ int qse_pio_wait (qse_pio_t* pio)
while (1)
{
n = waitpid (pio->child, &status, opt);
n = QSE_WAITPID (pio->child, &status, opt);
if (n == 0) break;
/* TODO: .... */
}
@ -315,13 +392,13 @@ int qse_pio_wait (qse_pio_t* pio)
return -1;
}
qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio, int hid)
qse_pio_hnd_t qse_pio_gethandle (qse_pio_t* pio, qse_pio_hid_t hid)
{
return pio->handle[hid];
}
qse_ssize_t qse_pio_read (
qse_pio_t* pio, void* buf, qse_size_t size, int hid)
qse_pio_t* pio, void* buf, qse_size_t size, qse_pio_hid_t hid)
{
#ifdef _WIN32
DWORD count;
@ -329,7 +406,7 @@ qse_ssize_t qse_pio_read (
if (ReadFile(pio->handle, buf, size, &count, QSE_NULL) == FALSE) return -1;
return (qse_ssize_t)count;
#else
if (pio->handle[hid] == -1)
if (pio->handle[hid] == QSE_PIO_HND_NIL)
{
/* the stream is already closed */
return (qse_ssize_t)-1;
@ -341,7 +418,7 @@ qse_ssize_t qse_pio_read (
}
qse_ssize_t qse_pio_write (
qse_pio_t* pio, const void* data, qse_size_t size, int hid)
qse_pio_t* pio, const void* data, qse_size_t size, qse_pio_hid_t hid)
{
#ifdef _WIN32
DWORD count;
@ -349,7 +426,7 @@ qse_ssize_t qse_pio_write (
if (WriteFile(pio->handle, data, size, &count, QSE_NULL) == FALSE) return -1;
return (qse_ssize_t)count;
#else
if (pio->handle[hid] == -1)
if (pio->handle[hid] == QSE_PIO_HND_NIL)
{
/* the stream is already closed */
return (qse_ssize_t)-1;
@ -360,11 +437,11 @@ qse_ssize_t qse_pio_write (
#endif
}
void qse_pio_end (qse_pio_t* pio, int hid)
void qse_pio_end (qse_pio_t* pio, qse_pio_hid_t hid)
{
if (pio->handle[hid] != -1)
if (pio->handle[hid] != QSE_PIO_HND_NIL)
{
QSE_CLOSE (pio->handle[hid]);
pio->handle[hid] = -1;
pio->handle[hid] = QSE_PIO_HND_NIL;
}
}

View File

@ -186,6 +186,60 @@ qse_size_t qse_mbsntowcsn (
return p - mbs; /* returns the number of bytes processed */
}
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;
while (*p != QSE_WT('\0'))
{
qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs));
if (n == 0) break; /* illegal character */
/* it assumes that mbs is large enough to hold a character */
QSE_ASSERT (n <= QSE_COUNTOF(mbs));
p++; mlen += n;
}
/* this length excludes the terminating null character. */
*mbslen = mlen;
/* returns the number of characters handled.
* if the function has encountered an illegal character in
* the while loop above, wcs[p-wcs] will not be a null character */
return p - wcs;
}
qse_size_t qse_wcsntombsnlen (
const qse_wchar_t* wcs, qse_size_t wcslen, qse_size_t* mbslen)
{
const qse_wchar_t* p = wcs;
const qse_wchar_t* end = wcs + wcslen;
qse_mchar_t mbs[32];
qse_size_t mlen = 0;
while (p < end)
{
qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs));
if (n == 0) break; /* illegal character */
/* it assumes that mbs is large enough to hold a character */
QSE_ASSERT (n <= QSE_COUNTOF(mbs));
p++; mlen += n;
}
/* this length excludes the terminating null character. */
*mbslen = mlen;
/* returns the number of characters handled.
* if the function has encountered an illegal character in
* the while loop above, wcs[p-wcs] will not be a null character */
return p - wcs;
}
qse_size_t qse_wcstombs (
const qse_wchar_t* wcs, qse_mchar_t* mbs, qse_size_t* mbslen)
{
@ -221,32 +275,6 @@ qse_size_t qse_wcstombs (
return p - wcs;
}
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;
while (*p != QSE_WT('\0'))
{
qse_size_t n = qse_wctomb (*p, mbs, QSE_COUNTOF(mbs));
if (n == 0) break; /* illegal character */
/* it assumes that mbs is large enough to hold a character */
QSE_ASSERT (n <= QSE_COUNTOF(mbs));
p++; mlen += n;
}
/* this length excludes the terminating null character. */
*mbslen = mlen;
/* returns the number of characters handled.
* if the function has encountered an illegal character in
* the while loop above, wcs[p-wcs] will not be a null character */
return p - wcs;
}
qse_size_t qse_wcsntombsn (
const qse_wchar_t* wcs, qse_size_t wcslen,
qse_mchar_t* mbs, qse_size_t* mbslen)

View File

@ -16,18 +16,17 @@
limitations under the License.
*/
#includle <qse/cmn/str.h>
#include <qse/cmn/str.h>
#include "chr.h"
int qse_strspl (
qse_char_t* s, const qse_char_t* delim,
qse_char_t lquote, qse_char_t rquote,
qse_char_t escape, qse_size_t* count)
qse_char_t lquote, qse_char_t rquote, qse_char_t escape)
{
qse_char_t* p = s, *d;
qse_char_t* sp = QSE_NULL, * ep = QSE_NULL;
int delim_mode;
qse_size_t cnt = 0;
int cnt = 0;
if (delim == QSE_NULL) delim_mode = 0;
else
@ -258,25 +257,6 @@ exit_point:
}
*count = cnt;
return 0;
return cnt;
}
int qse_strspls (
qse_char_t* s, const qse_char_t* delim,
qse_char_t lquote, qse_char_t rquote,
qse_char_t escape, qse_size_t* count, qse_char_t* ptrs[])
{
qse_size_t cnt = *count, i;
if (qse_strspl (s, delim, lquote, rquote, escape, count) == -1) return -1;
for (i = 0; i < *count && i < cnt; i++)
{
ptrs[i] = s;
s += qse_strlen(s) + 1;
}
return 0;
}