aboutsummaryrefslogtreecommitdiff
path: root/src/lj_str.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_str.c')
-rw-r--r--src/lj_str.c41
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). */
189static char * str_bufint(char *p, int32_t k) 189static 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. */
199MSize 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. */
199const char *lj_str_buftv(char *buf, cTValue *o, MSize *lenp) 219const 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 '%':