aboutsummaryrefslogtreecommitdiff
path: root/lobject.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-10-20 14:36:32 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-10-20 14:36:32 -0200
commit8b88ab07f7cfc216407a88d75ad8f0546224c8d7 (patch)
tree71acdcf4416d114087419863f45186270d5c8d15 /lobject.c
parent2779ceeb125e603ea667171d9362e0b766b7abae (diff)
downloadlua-8b88ab07f7cfc216407a88d75ad8f0546224c8d7.tar.gz
lua-8b88ab07f7cfc216407a88d75ad8f0546224c8d7.tar.bz2
lua-8b88ab07f7cfc216407a88d75ad8f0546224c8d7.zip
more controled use of `sprintf'
Diffstat (limited to 'lobject.c')
-rw-r--r--lobject.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/lobject.c b/lobject.c
index fd54eefd..f7bf2bd0 100644
--- a/lobject.c
+++ b/lobject.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.c,v 1.53 2000/10/09 13:47:32 roberto Exp roberto $ 2** $Id: lobject.c,v 1.54 2000/10/10 19:53:20 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*/
@@ -76,10 +76,13 @@ int luaO_str2d (const char *s, Number *result) { /* LUA_NUMBER */
76} 76}
77 77
78 78
79/* maximum length of a string format for `luaO_verror' */
80#define MAX_VERROR 280
81
79/* this function needs to handle only '%d' and '%.XXs' formats */ 82/* this function needs to handle only '%d' and '%.XXs' formats */
80void luaO_verror (lua_State *L, const char *fmt, ...) { 83void luaO_verror (lua_State *L, const char *fmt, ...) {
81 va_list argp; 84 va_list argp;
82 char buff[600]; /* to hold formatted message */ 85 char buff[MAX_VERROR]; /* to hold formatted message */
83 va_start(argp, fmt); 86 va_start(argp, fmt);
84 vsprintf(buff, fmt, argp); 87 vsprintf(buff, fmt, argp);
85 va_end(argp); 88 va_end(argp);
@@ -88,8 +91,10 @@ void luaO_verror (lua_State *L, const char *fmt, ...) {
88 91
89 92
90void luaO_chunkid (char *out, const char *source, int bufflen) { 93void luaO_chunkid (char *out, const char *source, int bufflen) {
91 if (*source == '=') 94 if (*source == '=') {
92 sprintf(out, "%.*s", bufflen-1, source+1); /* remove first char */ 95 strncpy(out, source+1, bufflen); /* remove first char */
96 out[bufflen-1] = '\0'; /* ensures null termination */
97 }
93 else { 98 else {
94 if (*source == '@') { 99 if (*source == '@') {
95 int l; 100 int l;
@@ -98,19 +103,23 @@ void luaO_chunkid (char *out, const char *source, int bufflen) {
98 l = strlen(source); 103 l = strlen(source);
99 if (l>bufflen) { 104 if (l>bufflen) {
100 source += (l-bufflen); /* get last part of file name */ 105 source += (l-bufflen); /* get last part of file name */
101 sprintf(out, "file `...%s'", source); 106 sprintf(out, "file `...%.99s'", source);
102 } 107 }
103 else 108 else
104 sprintf(out, "file `%s'", source); 109 sprintf(out, "file `%.99s'", source);
105 } 110 }
106 else { 111 else {
107 int len = strcspn(source, "\n"); /* stop at first newline */ 112 int len = strcspn(source, "\n"); /* stop at first newline */
108 bufflen -= sizeof("string \"%.*s...\""); 113 bufflen -= sizeof("string \"%.*s...\"");
109 if (len > bufflen) len = bufflen; 114 if (len > bufflen) len = bufflen;
110 if (source[len] != '\0') /* must truncate? */ 115 if (source[len] != '\0') { /* must truncate? */
111 sprintf(out, "string \"%.*s...\"", len, source); 116 strcpy(out, "string \"");
117 out += strlen(out);
118 strncpy(out, source, len);
119 strcpy(out+len, "...\"");
120 }
112 else 121 else
113 sprintf(out, "string \"%s\"", source); 122 sprintf(out, "string \"%.99s\"", source);
114 } 123 }
115 } 124 }
116} 125}