diff options
Diffstat (limited to 'src/lj_str.c')
-rw-r--r-- | src/lj_str.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/lj_str.c b/src/lj_str.c index 5482f7c4..9eb04c57 100644 --- a/src/lj_str.c +++ b/src/lj_str.c | |||
@@ -186,7 +186,7 @@ MSize LJ_FASTCALL lj_str_bufnum(char *s, cTValue *o) | |||
186 | } | 186 | } |
187 | 187 | ||
188 | /* Print integer to buffer. Returns pointer to start (!= buffer start). */ | 188 | /* Print integer to buffer. Returns pointer to start (!= buffer start). */ |
189 | static char * str_bufint(char *p, int32_t k) | 189 | static char *str_bufint(char *p, int32_t k) |
190 | { | 190 | { |
191 | uint32_t u = (uint32_t)(k < 0 ? -k : k); | 191 | uint32_t u = (uint32_t)(k < 0 ? -k : k); |
192 | p += LJ_STR_INTBUF; | 192 | p += LJ_STR_INTBUF; |
@@ -195,6 +195,26 @@ static char * str_bufint(char *p, int32_t k) | |||
195 | return p; | 195 | return p; |
196 | } | 196 | } |
197 | 197 | ||
198 | /* Print pointer to buffer. */ | ||
199 | MSize LJ_FASTCALL lj_str_bufptr(char *p, const void *v) | ||
200 | { | ||
201 | ptrdiff_t x = (ptrdiff_t)v; | ||
202 | MSize i, n = LJ_STR_PTRBUF; | ||
203 | if (x == 0) { | ||
204 | p[0] = 'N'; p[1] = 'U'; p[2] = 'L'; p[3] = 'L'; | ||
205 | return 4; | ||
206 | } | ||
207 | #if LJ_64 | ||
208 | /* Shorten output for 64 bit pointers. */ | ||
209 | n = 2+2*4+((x >> 32) ? 2+2*(lj_fls((uint32_t)(x >> 32))>>3) : 0); | ||
210 | #endif | ||
211 | p[0] = '0'; | ||
212 | p[1] = 'x'; | ||
213 | for (i = n-1; i >= 2; i--, x >>= 4) | ||
214 | p[i] = "0123456789abcdef"[(x & 15)]; | ||
215 | return n; | ||
216 | } | ||
217 | |||
198 | /* Print TValue to buffer (only for numbers) and return pointer to start. */ | 218 | /* Print TValue to buffer (only for numbers) and return pointer to start. */ |
199 | const char *lj_str_buftv(char *buf, cTValue *o, MSize *lenp) | 219 | const char *lj_str_buftv(char *buf, cTValue *o, MSize *lenp) |
200 | { | 220 | { |
@@ -275,22 +295,9 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp) | |||
275 | } | 295 | } |
276 | case 'p': { | 296 | case 'p': { |
277 | #define FMTP_CHARS (2*sizeof(ptrdiff_t)) | 297 | #define FMTP_CHARS (2*sizeof(ptrdiff_t)) |
278 | char buf[2+FMTP_CHARS]; | 298 | char buf[LJ_STR_PTRBUF]; |
279 | ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *)); | 299 | MSize len = lj_str_bufptr(buf, va_arg(argp, void *)); |
280 | ptrdiff_t i, lasti = 2+FMTP_CHARS; | 300 | lj_buf_putmem(sb, buf, len); |
281 | if (p == 0) { | ||
282 | lj_buf_putmem(sb, "NULL", 4); | ||
283 | break; | ||
284 | } | ||
285 | #if LJ_64 | ||
286 | /* Shorten output for 64 bit pointers. */ | ||
287 | lasti = 2+2*4+((p >> 32) ? 2+2*(lj_fls((uint32_t)(p >> 32))>>3) : 0); | ||
288 | #endif | ||
289 | buf[0] = '0'; | ||
290 | buf[1] = 'x'; | ||
291 | for (i = lasti-1; i >= 2; i--, p >>= 4) | ||
292 | buf[i] = "0123456789abcdef"[(p & 15)]; | ||
293 | lj_buf_putmem(sb, buf, (MSize)lasti); | ||
294 | break; | 301 | break; |
295 | } | 302 | } |
296 | case '%': | 303 | case '%': |