hcl/lib/cmn/str-fmc.h

229 lines
3.8 KiB
C
Raw Normal View History

2014-07-02 14:29:01 +00:00
h2_size_t XFUN(strfmc) (
xchar_t* buf, const xchar_t* fmt, const xchar_t* str[])
{
xchar_t* b = buf;
const xchar_t* f = fmt;
while (*f != XCHAR('\0'))
{
if (*f == XCHAR('$'))
{
if (f[1] == XCHAR('{') &&
(f[2] >= XCHAR('0') && f[2] <= XCHAR('9')))
{
const xchar_t* tmp;
h2_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - XCHAR('0'));
while (*f >= XCHAR('0') && *f <= XCHAR('9'));
if (*f != XCHAR('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != XCHAR('\0')) *b++ = *tmp++;
continue;
}
else if (f[1] == XCHAR('$')) f++;
}
normal:
*b++ = *f++;
}
*b = XCHAR('\0');
return b - buf;
}
#if 0
h2_size_t XFUN(strfncpy) (
xchar_t* buf, const xchar_t* fmt, const cstr_t str[])
{
xchar_t* b = buf;
const xchar_t* f = fmt;
while (*f != XCHAR('\0'))
{
if (*f == XCHAR('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != XCHAR('\0')) f++;
}
else if (*f == XCHAR('$'))
{
if (f[1] == XCHAR('{') &&
(f[2] >= XCHAR('0') && f[2] <= XCHAR('9')))
{
const xchar_t* tmp, * tmpend;
h2_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - XCHAR('0'));
while (*f >= XCHAR('0') && *f <= XCHAR('9'));
if (*f != XCHAR('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend) *b++ = *tmp++;
continue;
}
else if (f[1] == XCHAR('$')) f++;
}
normal:
*b++ = *f++;
}
*b = XCHAR('\0');
return b - buf;
}
h2_size_t XFUN(strxfmc) (
xchar_t* buf, h2_size_t bsz,
const xchar_t* fmt, const xchar_t* str[])
{
xchar_t* b = buf;
xchar_t* end = buf + bsz - 1;
const xchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != XCHAR('\0'))
{
if (*f == XCHAR('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != XCHAR('\0')) f++;
}
else if (*f == XCHAR('$'))
{
if (f[1] == XCHAR('{') &&
(f[2] >= XCHAR('0') && f[2] <= XCHAR('9')))
{
const xchar_t* tmp;
h2_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - XCHAR('0'));
while (*f >= XCHAR('0') && *f <= XCHAR('9'));
if (*f != XCHAR('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != XCHAR('\0'))
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == XCHAR('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = XCHAR('\0');
return b - buf;
}
h2_size_t XFUN(strxfncpy) (
xchar_t* buf, h2_size_t bsz,
const xchar_t* fmt, const cstr_t str[])
{
xchar_t* b = buf;
xchar_t* end = buf + bsz - 1;
const xchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != XCHAR('\0'))
{
if (*f == XCHAR('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != XCHAR('\0')) f++;
}
else if (*f == XCHAR('$'))
{
if (f[1] == XCHAR('{') &&
(f[2] >= XCHAR('0') && f[2] <= XCHAR('9')))
{
const xchar_t* tmp, * tmpend;
h2_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - XCHAR('0'));
while (*f >= XCHAR('0') && *f <= XCHAR('9'));
if (*f != XCHAR('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend)
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == XCHAR('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = XCHAR('\0');
return b - buf;
}
#endif