Improve Lua and JSON serialization

This commit is contained in:
Justine Tunney 2022-07-12 23:31:06 -07:00
parent 3027d67037
commit e3cd476a9b
20 changed files with 1041 additions and 476 deletions

View file

@ -25,7 +25,7 @@ char *EscapePath(const char *, size_t, size_t *);
char *EscapeParam(const char *, size_t, size_t *);
char *EscapeFragment(const char *, size_t, size_t *);
char *EscapeSegment(const char *, size_t, size_t *);
char *EscapeJsStringLiteral(const char *, size_t, size_t *);
char *EscapeJsStringLiteral(char **, size_t *, const char *, size_t, size_t *);
ssize_t HasControlCodes(const char *, size_t, int);
char *Underlong(const char *, size_t, size_t *);

View file

@ -47,19 +47,30 @@ static const char kEscapeLiteral[128] = {
* EscapeJsStringLiteral(Underlong(𝑥)) since EscapeJsStringLiteral(𝑥)
* will do the same thing.
*
* @param r is realloc'able output buffer reused between calls
* @param y is used to track byte length of `*r`
* @param p is input value
* @param n if -1 implies strlen
* @param out_size if non-NULL receives output length
* @return allocated NUL-terminated buffer, or NULL w/ errno
* @return *r on success, or null w/ errno
*/
char *EscapeJsStringLiteral(const char *p, size_t n, size_t *z) {
char *EscapeJsStringLiteral(char **r, size_t *y, const char *p, size_t n,
size_t *z) {
char *q;
uint64_t w;
char *q, *r;
size_t i, j, m;
wint_t x, a, b;
if (z) *z = 0;
if (z) *z = 0; // TODO(jart): why is this here?
if (n == -1) n = p ? strlen(p) : 0;
if ((q = r = malloc(n * 6 + 6 + 1))) {
q = *r;
i = n * 8 + 6 + 1; // only need *6 but *8 is faster
if (i > *y) {
if ((q = realloc(q, i))) {
*r = q;
*y = i;
}
}
if (q) {
for (i = 0; i < n;) {
x = p[i++] & 0xff;
if (x >= 0300) {
@ -138,9 +149,8 @@ char *EscapeJsStringLiteral(const char *p, size_t n, size_t *z) {
unreachable;
}
}
if (z) *z = q - r;
if (z) *z = q - *r;
*q++ = '\0';
if ((q = realloc(r, q - r))) r = q;
}
return r;
return *r;
}