diff options
Diffstat (limited to 'lobject.c')
| -rw-r--r-- | lobject.c | 38 |
1 files changed, 23 insertions, 15 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.c,v 1.51 2000/10/03 14:03:21 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 1.52 2000/10/05 12:14:08 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 | */ |
| @@ -87,23 +87,31 @@ void luaO_verror (lua_State *L, const char *fmt, ...) { | |||
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | 89 | ||
| 90 | #define EXTRALEN sizeof("string \"...\"0") | 90 | #define EXTRALEN sizeof(" string \"s...\" ") |
| 91 | 91 | ||
| 92 | void luaO_chunkid (char *out, const char *source, int len) { | 92 | void luaO_chunkid (char *out, const char *source, int bufflen) { |
| 93 | if (*source == '(') { | 93 | if (*source == '=') |
| 94 | strncpy(out, source+1, len-1); /* remove first char */ | 94 | sprintf(out, "%.*s", bufflen, source+1); /* remove first char */ |
| 95 | out[len-1] = '\0'; /* make sure `out' has an end */ | ||
| 96 | out[strlen(out)-1] = '\0'; /* remove last char */ | ||
| 97 | } | ||
| 98 | else { | 95 | else { |
| 99 | len -= EXTRALEN; | 96 | bufflen -= EXTRALEN; |
| 100 | if (*source == '@') | 97 | if (*source == '@') { |
| 101 | sprintf(out, "file `%.*s'", len, source+1); | 98 | int l; |
| 99 | source++; /* skip the `@' */ | ||
| 100 | l = strlen(source); | ||
| 101 | if (l>bufflen) { | ||
| 102 | source += (l-bufflen); /* get last part of file name */ | ||
| 103 | sprintf(out, "file `...%s'", source); | ||
| 104 | } | ||
| 105 | else | ||
| 106 | sprintf(out, "file `%s'", source); | ||
| 107 | } | ||
| 102 | else { | 108 | else { |
| 103 | const char *b = strchr(source , '\n'); /* stop at first new line */ | 109 | int len = strcspn(source, "\n"); /* stop at first newline */ |
| 104 | int lim = (b && (b-source)<len) ? b-source : len; | 110 | if (len > bufflen) len = bufflen; |
| 105 | sprintf(out, "string \"%.*s\"", lim, source); | 111 | if (source[len] != '\0') /* must truncate? */ |
| 106 | strcpy(out+lim+(EXTRALEN-sizeof("...\"0")), "...\""); | 112 | sprintf(out, "string \"%.*s...\"", len, source); |
| 113 | else | ||
| 114 | sprintf(out, "string \"%s\"", source); | ||
| 107 | } | 115 | } |
| 108 | } | 116 | } |
| 109 | } | 117 | } |
