Simplify string-buffer function API.

This commit is contained in:
Tor Andersson
2014-02-10 13:17:33 +01:00
parent 31acf8517f
commit 46dec712a7
4 changed files with 58 additions and 58 deletions
+13 -13
View File
@@ -68,21 +68,21 @@ static int jsB_isFinite(js_State *J, int argc)
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";
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 inline int tohex(int c)
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 @@ static int Decode(js_State *J, const char *str, const char *reserved)
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);
+10 -10
View File
@@ -17,33 +17,33 @@ void jsB_propf(js_State *J, const char *name, js_CFunction cfun, int n);
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
+4 -4
View File
@@ -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 @@ static int jsB_Function(js_State *J, int argc)
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, ')');
}
}
+31 -31
View File
@@ -393,7 +393,7 @@ static int Sp_replace_regexp(js_State *J, int argc)
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 @@ loop:
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 @@ loop:
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 @@ loop:
}
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 @@ end:
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 @@ static int Sp_replace_string(js_State *J, int argc)
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)) {