added new functions

- qse_strxfcpy(), qse_strfcpy()
cleaned up code a little
- renamed a few functions. qse_awk_strtok() to qse_awk_rtx_strtok(), etc
This commit is contained in:
2009-02-15 00:21:19 +00:00
parent 172725273c
commit 10adba9ed0
11 changed files with 321 additions and 108 deletions

View File

@ -747,12 +747,12 @@ static int fnc_split (
{
if (fs_len <= 1)
{
p = qse_awk_strxntok (run,
p = qse_awk_rtx_strxntok (run,
p, str_len, fs_ptr, fs_len, &tok, &tok_len);
}
else
{
p = qse_awk_strxntokbyrex (run, p, str_len,
p = qse_awk_rtx_strxntokbyrex (run, p, str_len,
fs_rex, &tok, &tok_len, &errnum);
if (p == QSE_NULL && errnum != QSE_AWK_ENOERR)
{

View File

@ -610,36 +610,36 @@ qse_size_t qse_awk_longtostr (
return ret;
}
qse_char_t* qse_awk_strtok (
qse_awk_rtx_t* run, const qse_char_t* s,
qse_char_t* qse_awk_rtx_strtok (
qse_awk_rtx_t* rtx, const qse_char_t* s,
const qse_char_t* delim, qse_char_t** tok, qse_size_t* tok_len)
{
return qse_awk_strxntok (
run, s, qse_strlen(s),
return qse_awk_rtx_strxntok (
rtx, s, qse_strlen(s),
delim, qse_strlen(delim), tok, tok_len);
}
qse_char_t* qse_awk_strxtok (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxtok (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
const qse_char_t* delim, qse_char_t** tok, qse_size_t* tok_len)
{
return qse_awk_strxntok (
run, s, len,
return qse_awk_rtx_strxntok (
rtx, s, len,
delim, qse_strlen(delim), tok, tok_len);
}
qse_char_t* qse_awk_strntok (
qse_awk_rtx_t* run, const qse_char_t* s,
qse_char_t* qse_awk_rtx_strntok (
qse_awk_rtx_t* rtx, const qse_char_t* s,
const qse_char_t* delim, qse_size_t delim_len,
qse_char_t** tok, qse_size_t* tok_len)
{
return qse_awk_strxntok (
run, s, qse_strlen(s),
return qse_awk_rtx_strxntok (
rtx, s, qse_strlen(s),
delim, delim_len, tok, tok_len);
}
qse_char_t* qse_awk_strxntok (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxntok (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
const qse_char_t* delim, qse_size_t delim_len,
qse_char_t** tok, qse_size_t* tok_len)
{
@ -662,7 +662,7 @@ qse_char_t* qse_awk_strxntok (
for (d = delim; d < delim_end; d++)
{
if (QSE_AWK_ISSPACE(run->awk,*d))
if (QSE_AWK_ISSPACE(rtx->awk,*d))
{
if (delim_mode == __DELIM_EMPTY)
delim_mode = __DELIM_SPACES;
@ -696,12 +696,12 @@ qse_char_t* qse_awk_strxntok (
* leading and trailing spaces characters off the source
* string "s" eventually. */
while (p < end && QSE_AWK_ISSPACE(run->awk,*p)) p++;
while (p < end && QSE_AWK_ISSPACE(rtx->awk,*p)) p++;
while (p < end)
{
c = *p;
if (!QSE_AWK_ISSPACE(run->awk,c))
if (!QSE_AWK_ISSPACE(rtx->awk,c))
{
if (sp == QSE_NULL) sp = p;
ep = p;
@ -724,28 +724,28 @@ qse_char_t* qse_awk_strxntok (
/* each token is delimited by space characters. all leading
* and trailing spaces are removed. */
while (p < end && QSE_AWK_ISSPACE(run->awk,*p)) p++;
while (p < end && QSE_AWK_ISSPACE(rtx->awk,*p)) p++;
while (p < end)
{
c = *p;
if (QSE_AWK_ISSPACE(run->awk,c)) break;
if (QSE_AWK_ISSPACE(rtx->awk,c)) break;
if (sp == QSE_NULL) sp = p;
ep = p++;
}
while (p < end && QSE_AWK_ISSPACE(run->awk,*p)) p++;
while (p < end && QSE_AWK_ISSPACE(rtx->awk,*p)) p++;
}
else if (delim_mode == __DELIM_NOSPACES)
{
/* each token is delimited by one of charaters
* in the delimeter set "delim". */
if (run->gbl.ignorecase)
if (rtx->gbl.ignorecase)
{
while (p < end)
{
c = QSE_AWK_TOUPPER(run->awk, *p);
c = QSE_AWK_TOUPPER(rtx->awk, *p);
for (d = delim; d < delim_end; d++)
{
if (c == QSE_AWK_TOUPPER(run->awk,*d)) goto exit_loop;
if (c == QSE_AWK_TOUPPER(rtx->awk,*d)) goto exit_loop;
}
if (sp == QSE_NULL) sp = p;
@ -772,20 +772,20 @@ qse_char_t* qse_awk_strxntok (
/* each token is delimited by one of non-space charaters
* in the delimeter set "delim". however, all space characters
* surrounding the token are removed */
while (p < end && QSE_AWK_ISSPACE(run->awk,*p)) p++;
if (run->gbl.ignorecase)
while (p < end && QSE_AWK_ISSPACE(rtx->awk,*p)) p++;
if (rtx->gbl.ignorecase)
{
while (p < end)
{
c = QSE_AWK_TOUPPER(run->awk, *p);
if (QSE_AWK_ISSPACE(run->awk,c))
c = QSE_AWK_TOUPPER(rtx->awk, *p);
if (QSE_AWK_ISSPACE(rtx->awk,c))
{
p++;
continue;
}
for (d = delim; d < delim_end; d++)
{
if (c == QSE_AWK_TOUPPER(run->awk,*d)) goto exit_loop;
if (c == QSE_AWK_TOUPPER(rtx->awk,*d)) goto exit_loop;
}
if (sp == QSE_NULL) sp = p;
ep = p++;
@ -796,7 +796,7 @@ qse_char_t* qse_awk_strxntok (
while (p < end)
{
c = *p;
if (QSE_AWK_ISSPACE(run->awk,c))
if (QSE_AWK_ISSPACE(rtx->awk,c))
{
p++;
continue;
@ -830,8 +830,8 @@ exit_loop:
return (qse_char_t*)++p;
}
qse_char_t* qse_awk_strxntokbyrex (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxntokbyrex (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
void* rex, qse_char_t** tok, qse_size_t* tok_len, int* errnum)
{
int n;
@ -845,8 +845,8 @@ qse_char_t* qse_awk_strxntokbyrex (
while (len > 0)
{
n = QSE_AWK_MATCHREX (
run->awk, rex,
((run->gbl.ignorecase)? QSE_REX_IGNORECASE: 0),
rtx->awk, rex,
((rtx->gbl.ignorecase)? QSE_REX_IGNORECASE: 0),
ptr, left, (const qse_char_t**)&match_ptr, &match_len,
errnum);
if (n == -1) return QSE_NULL;
@ -867,14 +867,14 @@ qse_char_t* qse_awk_strxntokbyrex (
ptr++;
left--;
}
else if (run->awk->option & QSE_AWK_STRIPSPACES)
else if (rtx->awk->option & QSE_AWK_STRIPSPACES)
{
/* match at the beginning of the input string */
if (match_ptr == s)
{
for (i = 0; i < match_len; i++)
{
if (!QSE_AWK_ISSPACE(run->awk, match_ptr[i]))
if (!QSE_AWK_ISSPACE(rtx->awk, match_ptr[i]))
goto exit_loop;
}
@ -904,7 +904,7 @@ exit_loop:
for (i = 0; i < match_len; i++)
{
if (!QSE_AWK_ISSPACE(run->awk, match_ptr[i]))
if (!QSE_AWK_ISSPACE(rtx->awk, match_ptr[i]))
{
*errnum = QSE_AWK_ENOERR;
return match_ptr+match_len;
@ -913,7 +913,7 @@ exit_loop:
*errnum = QSE_AWK_ENOERR;
if (run->awk->option & QSE_AWK_STRIPSPACES)
if (rtx->awk->option & QSE_AWK_STRIPSPACES)
{
return (match_ptr+match_len >= s+len)?
QSE_NULL: (match_ptr+match_len);

View File

@ -23,26 +23,26 @@
extern "C" {
#endif
qse_char_t* qse_awk_strtok (
qse_awk_rtx_t* run, const qse_char_t* s,
qse_char_t* qse_awk_rtx_strtok (
qse_awk_rtx_t* rtx, const qse_char_t* s,
const qse_char_t* delim, qse_char_t** tok, qse_size_t* tok_len);
qse_char_t* qse_awk_strxtok (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxtok (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
const qse_char_t* delim, qse_char_t** tok, qse_size_t* tok_len);
qse_char_t* qse_awk_strntok (
qse_awk_rtx_t* run, const qse_char_t* s,
qse_char_t* qse_awk_rtx_strntok (
qse_awk_rtx_t* rtx, const qse_char_t* s,
const qse_char_t* delim, qse_size_t delim_len,
qse_char_t** tok, qse_size_t* tok_len);
qse_char_t* qse_awk_strxntok (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxntok (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
const qse_char_t* delim, qse_size_t delim_len,
qse_char_t** tok, qse_size_t* tok_len);
qse_char_t* qse_awk_strxntokbyrex (
qse_awk_rtx_t* run, const qse_char_t* s, qse_size_t len,
qse_char_t* qse_awk_rtx_strxntokbyrex (
qse_awk_rtx_t* rtx, const qse_char_t* s, qse_size_t len,
void* rex, qse_char_t** tok, qse_size_t* tok_len, int* errnum);

View File

@ -137,12 +137,12 @@ static int split_record (qse_awk_rtx_t* run)
{
if (fs_len <= 1)
{
p = qse_awk_strxntok (run,
p = qse_awk_rtx_strxntok (run,
p, len, fs_ptr, fs_len, &tok, &tok_len);
}
else
{
p = qse_awk_strxntokbyrex (run, p, len,
p = qse_awk_rtx_strxntokbyrex (run, p, len,
run->gbl.fs, &tok, &tok_len, &errnum);
if (p == QSE_NULL && errnum != QSE_AWK_ENOERR)
{
@ -194,12 +194,12 @@ static int split_record (qse_awk_rtx_t* run)
{
if (fs_len <= 1)
{
p = qse_awk_strxntok (
p = qse_awk_rtx_strxntok (
run, p, len, fs_ptr, fs_len, &tok, &tok_len);
}
else
{
p = qse_awk_strxntokbyrex (run, p, len,
p = qse_awk_rtx_strxntokbyrex (run, p, len,
run->gbl.fs, &tok, &tok_len, &errnum);
if (p == QSE_NULL && errnum != QSE_AWK_ENOERR)
{

View File

@ -76,15 +76,15 @@ static int custom_awk_sprintf (
static int add_functions (qse_awk_t* awk);
qse_awk_t* qse_awk_opensimple (qse_size_t xtn)
qse_awk_t* qse_awk_opensimple (void)
{
qse_awk_t* awk;
xtn_t* x;
awk = qse_awk_open (QSE_MMGR_GETDFL(), xtn + QSE_SIZEOF(xtn_t));
awk = qse_awk_open (QSE_MMGR_GETDFL(), QSE_SIZEOF(xtn_t));
qse_awk_setccls (awk, QSE_CCLS_GETDFL());
x = (xtn_t*)((qse_byte_t*)qse_awk_getxtn(awk) + xtn);
x = (xtn_t*) qse_awk_getxtn (awk);
x->prm.pow = custom_awk_pow;
x->prm.sprintf = custom_awk_sprintf;
@ -745,7 +745,6 @@ qse_awk_rtx_t* qse_awk_rtx_opensimple (qse_awk_t* awk, qse_char_t** icf)
qse_awk_rio_t rio;
rxtn_t* rxtn;
qse_ntime_t now;
int n;
rio.pipe = awk_eio_pipe;
rio.file = awk_eio_file;

View File

@ -253,50 +253,19 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde)
case QSE_AWK_NDE_INT:
{
if (((qse_awk_nde_int_t*)nde)->str == QSE_NULL)
{
qse_size_t n;
n = qse_awk_longtostr (
((qse_awk_nde_int_t*)nde)->val, 10, QSE_NULL,
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt));
PUT_SRCSTRX (awk, awk->tmp.fmt, n);
}
else
{
PUT_SRCSTRX (awk,
((qse_awk_nde_int_t*)nde)->str,
((qse_awk_nde_int_t*)nde)->len);
}
QSE_ASSERT (((qse_awk_nde_int_t*)nde)->str != QSE_NULL);
PUT_SRCSTRX (awk,
((qse_awk_nde_int_t*)nde)->str,
((qse_awk_nde_int_t*)nde)->len);
break;
}
case QSE_AWK_NDE_REAL:
{
if (((qse_awk_nde_real_t*)nde)->str == QSE_NULL)
{
#if (QSE_SIZEOF_LONG_DOUBLE != 0) && !defined(__MINGW32__)
awk->prm->sprintf (
awk->prm->data,
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt), QSE_T("%Lf"),
(long double)((qse_awk_nde_real_t*)nde)->val);
#elif (QSE_SIZEOF_DOUBLE != 0)
awk->prm->sprintf (
awk->prm->data,
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt), QSE_T("%f"),
(double)((qse_awk_nde_real_t*)nde)->val);
#else
#error unsupported floating-point data type
#endif
PUT_SRCSTR (awk, awk->tmp.fmt);
}
else
{
PUT_SRCSTRX (awk,
((qse_awk_nde_real_t*)nde)->str,
((qse_awk_nde_real_t*)nde)->len);
}
QSE_ASSERT (((qse_awk_nde_real_t*)nde)->str != QSE_NULL);
PUT_SRCSTRX (awk,
((qse_awk_nde_real_t*)nde)->str,
((qse_awk_nde_real_t*)nde)->len);
break;
}

View File

@ -17,6 +17,7 @@
*/
#include <qse/cmn/str.h>
#include <stdarg.h>
#include "chr.h"
#include "mem.h"
@ -106,6 +107,120 @@ qse_size_t qse_strxncpy (
return n;
}
qse_size_t qse_strfcpy (qse_char_t* buf, const qse_char_t* fmt, ...)
{
qse_char_t* b = buf;
const qse_char_t* f = fmt;
while (*f != QSE_T('\0'))
{
if (*f == QSE_T('$'))
{
if (f[1] == QSE_T('{') &&
(f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
{
va_list ap;
const qse_char_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_T('0'));
while (*f >= QSE_T('0') && *f <= QSE_T('9'));
if (*f != QSE_T('}'))
{
f = tmp;
goto normal;
}
f++;
/* TODO: some optimization in getting the argument */
va_start (ap, fmt);
do tmp = va_arg(ap,const qse_char_t*);
while (idx-- > 0);
va_end (ap);
while (*tmp != QSE_T('\0')) *b++ = *tmp++;
continue;
}
else if (f[1] == QSE_T('$')) f++;
}
normal:
*b++ = *f++;
}
*b = QSE_T('\0');
return b - buf;
}
qse_size_t qse_strxfcpy (
qse_char_t* buf, qse_size_t bsz, const qse_char_t* fmt, ...)
{
qse_char_t* b = buf;
qse_char_t* end = buf + bsz - 1;
const qse_char_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != QSE_T('\0'))
{
if (*f == QSE_T('$'))
{
if (f[1] == QSE_T('{') &&
(f[2] >= QSE_T('0') && f[2] <= QSE_T('9')))
{
va_list ap;
const qse_char_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_T('0'));
while (*f >= QSE_T('0') && *f <= QSE_T('9'));
if (*f != QSE_T('}'))
{
f = tmp;
goto normal;
}
f++;
/* TODO: some optimization in getting the argument */
va_start (ap, fmt);
do tmp = va_arg(ap,const qse_char_t*);
while (idx-- > 0);
va_end (ap);
while (*tmp != QSE_T('\0'))
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == QSE_T('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = QSE_T('\0');
return b - buf;
}
qse_size_t qse_strxcat (qse_char_t* buf, qse_size_t bsz, const qse_char_t* str)
{
qse_char_t* p, * p2;