|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lobject.c,v 2.24 2006/11/22 11:02:03 roberto Exp roberto $
|
|
|
+** $Id: lobject.c,v 2.25 2007/04/10 12:18:17 roberto Exp roberto $
|
|
|
** Some generic functions over Lua objects
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -161,36 +161,46 @@ const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+#define LL(x) (sizeof(x) - 1)
|
|
|
+#define RETS "..."
|
|
|
+#define PRE "[string \""
|
|
|
+#define POS "\"]"
|
|
|
+
|
|
|
+#define addstr(a,b,l) ( memcpy(a,b,l), a += (l) )
|
|
|
+
|
|
|
void luaO_chunkid (char *out, const char *source, size_t bufflen) {
|
|
|
- if (*source == '=') {
|
|
|
- strncpy(out, source+1, bufflen); /* remove first char */
|
|
|
- out[bufflen-1] = '\0'; /* ensures null termination */
|
|
|
+ size_t l = strlen(source);
|
|
|
+ if (*source == '=') { /* 'literal' source */
|
|
|
+ if (l <= bufflen) /* small enough? */
|
|
|
+ memcpy(out, source + 1, l);
|
|
|
+ else { /* truncate it */
|
|
|
+ addstr(out, source + 1, bufflen - 1);
|
|
|
+ *out = '\0';
|
|
|
+ }
|
|
|
}
|
|
|
- else { /* out = "source", or "...source" */
|
|
|
- if (*source == '@') {
|
|
|
- size_t l;
|
|
|
- source++; /* skip the `@' */
|
|
|
- bufflen -= sizeof(" '...' ");
|
|
|
- l = strlen(source);
|
|
|
- strcpy(out, "");
|
|
|
- if (l > bufflen) {
|
|
|
- source += (l-bufflen); /* get last part of file name */
|
|
|
- strcat(out, "...");
|
|
|
- }
|
|
|
- strcat(out, source);
|
|
|
+ else if (*source == '@') { /* file name */
|
|
|
+ if (l <= bufflen) /* small enough? */
|
|
|
+ memcpy(out, source + 1, l);
|
|
|
+ else { /* add '...' before rest of name */
|
|
|
+ addstr(out, RETS, LL(RETS));
|
|
|
+ bufflen -= LL(RETS);
|
|
|
+ memcpy(out, source + 1 + l - bufflen, bufflen);
|
|
|
}
|
|
|
- else { /* out = [string "string"] */
|
|
|
- size_t len = strcspn(source, "\n\r"); /* stop at first newline */
|
|
|
- bufflen -= sizeof(" [string \"...\"] ");
|
|
|
- if (len > bufflen) len = bufflen;
|
|
|
- strcpy(out, "[string \"");
|
|
|
- if (source[len] != '\0') { /* must truncate? */
|
|
|
- strncat(out, source, len);
|
|
|
- strcat(out, "...");
|
|
|
- }
|
|
|
- else
|
|
|
- strcat(out, source);
|
|
|
- strcat(out, "\"]");
|
|
|
+ }
|
|
|
+ else { /* string; format as [string "source"] */
|
|
|
+ const char *nl = strchr(source, '\n'); /* find first new line (if any) */
|
|
|
+ addstr(out, PRE, LL(PRE)); /* add prefix */
|
|
|
+ bufflen -= LL(PRE RETS POS); /* save space for prefix+sufix */
|
|
|
+ if (l < bufflen && nl == NULL) { /* small one-line source? */
|
|
|
+ addstr(out, source, l); /* keep it */
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (nl != NULL) l = nl - source; /* stop at first newline */
|
|
|
+ if (l > bufflen) l = bufflen;
|
|
|
+ addstr(out, source, l);
|
|
|
+ addstr(out, RETS, LL(RETS));
|
|
|
}
|
|
|
+ memcpy(out, POS, LL(POS) + 1);
|
|
|
}
|
|
|
}
|