diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-03-12 15:59:32 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2010-03-12 15:59:32 -0300 |
commit | f292760f12022a83cf01e788482a264aeeb3c276 (patch) | |
tree | 4d5b490657f6ea18f2c754eed2991e2fd0c570cf | |
parent | 1124cb12474b4398384bdefbf12a0769521e17bb (diff) | |
download | lua-f292760f12022a83cf01e788482a264aeeb3c276.tar.gz lua-f292760f12022a83cf01e788482a264aeeb3c276.tar.bz2 lua-f292760f12022a83cf01e788482a264aeeb3c276.zip |
small optimization in luaL_addlstring (avoid adding chars one by one)
(suggested by Chuck Coffing)
-rw-r--r-- | lauxlib.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.200 2010/02/18 19:32:41 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.201 2010/02/18 19:37:57 roberto Exp roberto $ |
3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -393,8 +393,19 @@ LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { | |||
393 | 393 | ||
394 | 394 | ||
395 | LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { | 395 | LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { |
396 | while (l--) | 396 | while (l) { |
397 | luaL_addchar(B, *s++); | 397 | size_t space = bufffree(B); |
398 | if (space == 0) { | ||
399 | luaL_prepbuffer(B); | ||
400 | lua_assert(bufffree(B) == LUAL_BUFFERSIZE); | ||
401 | space = LUAL_BUFFERSIZE; | ||
402 | } | ||
403 | if (space > l) space = l; | ||
404 | memcpy(B->p, s, space); | ||
405 | B->p += space; | ||
406 | s += space; | ||
407 | l -= space; | ||
408 | } | ||
398 | } | 409 | } |
399 | 410 | ||
400 | 411 | ||