aboutsummaryrefslogtreecommitdiff
path: root/lstrlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-12-10 09:36:03 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-12-10 09:36:03 -0200
commit5c519a69d3e25f5c210a858f0abf721cd7a2fdab (patch)
tree1f46e31684fd970962aa01985666f37fd83dfe59 /lstrlib.c
parent6f54b07663c48c6f306e93844598b509c2db444f (diff)
downloadlua-5c519a69d3e25f5c210a858f0abf721cd7a2fdab.tar.gz
lua-5c519a69d3e25f5c210a858f0abf721cd7a2fdab.tar.bz2
lua-5c519a69d3e25f5c210a858f0abf721cd7a2fdab.zip
new function 'string.packsize'
Diffstat (limited to 'lstrlib.c')
-rw-r--r--lstrlib.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/lstrlib.c b/lstrlib.c
index 9fd906ae..d220ffb6 100644
--- a/lstrlib.c
+++ b/lstrlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstrlib.c,v 1.217 2014/11/11 19:40:20 roberto Exp roberto $ 2** $Id: lstrlib.c,v 1.218 2014/12/04 16:25:40 roberto Exp roberto $
3** Standard library for string operations and pattern-matching 3** Standard library for string operations and pattern-matching
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1258,6 +1258,28 @@ static int str_pack (lua_State *L) {
1258} 1258}
1259 1259
1260 1260
1261static int str_packsize (lua_State *L) {
1262 Header h;
1263 const char *fmt = luaL_checkstring(L, 1); /* format string */
1264 lua_Integer totalsize = 0; /* accumulate total size of result */
1265 initheader(L, &h);
1266 while (*fmt != '\0') {
1267 int size, ntoalign;
1268 KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);
1269 totalsize += ntoalign + size;
1270 switch (opt) {
1271 case Kstring: /* strings with length count */
1272 case Kzstr: /* zero-terminated string */
1273 luaL_argerror(L, 1, "variable-length format");
1274 break;
1275 default: break;
1276 }
1277 }
1278 lua_pushinteger(L, totalsize);
1279 return 1;
1280}
1281
1282
1261/* 1283/*
1262** Unpack an integer with 'size' bytes and 'islittle' endianness. 1284** Unpack an integer with 'size' bytes and 'islittle' endianness.
1263** If size is smaller than the size of a Lua integer and integer 1285** If size is smaller than the size of a Lua integer and integer
@@ -1374,6 +1396,7 @@ static const luaL_Reg strlib[] = {
1374 {"sub", str_sub}, 1396 {"sub", str_sub},
1375 {"upper", str_upper}, 1397 {"upper", str_upper},
1376 {"pack", str_pack}, 1398 {"pack", str_pack},
1399 {"packsize", str_packsize},
1377 {"unpack", str_unpack}, 1400 {"unpack", str_unpack},
1378 {NULL, NULL} 1401 {NULL, NULL}
1379}; 1402};