added qse_strspl().

This commit is contained in:
hyung-hwan 2009-01-09 08:12:26 +00:00
parent 567eaa483b
commit c010af38cb
3 changed files with 306 additions and 5 deletions

View File

@ -396,12 +396,34 @@ qse_size_t qse_str_nccat (
qse_size_t len qse_size_t len
); );
/****f* qse.cmn.str/qse_strspl
* NAME
* qse_strspl - split a string
*
* SYNOPSIS
*/
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
);
/******/
/****f* qse.cmn.str/qse_mbstowcs
* NAME
* qse_mbstowcs - convert a multibyte string to a wide character string
*
* SYNOPSIS
*/
qse_size_t qse_mbstowcs ( qse_size_t qse_mbstowcs (
const qse_mchar_t* mbs, const qse_mchar_t* mbs,
qse_wchar_t* wcs, qse_wchar_t* wcs,
qse_size_t* wcslen qse_size_t* wcslen
); );
/******/
/****f* qse.cmn.str/qse_mbsntowcsn /****f* qse.cmn.str/qse_mbsntowcsn
* NAME * NAME

View File

@ -175,6 +175,7 @@ qse_pio_t* qse_pio_init (
{ {
const qse_mchar_t* mcmd; const qse_mchar_t* mcmd;
qse_mchar_t* argv[4]; qse_mchar_t* argv[4];
extern char** environ;
#ifdef QSE_CHAR_IS_MCHAR #ifdef QSE_CHAR_IS_MCHAR
mcmd = cmd; mcmd = cmd;
@ -210,16 +211,12 @@ qse_pio_t* qse_pio_init (
argv[2] = mcmd; argv[2] = mcmd;
argv[3] = QSE_NULL; argv[3] = QSE_NULL;
/* TODO: */
{
extern char** environ;
QSE_EXECVE (QSE_MT("/bin/sh"), argv, environ); QSE_EXECVE (QSE_MT("/bin/sh"), argv, environ);
} }
}
else else
{ {
/* TODO: need to parse the command in a simple manner */ /* TODO: need to parse the command in a simple manner */
//execl ("full path needed", mcmd, marg1, marg2, QSE_NULL); QSE_EXECVE (mcmd, argv, environ);
} }
child_oops: child_oops:

282
qse/lib/cmn/str_utl.c Normal file
View File

@ -0,0 +1,282 @@
/*
* $Id$
*
Copyright 2006-2008 Chung, Hyung-Hwan.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#includle <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* p = s, *d;
qse_char_t* sp = QSE_NULL, * ep = QSE_NULL;
int delim_mode;
qse_size_t cnt = 0;
if (delim == QSE_NULL) delim_mode = 0;
else
{
delim_mode = 1;
for (d = (qse_char_t*)delim; *d != QSE_T('\0'); d++)
if (!QSE_ISSPACE(*d)) delim_mode = 2;
}
if (delim_mode == 0)
{
/* skip preceding space characters */
while (QSE_ISSPACE(*p)) p++;
/* when 0 is given as "delim", it has an effect of cutting
preceding and trailing space characters off "s". */
if (lquote != QSE_T('\0') && *p == lquote)
{
qse_strcpy (p, p + 1);
for (;;)
{
if (*p == QSE_T('\0')) return -1;
if (escape != QSE_T('\0') && *p == escape)
{
qse_strcpy (p, p + 1);
}
else
{
if (*p == rquote)
{
p++;
break;
}
}
if (sp == 0) sp = p;
ep = p;
p++;
}
while (QSE_ISSPACE(*p)) p++;
if (*p != QSE_T('\0')) return -1;
if (sp == 0 && ep == 0) s[0] = QSE_T('\0');
else
{
ep[1] = QSE_T('\0');
if (s != (qse_char_t*)sp) qse_strcpy (s, sp);
cnt++;
}
}
else
{
while (*p)
{
if (!QSE_ISSPACE(*p))
{
if (sp == 0) sp = p;
ep = p;
}
p++;
}
if (sp == 0 && ep == 0) s[0] = QSE_T('\0');
else
{
ep[1] = QSE_T('\0');
if (s != (qse_char_t*)sp) qse_strcpy (s, sp);
cnt++;
}
}
}
else if (delim_mode == 1)
{
qse_char_t* o;
while (*p)
{
o = p;
while (QSE_ISSPACE(*p)) p++;
if (o != p) { qse_strcpy (o, p); p = o; }
if (lquote != QSE_T('\0') && *p == lquote)
{
qse_strcpy (p, p + 1);
for (;;)
{
if (*p == QSE_T('\0')) return -1;
if (escape != QSE_T('\0') && *p == escape)
{
qse_strcpy (p, p + 1);
}
else
{
if (*p == rquote)
{
*p++ = QSE_T('\0');
cnt++;
break;
}
}
p++;
}
}
else
{
o = p;
for (;;)
{
if (*p == QSE_T('\0'))
{
if (o != p) cnt++;
break;
}
if (QSE_ISSPACE (*p))
{
*p++ = QSE_T('\0');
cnt++;
break;
}
p++;
}
}
}
}
else /* if (delim_mode == 2) */
{
qse_char_t* o;
int ok;
while (*p != QSE_T('\0'))
{
o = p;
while (QSE_ISSPACE(*p)) p++;
if (o != p) { qse_strcpy (o, p); p = o; }
if (lquote != QSE_T('\0') && *p == lquote)
{
qse_strcpy (p, p + 1);
for (;;)
{
if (*p == QSE_T('\0')) return -1;
if (escape != QSE_T('\0') && *p == escape)
{
qse_strcpy (p, p + 1);
}
else
{
if (*p == rquote)
{
*p++ = QSE_T('\0');
cnt++;
break;
}
}
p++;
}
ok = 0;
while (QSE_ISSPACE(*p)) p++;
if (*p == QSE_T('\0')) ok = 1;
for (d = (qse_char_t*)delim; *d != QSE_T('\0'); d++)
{
if (*p == *d)
{
ok = 1;
qse_strcpy (p, p + 1);
break;
}
}
if (ok == 0) return -1;
}
else
{
o = p; sp = ep = 0;
for (;;)
{
if (*p == QSE_T('\0'))
{
if (ep)
{
ep[1] = QSE_T('\0');
p = &ep[1];
}
cnt++;
break;
}
for (d = (qse_char_t*)delim; *d != QSE_T('\0'); d++)
{
if (*p == *d)
{
if (sp == QSE_NULL)
{
qse_strcpy (o, p); p = o;
*p++ = QSE_T('\0');
}
else
{
qse_strcpy (&ep[1], p);
qse_strcpy (o, sp);
o[ep - sp + 1] = QSE_T('\0');
p = &o[ep - sp + 2];
}
cnt++;
/* last empty field after delim */
if (*p == QSE_T('\0')) cnt++;
goto exit_point;
}
}
if (!QSE_ISSPACE (*p))
{
if (sp == QSE_NULL) sp = p;
ep = p;
}
p++;
}
exit_point:
;
}
}
}
*count = cnt;
return 0;
}
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;
}