diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-05-03 13:01:57 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-05-03 13:01:57 -0300 |
| commit | ad2531a0eefb6950d589c0d508b1f959f3f58d8b (patch) | |
| tree | 706eca04d13655367b3743bd6a4e8c544a2b0928 /lobject.c | |
| parent | bc1c718cc02d4a0163110cb21bcbdd2985e4d28d (diff) | |
| download | lua-ad2531a0eefb6950d589c0d508b1f959f3f58d8b.tar.gz lua-ad2531a0eefb6950d589c0d508b1f959f3f58d8b.tar.bz2 lua-ad2531a0eefb6950d589c0d508b1f959f3f58d8b.zip | |
more complete (and hopefuly more correct) handling of 'sizeof(char)'
Diffstat (limited to 'lobject.c')
| -rw-r--r-- | lobject.c | 16 |
1 files changed, 9 insertions, 7 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.c,v 2.46 2011/02/07 19:15:24 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 2.47 2011/04/05 18:32:06 roberto Exp roberto $ |
| 3 | ** Some generic functions over Lua objects | 3 | ** Some generic functions over Lua objects |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -264,19 +264,20 @@ const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { | |||
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | 266 | ||
| 267 | /* number of chars of a literal string without the ending \0 */ | ||
| 268 | #define LL(x) (sizeof(x)/sizeof(char) - 1) | ||
| 267 | 269 | ||
| 268 | #define LL(x) ((sizeof(x) - 1)/sizeof(char)) | ||
| 269 | #define RETS "..." | 270 | #define RETS "..." |
| 270 | #define PRE "[string \"" | 271 | #define PRE "[string \"" |
| 271 | #define POS "\"]" | 272 | #define POS "\"]" |
| 272 | 273 | ||
| 273 | #define addstr(a,b,l) ( memcpy(a,b,l), a += (l) ) | 274 | #define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) |
| 274 | 275 | ||
| 275 | void luaO_chunkid (char *out, const char *source, size_t bufflen) { | 276 | void luaO_chunkid (char *out, const char *source, size_t bufflen) { |
| 276 | size_t l = strlen(source); | 277 | size_t l = strlen(source); |
| 277 | if (*source == '=') { /* 'literal' source */ | 278 | if (*source == '=') { /* 'literal' source */ |
| 278 | if (l <= bufflen) /* small enough? */ | 279 | if (l <= bufflen) /* small enough? */ |
| 279 | memcpy(out, source + 1, l); | 280 | memcpy(out, source + 1, l * sizeof(char)); |
| 280 | else { /* truncate it */ | 281 | else { /* truncate it */ |
| 281 | addstr(out, source + 1, bufflen - 1); | 282 | addstr(out, source + 1, bufflen - 1); |
| 282 | *out = '\0'; | 283 | *out = '\0'; |
| @@ -284,11 +285,11 @@ void luaO_chunkid (char *out, const char *source, size_t bufflen) { | |||
| 284 | } | 285 | } |
| 285 | else if (*source == '@') { /* file name */ | 286 | else if (*source == '@') { /* file name */ |
| 286 | if (l <= bufflen) /* small enough? */ | 287 | if (l <= bufflen) /* small enough? */ |
| 287 | memcpy(out, source + 1, l); | 288 | memcpy(out, source + 1, l * sizeof(char)); |
| 288 | else { /* add '...' before rest of name */ | 289 | else { /* add '...' before rest of name */ |
| 289 | addstr(out, RETS, LL(RETS)); | 290 | addstr(out, RETS, LL(RETS)); |
| 290 | bufflen -= LL(RETS); | 291 | bufflen -= LL(RETS); |
| 291 | memcpy(out, source + 1 + l - bufflen, bufflen); | 292 | memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char)); |
| 292 | } | 293 | } |
| 293 | } | 294 | } |
| 294 | else { /* string; format as [string "source"] */ | 295 | else { /* string; format as [string "source"] */ |
| @@ -304,6 +305,7 @@ void luaO_chunkid (char *out, const char *source, size_t bufflen) { | |||
| 304 | addstr(out, source, l); | 305 | addstr(out, source, l); |
| 305 | addstr(out, RETS, LL(RETS)); | 306 | addstr(out, RETS, LL(RETS)); |
| 306 | } | 307 | } |
| 307 | memcpy(out, POS, LL(POS) + 1); | 308 | memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); |
| 308 | } | 309 | } |
| 309 | } | 310 | } |
| 311 | |||
