Dont' forget to push, right

Signed-off-by: Mitja Horvat <mitja@plume.com>
This commit is contained in:
Mitja Horvat
2024-11-08 10:50:49 +01:00
parent 40f14ae579
commit 91bf461f73

61
qstr.c
View File

@ -239,13 +239,13 @@ size_t qstrrchr(qstr str, int c)
return ii - 1; return ii - 1;
} }
size_t qstrspni(qstr str, size_t start, qstr accept) size_t qstrispn(qstr str, size_t start, qstr accept)
{ {
if (start >= QSZ(str)) return QSZ(str); if (start >= QSZ(str)) return QSZ(str);
return start + memspn(str.q_ptr + start, QSZ(str) - start, accept.q_ptr, QSZ(accept)); return start + memspn(str.q_ptr + start, QSZ(str) - start, accept.q_ptr, QSZ(accept));
} }
size_t qstrcspni(qstr str, size_t start, qstr accept) size_t qstricspn(qstr str, size_t start, qstr accept)
{ {
if (start >= QSZ(str)) return QSZ(str); if (start >= QSZ(str)) return QSZ(str);
return start + memcspn(str.q_ptr + start, QSZ(str) - start, accept.q_ptr, QSZ(accept)); return start + memcspn(str.q_ptr + start, QSZ(str) - start, accept.q_ptr, QSZ(accept));
@ -253,12 +253,12 @@ size_t qstrcspni(qstr str, size_t start, qstr accept)
size_t qstrspn(qstr str, qstr accept) size_t qstrspn(qstr str, qstr accept)
{ {
return qstrspni(str, 0, accept); return qstrispn(str, 0, accept);
} }
size_t qstrcspn(qstr str, qstr accept) size_t qstrcspn(qstr str, qstr accept)
{ {
return qstrcspni(str, 0, accept); return qstricspn(str, 0, accept);
} }
bool qstrsep(qstr *out, qstr in, qstr delim) bool qstrsep(qstr *out, qstr in, qstr delim)
@ -332,7 +332,7 @@ const char *qstrdc(qstr *str)
return (const char *)str->q_ptr; return (const char *)str->q_ptr;
} }
size_t qstrcpi(qstr out, size_t idx, qstr in) size_t qstricpy(qstr out, size_t idx, qstr in)
{ {
size_t sz = QSZ(in); size_t sz = QSZ(in);
@ -362,8 +362,8 @@ size_t qstrjoin(qstr out, qstr in[], size_t len, qstr delim)
for (size_t ii = 0; ii < len; ii++) for (size_t ii = 0; ii < len; ii++)
{ {
if (ii != 0) idx = qstrcpi(out, idx, delim); if (ii != 0) idx = qstricpy(out, idx, delim);
idx = qstrcpi(out, idx, in[ii]); idx = qstricpy(out, idx, in[ii]);
} }
return idx; return idx;
@ -465,7 +465,7 @@ size_t qvfprintf(FILE *stream, qstr fmt, va_list va)
retval += qfprint(stream, qstrslice(fmt, 0, pidx)); retval += qfprint(stream, qstrslice(fmt, 0, pidx));
if (pidx < qstrlen(fmt)) if (pidx < qstrlen(fmt))
{ {
size_t fidx = qstrcspni(fmt, pidx + 1, Q("%diouxXeEfFgGaAcsCSPnmQ")); size_t fidx = qstricspn(fmt, pidx + 1, Q("%diouxXeEfFgGaAcsCSPnmQ"));
retval += qfprintf_fmt(stream, qstrslice(fmt, pidx, fidx + 1), va); retval += qfprintf_fmt(stream, qstrslice(fmt, pidx, fidx + 1), va);
pidx = fidx + 1; pidx = fidx + 1;
} }
@ -492,10 +492,37 @@ size_t qfprintf(FILE *stream, qstr fmt, ...)
* Write the string to out, and return the number of bytes that would have * Write the string to out, and return the number of bytes that would have
* been written, even if it exceeds the size of out. * been written, even if it exceeds the size of out.
* *
* Note: fmemopen() in glibc always pads the end buffer with a '\0', so if * Note: fmemopen() in glibc always pads the end buffer with a '\0', so when
* `out` is too small to hold the whole string, it will contain an ending * `out` is too small to hold the whole string, it will contain an ending
* '\0'. * '\0'. Use fopencookie() instead.
*/ */
#if defined(__GLIBC__)
/* Avoid defining __GNU_SOURCE just to pull in this function declaration */
FILE *fopencookie(void *restrict cookie, const char *restrict mode, cookie_io_functions_t io_funcs);
struct qcookie
{
uint8_t *oc_buf;
uint8_t *oc_end;
};
ssize_t qcookie_write(void *_cookie, const char *buf, size_t sz)
{
struct qcookie *cookie = _cookie;
if ((cookie->oc_end - cookie->oc_buf) < (ssize_t)sz)
{
sz = cookie->oc_end - cookie->oc_buf;
}
memcpy(cookie->oc_buf, buf, sz);
cookie->oc_buf += sz;
return sz;
}
#endif
size_t qsnprintf(qstr out, qstr fmt, ...) size_t qsnprintf(qstr out, qstr fmt, ...)
{ {
FILE *stream; FILE *stream;
@ -503,7 +530,17 @@ size_t qsnprintf(qstr out, qstr fmt, ...)
size_t retval = 0; size_t retval = 0;
#if defined(__GLIBC__)
struct qcookie qc;
memset(&qc, 0, sizeof(qc));
qc.oc_buf = out.q_ptr;
qc.oc_end = out.q_ptr + QSZ(out);
stream = fopencookie(&qc, "w", (cookie_io_functions_t){ .write = qcookie_write });
#else
stream = fmemopen(out.q_ptr, QSZ(out), "wb"); stream = fmemopen(out.q_ptr, QSZ(out), "wb");
#endif
if (stream == NULL) goto error; if (stream == NULL) goto error;
va_start(va, fmt); va_start(va, fmt);
@ -524,7 +561,7 @@ int main(int argc, char *argv[])
(void)global_test; (void)global_test;
uint8_t buf[1024]; uint8_t buf[39];
size_t qw = qsnprintf(QB(buf), Q("Hello %Q 1 2 3, argc=%d, float=%0.2f"), Q("b\0\0b"), argc, 1.0 / 3.0); size_t qw = qsnprintf(QB(buf), Q("Hello %Q 1 2 3, argc=%d, float=%0.2f"), Q("b\0\0b"), argc, 1.0 / 3.0);
qfprintf(stdout, Q("BUF(%zd) = %Q\n"), qw, qstrslice(QB(buf), 0, qw)); qfprintf(stdout, Q("BUF(%zd) = %Q\n"), qw, qstrslice(QB(buf), 0, qw));
@ -568,7 +605,7 @@ int main(int argc, char *argv[])
printf("Bork\n"); printf("Bork\n");
} }
qfprintf(stdout, Q("%s\n"), qstrslice(q, 0, idx)); qfprintf(stdout, Q("%Q\n"), qstrslice(q, 0, idx));
q = QB(buf); q = QB(buf);