aboutsummaryrefslogtreecommitdiff
path: root/src/lj_str.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-02-27 21:17:27 +0100
committerMike Pall <mike>2013-02-27 21:28:28 +0100
commit116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch)
treecc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_str.c
parent28cfcf77445e144335961a020e3e08d84cf0091f (diff)
downloadluajit-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.c38
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
221static 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
229static 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. */
236const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) 222const 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}