aboutsummaryrefslogtreecommitdiff
path: root/lstrlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-13 13:16:53 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-13 13:16:53 -0300
commitcf71a5ddc742692fad813f89f1c9ef53e1ffde0f (patch)
treedf02305ff3cf05908f21829384e3a7f8699d2331 /lstrlib.c
parent2c32bff60987d38a60a58d4f0123f3783da60a63 (diff)
downloadlua-cf71a5ddc742692fad813f89f1c9ef53e1ffde0f.tar.gz
lua-cf71a5ddc742692fad813f89f1c9ef53e1ffde0f.tar.bz2
lua-cf71a5ddc742692fad813f89f1c9ef53e1ffde0f.zip
Details
Several small improvements (code style, warnings, comments, more tests), in particular: - 'lua_topointer' extended to handle strings - raises an error in 'string.format("%10q")' ('%q' with modifiers) - in the manual for 'string.format', the term "option" replaced by "conversion specifier" (the term used by the C standard)
Diffstat (limited to 'lstrlib.c')
-rw-r--r--lstrlib.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/lstrlib.c b/lstrlib.c
index 41ebc523..ab4258e5 100644
--- a/lstrlib.c
+++ b/lstrlib.c
@@ -181,7 +181,7 @@ static int str_byte (lua_State *L) {
181 size_t pose = getendpos(L, 3, pi, l); 181 size_t pose = getendpos(L, 3, pi, l);
182 int n, i; 182 int n, i;
183 if (posi > pose) return 0; /* empty interval; return no values */ 183 if (posi > pose) return 0; /* empty interval; return no values */
184 if (pose - posi >= INT_MAX) /* arithmetic overflow? */ 184 if (pose - posi >= (size_t)INT_MAX) /* arithmetic overflow? */
185 return luaL_error(L, "string slice too long"); 185 return luaL_error(L, "string slice too long");
186 n = (int)(pose - posi) + 1; 186 n = (int)(pose - posi) + 1;
187 luaL_checkstack(L, n, "string slice too long"); 187 luaL_checkstack(L, n, "string slice too long");
@@ -1159,7 +1159,7 @@ static int str_format (lua_State *L) {
1159 char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */ 1159 char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */
1160 int nb = 0; /* number of bytes in added item */ 1160 int nb = 0; /* number of bytes in added item */
1161 if (++arg > top) 1161 if (++arg > top)
1162 luaL_argerror(L, arg, "no value"); 1162 return luaL_argerror(L, arg, "no value");
1163 strfrmt = scanformat(L, strfrmt, form); 1163 strfrmt = scanformat(L, strfrmt, form);
1164 switch (*strfrmt++) { 1164 switch (*strfrmt++) {
1165 case 'c': { 1165 case 'c': {
@@ -1186,6 +1186,8 @@ static int str_format (lua_State *L) {
1186 break; 1186 break;
1187 } 1187 }
1188 case 'q': { 1188 case 'q': {
1189 if (form[2] != '\0') /* modifiers? */
1190 return luaL_error(L, "specifier '%%q' cannot have modifiers");
1189 addliteral(L, &b, arg); 1191 addliteral(L, &b, arg);
1190 break; 1192 break;
1191 } 1193 }