ref: 46dec712a71b4155f66b40ac92eb796d7e1fab89
parent: 31acf8517f2b51f01dbdd528a8352033015f754e
author: Tor Andersson <tor@ccxvii.net>
date: Mon Feb 10 08:17:09 EST 2014
Simplify string-buffer function API.
--- a/jsbuiltin.c
+++ b/jsbuiltin.c
@@ -68,7 +68,7 @@
static int Encode(js_State *J, const char *str, const char *unescaped)
{
- struct sbuffer *sb = NULL;
+ js_Buffer *sb = NULL;
static const char *HEX = "0123456789ABCDEF";
@@ -75,14 +75,14 @@
while (*str) {
int c = (unsigned char) *str++;
if (strchr(unescaped, c))
- sb = sb_putc(sb, c);
+ sb_putc(&sb, c);
else {
- sb = sb_putc(sb, '%');
- sb = sb_putc(sb, HEX[(c >> 4) & 0xf]);
- sb = sb_putc(sb, HEX[c & 0xf]);
+ sb_putc(&sb, '%');
+ sb_putc(&sb, HEX[(c >> 4) & 0xf]);
+ sb_putc(&sb, HEX[c & 0xf]);
}
}
- sb = sb_putc(sb, 0);
+ sb_putc(&sb, 0);
if (js_try(J)) {
free(sb);
@@ -109,13 +109,13 @@
static int Decode(js_State *J, const char *str, const char *reserved)
{
- struct sbuffer *sb = NULL;
+ js_Buffer *sb = NULL;
int a, b;
while (*str) {
int c = (unsigned char) *str++;
if (c != '%')
- sb = sb_putc(sb, c);
+ sb_putc(&sb, c);
else {
if (!str[0] || !str[1])
js_urierror(J, "truncated escape sequence");
@@ -125,15 +125,15 @@
js_urierror(J, "invalid escape sequence");
c = tohex(a) << 4 | tohex(b);
if (!strchr(reserved, c))
- sb = sb_putc(sb, c);
+ sb_putc(&sb, c);
else {
- sb = sb_putc(sb, '%');
- sb = sb_putc(sb, a);
- sb = sb_putc(sb, b);
+ sb_putc(&sb, '%');
+ sb_putc(&sb, a);
+ sb_putc(&sb, b);
}
}
}
- sb = sb_putc(sb, 0);
+ sb_putc(&sb, 0);
if (js_try(J)) {
free(sb);
--- a/jsbuiltin.h
+++ b/jsbuiltin.h
@@ -17,33 +17,33 @@
void jsB_propn(js_State *J, const char *name, double number);
void jsB_props(js_State *J, const char *name, const char *string);
-struct sbuffer { int n, m; char s[64]; };
+typedef struct js_Buffer { int n, m; char s[64]; } js_Buffer;
-static struct sbuffer *sb_putc(struct sbuffer *sb, int c)
+static void sb_putc(js_Buffer **sbp, int c)
{
+ js_Buffer *sb = *sbp;
if (!sb) {
sb = malloc(sizeof *sb);
sb->n = 0;
sb->m = sizeof sb->s;
+ *sbp = sb;
} else if (sb->n == sb->m) {
- sb = realloc(sb, (sb->m *= 2) + offsetof(struct sbuffer, s));
+ sb = realloc(sb, (sb->m *= 2) + offsetof(js_Buffer, s));
+ *sbp = sb;
}
sb->s[sb->n++] = c;
- return sb;
}
-static inline struct sbuffer *sb_puts(struct sbuffer *sb, const char *s)
+static inline void sb_puts(js_Buffer **sb, const char *s)
{
while (*s)
- sb = sb_putc(sb, *s++);
- return sb;
+ sb_putc(sb, *s++);
}
-static inline struct sbuffer *sb_putm(struct sbuffer *sb, const char *s, const char *e)
+static inline void sb_putm(js_Buffer **sb, const char *s, const char *e)
{
while (s < e)
- sb = sb_putc(sb, *s++);
- return sb;
+ sb_putc(sb, *s++);
}
#endif
--- a/jsfunction.c
+++ b/jsfunction.c
@@ -7,7 +7,7 @@
static int jsB_Function(js_State *J, int argc)
{
const char *source;
- struct sbuffer *sb;
+ js_Buffer *sb;
js_Ast *parse;
js_Function *fun;
int i;
@@ -19,10 +19,10 @@
sb = NULL;
if (argc > 1) {
for (i = 1; i < argc; ++i) {
- if (i > 1) sb = sb_putc(sb, ',');
- sb = sb_puts(sb, js_tostring(J, i));
+ if (i > 1) sb_putc(&sb, ',');
+ sb_puts(&sb, js_tostring(J, i));
}
- sb = sb_putc(sb, ')');
+ sb_putc(&sb, ')');
}
}
--- a/jsstring.c
+++ b/jsstring.c
@@ -393,7 +393,7 @@
js_Regexp *re;
regmatch_t m[10];
const char *source, *s, *r;
- struct sbuffer *sb = NULL;
+ js_Buffer *sb = NULL;
int n, x;
source = js_tostring(J, 0);
@@ -419,39 +419,39 @@
js_copy(J, 0); /* arg x+3: search string */
js_call(J, 2 + x);
r = js_tostring(J, -1);
- sb = sb_putm(sb, source, s);
- sb = sb_puts(sb, r);
+ sb_putm(&sb, source, s);
+ sb_puts(&sb, r);
js_pop(J, 1);
} else {
r = js_tostring(J, 2);
- sb = sb_putm(sb, source, s);
+ sb_putm(&sb, source, s);
while (*r) {
if (*r == '$') {
switch (*(++r)) {
- case '$': sb = sb_putc(sb, '$'); break;
- case '`': sb = sb_putm(sb, source, s); break;
- case '\'': sb = sb_puts(sb, s + n); break;
+ case '$': sb_putc(&sb, '$'); break;
+ case '`': sb_putm(&sb, source, s); break;
+ case '\'': sb_puts(&sb, s + n); break;
case '&':
- sb = sb_putm(sb, s, s + n);
+ sb_putm(&sb, s, s + n);
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
x = *r - '0';
if (m[x].rm_so >= 0) {
- sb = sb_putm(sb, source + m[x].rm_so, source + m[x].rm_eo);
+ sb_putm(&sb, source + m[x].rm_so, source + m[x].rm_eo);
} else {
- sb = sb_putc(sb, '$');
- sb = sb_putc(sb, '0'+x);
+ sb_putc(&sb, '$');
+ sb_putc(&sb, '0'+x);
}
break;
default:
- sb = sb_putc(sb, '$');
- sb = sb_putc(sb, *r);
+ sb_putc(&sb, '$');
+ sb_putc(&sb, *r);
break;
}
++r;
} else {
- sb = sb_putc(sb, *r++);
+ sb_putc(&sb, *r++);
}
}
}
@@ -460,7 +460,7 @@
source = source + m[0].rm_eo;
if (n == 0) {
if (*source)
- sb = sb_putc(sb, *source++);
+ sb_putc(&sb, *source++);
else
goto end;
}
@@ -469,8 +469,8 @@
}
end:
- sb = sb_puts(sb, s + n);
- sb = sb_putc(sb, 0);
+ sb_puts(&sb, s + n);
+ sb_putc(&sb, 0);
if (js_try(J)) {
free(sb);
@@ -485,7 +485,7 @@
static int Sp_replace_string(js_State *J, int argc)
{
const char *source, *needle, *s, *r;
- struct sbuffer *sb = NULL;
+ js_Buffer *sb = NULL;
int n;
source = js_tostring(J, 0);
@@ -506,30 +506,30 @@
js_copy(J, 0); /* arg 3: search string */
js_call(J, 3);
r = js_tostring(J, -1);
- sb = sb_putm(sb, source, s);
- sb = sb_puts(sb, r);
- sb = sb_puts(sb, s + n);
- sb = sb_putc(sb, 0);
+ sb_putm(&sb, source, s);
+ sb_puts(&sb, r);
+ sb_puts(&sb, s + n);
+ sb_putc(&sb, 0);
js_pop(J, 1);
} else {
r = js_tostring(J, 2);
- sb = sb_putm(sb, source, s);
+ sb_putm(&sb, source, s);
while (*r) {
if (*r == '$') {
switch (*(++r)) {
- case '$': sb = sb_putc(sb, '$'); break;
- case '&': sb = sb_putm(sb, s, s + n); break;
- case '`': sb = sb_putm(sb, source, s); break;
- case '\'': sb = sb_puts(sb, s + n); break;
- default: sb = sb_putc(sb, '$'); sb = sb_putc(sb, *r); break;
+ case '$': sb_putc(&sb, '$'); break;
+ case '&': sb_putm(&sb, s, s + n); break;
+ case '`': sb_putm(&sb, source, s); break;
+ case '\'': sb_puts(&sb, s + n); break;
+ default: sb_putc(&sb, '$'); sb_putc(&sb, *r); break;
}
++r;
} else {
- sb = sb_putc(sb, *r++);
+ sb_putc(&sb, *r++);
}
}
- sb = sb_puts(sb, s + n);
- sb = sb_putc(sb, 0);
+ sb_puts(&sb, s + n);
+ sb_putc(&sb, 0);
}
if (js_try(J)) {