| 1271 | |
| 1272 | |
| 1273 | static int str_format (lua_State *L) { |
| 1274 | int top = lua_gettop(L); |
| 1275 | int arg = 1; |
| 1276 | size_t sfl; |
| 1277 | const char *strfrmt = luaL_checklstring(L, arg, &sfl); |
| 1278 | const char *strfrmt_end = strfrmt+sfl; |
| 1279 | const char *flags; |
| 1280 | luaL_Buffer b; |
| 1281 | luaL_buffinit(L, &b); |
| 1282 | while (strfrmt < strfrmt_end) { |
| 1283 | if (*strfrmt != L_ESC) |
| 1284 | luaL_addchar(&b, *strfrmt++); |
| 1285 | else if (*++strfrmt == L_ESC) |
| 1286 | luaL_addchar(&b, *strfrmt++); /* %% */ |
| 1287 | else { /* format item */ |
| 1288 | char form[MAX_FORMAT]; /* to store the format ('%...') */ |
| 1289 | int maxitem = MAX_ITEM; /* maximum length for the result */ |
| 1290 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ |
| 1291 | int nb = 0; /* number of bytes in result */ |
| 1292 | if (++arg > top) |
| 1293 | return luaL_argerror(L, arg, "no value"); |
| 1294 | strfrmt = getformat(L, strfrmt, form); |
| 1295 | switch (*strfrmt++) { |
| 1296 | case 'c': { |
| 1297 | checkformat(L, form, L_FMTFLAGSC, 0); |
| 1298 | nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); |
| 1299 | break; |
| 1300 | } |
| 1301 | case 'd': case 'i': |
| 1302 | flags = L_FMTFLAGSI; |
| 1303 | goto intcase; |
| 1304 | case 'u': |
| 1305 | flags = L_FMTFLAGSU; |
| 1306 | goto intcase; |
| 1307 | case 'o': case 'x': case 'X': |
| 1308 | flags = L_FMTFLAGSX; |
| 1309 | intcase: { |
| 1310 | lua_Integer n = luaL_checkinteger(L, arg); |
| 1311 | checkformat(L, form, flags, 1); |
| 1312 | addlenmod(form, LUA_INTEGER_FRMLEN); |
| 1313 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); |
| 1314 | break; |
| 1315 | } |
| 1316 | case 'a': case 'A': |
| 1317 | checkformat(L, form, L_FMTFLAGSF, 1); |
| 1318 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1319 | nb = lua_number2strx(L, buff, maxitem, form, |
| 1320 | luaL_checknumber(L, arg)); |
| 1321 | break; |
| 1322 | case 'f': |
| 1323 | maxitem = MAX_ITEMF; /* extra space for '%f' */ |
| 1324 | buff = luaL_prepbuffsize(&b, maxitem); |
| 1325 | /* FALLTHROUGH */ |
| 1326 | case 'e': case 'E': case 'g': case 'G': { |
| 1327 | lua_Number n = luaL_checknumber(L, arg); |
| 1328 | checkformat(L, form, L_FMTFLAGSF, 1); |
| 1329 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1330 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); |
nothing calls this directly
no test coverage detected