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:
parent
172725273c
commit
10adba9ed0
@ -111,7 +111,8 @@ static void set_intr_run (void)
|
||||
#ifdef _WIN32
|
||||
SetConsoleCtrlHandler (stop_run, TRUE);
|
||||
#else
|
||||
setsignal (SIGINT, stop_run, 1);
|
||||
/*setsignal (SIGINT, stop_run, 1); TO BE MORE COMPATIBLE WITH WIN32*/
|
||||
setsignal (SIGINT, stop_run, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -524,7 +525,7 @@ static qse_awk_t* open_awk (void)
|
||||
{
|
||||
qse_awk_t* awk;
|
||||
|
||||
awk = qse_awk_opensimple (0);
|
||||
awk = qse_awk_opensimple ();
|
||||
if (awk == QSE_NULL)
|
||||
{
|
||||
qse_printf (QSE_T("ERROR: cannot open awk\n"));
|
||||
|
@ -1520,7 +1520,7 @@ int qse_awk_rtx_strtonum (
|
||||
* SYNOPSIS
|
||||
*/
|
||||
qse_awk_t* qse_awk_opensimple (
|
||||
qse_size_t xtn /* size of extension area in bytes */
|
||||
void
|
||||
);
|
||||
/******/
|
||||
|
||||
|
@ -116,17 +116,85 @@ extern "C" {
|
||||
/*
|
||||
* basic string functions
|
||||
*/
|
||||
qse_size_t qse_strlen (const qse_char_t* str);
|
||||
qse_size_t qse_strbytes (const qse_char_t* str);
|
||||
|
||||
/****f* Common/qse_strlen
|
||||
* NAME
|
||||
* qse_strlen - get the number of characters
|
||||
* DESCRIPTION
|
||||
* The qse_strlen() function returns the number of characters in a
|
||||
* null-terminated string. The length returned excludes a terminating null.
|
||||
* SYNOPSIS
|
||||
*/
|
||||
qse_size_t qse_strlen (
|
||||
const qse_char_t* str
|
||||
);
|
||||
/******/
|
||||
|
||||
/****f* Common/qse_strbytes
|
||||
* NAME
|
||||
* qse_strbytes - get the length of a string in bytes
|
||||
* DESCRIPTOIN
|
||||
* The qse_strbytes() function returns the number of bytes a null-terminated
|
||||
* string is holding excluding a terminating null.
|
||||
* SYNOPSIS
|
||||
*/
|
||||
qse_size_t qse_strbytes (
|
||||
const qse_char_t* str
|
||||
);
|
||||
/******/
|
||||
|
||||
qse_size_t qse_strcpy (
|
||||
qse_char_t* buf, const qse_char_t* str);
|
||||
qse_char_t* buf,
|
||||
const qse_char_t* str
|
||||
);
|
||||
|
||||
qse_size_t qse_strxcpy (
|
||||
qse_char_t* buf, qse_size_t bsz, const qse_char_t* str);
|
||||
qse_char_t* buf,
|
||||
qse_size_t bsz,
|
||||
const qse_char_t* str
|
||||
);
|
||||
|
||||
qse_size_t qse_strncpy (
|
||||
qse_char_t* buf, const qse_char_t* str, qse_size_t len);
|
||||
qse_char_t* buf,
|
||||
const qse_char_t* str,
|
||||
qse_size_t len
|
||||
);
|
||||
|
||||
qse_size_t qse_strxncpy (
|
||||
qse_char_t* buf, qse_size_t bsz, const qse_char_t* str, qse_size_t len);
|
||||
qse_char_t* buf,
|
||||
qse_size_t bsz,
|
||||
const qse_char_t* str,
|
||||
qse_size_t len
|
||||
);
|
||||
|
||||
/****f* Common/qse_strfcpy
|
||||
* NAME
|
||||
* qse_strfcpy - copy a string
|
||||
* DESCRIPTION
|
||||
* "format ${1} ${3} ${2} \\${1} string"
|
||||
* SYNOPSIS
|
||||
*/
|
||||
qse_size_t qse_strfcpy (
|
||||
qse_char_t* buf,
|
||||
const qse_char_t* fmt,
|
||||
...
|
||||
);
|
||||
/******/
|
||||
|
||||
/****f* Common/qse_strxfcpy
|
||||
* NAME
|
||||
* qse_strxfcpy - copy a string
|
||||
* DESCRIPTION
|
||||
* "format $1 $3 $2 \\$1 string"
|
||||
* SYNOPSIS
|
||||
*/
|
||||
qse_size_t qse_strxfcpy (
|
||||
qse_char_t* buf,
|
||||
qse_size_t bsz,
|
||||
const qse_char_t* fmt,
|
||||
...
|
||||
);
|
||||
/******/
|
||||
|
||||
qse_size_t qse_strxcat (
|
||||
qse_char_t* buf, qse_size_t bsz, const qse_char_t* str);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -411,8 +411,67 @@ static int test9 (void)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test10 (void)
|
||||
{
|
||||
qse_char_t buf[1000];
|
||||
qse_strfcpy (buf, QSE_T("${2}${1}${0}"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("${2}/${1}/${0}"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/${2}/${1}/${0}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/$${2}/$${1}/$${0}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/${2/${1}/${0}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/$2}/${1}/${0}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/${2}/${1}/${0}/${3}/${4}/${5}/${6}/${7}/${8}/${9}/${10}/${11}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"),
|
||||
QSE_T("33333"), QSE_T("44444"), QSE_T("55555"),
|
||||
QSE_T("66666"), QSE_T("77777"), QSE_T("88888"),
|
||||
QSE_T("99999"), QSE_T("aaaaa"), QSE_T("bbbbb"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/${2}/${1}/${0}/${2}/${1}/${0}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
qse_strfcpy (buf, QSE_T("/${002}/${001}/${000}/"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("buf=[%s]\n"), buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test11 (void)
|
||||
{
|
||||
qse_char_t buf[20];
|
||||
int i, j;
|
||||
for (i = 0; i <= QSE_COUNTOF(buf); i++)
|
||||
{
|
||||
qse_strcpy (buf, QSE_T("AAAAAAAAAAAAAAAAAAA"));
|
||||
qse_strxfcpy (buf, i, QSE_T("${2}${1}${0}"),
|
||||
QSE_T("00000"), QSE_T("11111"), QSE_T("22222"));
|
||||
qse_printf (QSE_T("bufsize=%02d, buf=[%-20s] "), i, buf);
|
||||
|
||||
qse_printf (QSE_T("["));
|
||||
for (j = 0; j < QSE_COUNTOF(buf); j++)
|
||||
{
|
||||
if (buf[j] == QSE_T('\0')) qse_printf (QSE_T("*"));
|
||||
else qse_printf (QSE_T("%c"), buf[j]);
|
||||
}
|
||||
qse_printf (QSE_T("]\n"));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
@ -431,6 +490,8 @@ int main ()
|
||||
R (test7);
|
||||
R (test8);
|
||||
R (test9);
|
||||
R (test10);
|
||||
R (test11);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user