diff options
author | Mike Pall <mike> | 2013-02-27 21:17:27 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-27 21:28:28 +0100 |
commit | 116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch) | |
tree | cc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_str.c | |
parent | 28cfcf77445e144335961a020e3e08d84cf0091f (diff) | |
download | luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.gz luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.bz2 luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.zip |
String buffer refactoring, part 2.
Switch to pointers for start/pos/end of buffer.
Abstract out some buffer writers.
Diffstat (limited to 'src/lj_str.c')
-rw-r--r-- | src/lj_str.c | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/src/lj_str.c b/src/lj_str.c index 623b362d..84bab864 100644 --- a/src/lj_str.c +++ b/src/lj_str.c | |||
@@ -218,20 +218,6 @@ GCstr * LJ_FASTCALL lj_str_fromnumber(lua_State *L, cTValue *o) | |||
218 | 218 | ||
219 | /* -- String formatting --------------------------------------------------- */ | 219 | /* -- String formatting --------------------------------------------------- */ |
220 | 220 | ||
221 | static void addstr(lua_State *L, SBuf *sb, const char *str, MSize len) | ||
222 | { | ||
223 | MSize i; | ||
224 | char *p = lj_buf_need(L, sb, sb->n+len) + sb->n; | ||
225 | sb->n += len; | ||
226 | for (i = 0; i < len; i++) p[i] = str[i]; | ||
227 | } | ||
228 | |||
229 | static void addchar(lua_State *L, SBuf *sb, int c) | ||
230 | { | ||
231 | char *p = lj_buf_need(L, sb, sb->n+1); | ||
232 | p[sb->n++] = (char)c; | ||
233 | } | ||
234 | |||
235 | /* Push formatted message as a string object to Lua stack. va_list variant. */ | 221 | /* Push formatted message as a string object to Lua stack. va_list variant. */ |
236 | const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | 222 | const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) |
237 | { | 223 | { |
@@ -241,22 +227,22 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
241 | for (;;) { | 227 | for (;;) { |
242 | const char *e = strchr(fmt, '%'); | 228 | const char *e = strchr(fmt, '%'); |
243 | if (e == NULL) break; | 229 | if (e == NULL) break; |
244 | addstr(L, sb, fmt, (MSize)(e-fmt)); | 230 | lj_buf_putmem(L, sb, fmt, (MSize)(e-fmt)); |
245 | /* This function only handles %s, %c, %d, %f and %p formats. */ | 231 | /* This function only handles %s, %c, %d, %f and %p formats. */ |
246 | switch (e[1]) { | 232 | switch (e[1]) { |
247 | case 's': { | 233 | case 's': { |
248 | const char *s = va_arg(argp, char *); | 234 | const char *s = va_arg(argp, char *); |
249 | if (s == NULL) s = "(null)"; | 235 | if (s == NULL) s = "(null)"; |
250 | addstr(L, sb, s, (MSize)strlen(s)); | 236 | lj_buf_putmem(L, sb, s, (MSize)strlen(s)); |
251 | break; | 237 | break; |
252 | } | 238 | } |
253 | case 'c': | 239 | case 'c': |
254 | addchar(L, sb, va_arg(argp, int)); | 240 | lj_buf_putb(L, sb, va_arg(argp, int)); |
255 | break; | 241 | break; |
256 | case 'd': { | 242 | case 'd': { |
257 | char buf[LJ_STR_INTBUF]; | 243 | char buf[LJ_STR_INTBUF]; |
258 | char *p = lj_str_bufint(buf, va_arg(argp, int32_t)); | 244 | char *p = lj_str_bufint(buf, va_arg(argp, int32_t)); |
259 | addstr(L, sb, p, (MSize)(buf+LJ_STR_INTBUF-p)); | 245 | lj_buf_putmem(L, sb, p, (MSize)(buf+LJ_STR_INTBUF-p)); |
260 | break; | 246 | break; |
261 | } | 247 | } |
262 | case 'f': { | 248 | case 'f': { |
@@ -265,7 +251,7 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
265 | MSize len; | 251 | MSize len; |
266 | tv.n = (lua_Number)(va_arg(argp, LUAI_UACNUMBER)); | 252 | tv.n = (lua_Number)(va_arg(argp, LUAI_UACNUMBER)); |
267 | len = (MSize)lj_str_bufnum(buf, &tv); | 253 | len = (MSize)lj_str_bufnum(buf, &tv); |
268 | addstr(L, sb, buf, len); | 254 | lj_buf_putmem(L, sb, buf, len); |
269 | break; | 255 | break; |
270 | } | 256 | } |
271 | case 'p': { | 257 | case 'p': { |
@@ -274,7 +260,7 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
274 | ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *)); | 260 | ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *)); |
275 | ptrdiff_t i, lasti = 2+FMTP_CHARS; | 261 | ptrdiff_t i, lasti = 2+FMTP_CHARS; |
276 | if (p == 0) { | 262 | if (p == 0) { |
277 | addstr(L, sb, "NULL", 4); | 263 | lj_buf_putmem(L, sb, "NULL", 4); |
278 | break; | 264 | break; |
279 | } | 265 | } |
280 | #if LJ_64 | 266 | #if LJ_64 |
@@ -285,21 +271,21 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
285 | buf[1] = 'x'; | 271 | buf[1] = 'x'; |
286 | for (i = lasti-1; i >= 2; i--, p >>= 4) | 272 | for (i = lasti-1; i >= 2; i--, p >>= 4) |
287 | buf[i] = "0123456789abcdef"[(p & 15)]; | 273 | buf[i] = "0123456789abcdef"[(p & 15)]; |
288 | addstr(L, sb, buf, (MSize)lasti); | 274 | lj_buf_putmem(L, sb, buf, (MSize)lasti); |
289 | break; | 275 | break; |
290 | } | 276 | } |
291 | case '%': | 277 | case '%': |
292 | addchar(L, sb, '%'); | 278 | lj_buf_putb(L, sb, '%'); |
293 | break; | 279 | break; |
294 | default: | 280 | default: |
295 | addchar(L, sb, '%'); | 281 | lj_buf_putb(L, sb, '%'); |
296 | addchar(L, sb, e[1]); | 282 | lj_buf_putb(L, sb, e[1]); |
297 | break; | 283 | break; |
298 | } | 284 | } |
299 | fmt = e+2; | 285 | fmt = e+2; |
300 | } | 286 | } |
301 | addstr(L, sb, fmt, (MSize)strlen(fmt)); | 287 | lj_buf_putmem(L, sb, fmt, (MSize)strlen(fmt)); |
302 | setstrV(L, L->top, lj_str_new(L, sb->buf, sb->n)); | 288 | setstrV(L, L->top, lj_buf_str(L, sb)); |
303 | incr_top(L); | 289 | incr_top(L); |
304 | return strVdata(L->top - 1); | 290 | return strVdata(L->top - 1); |
305 | } | 291 | } |