| 1222 | |
| 1223 | |
| 1224 | static int str_format (lua_State *L) { |
| 1225 | int top = lua_gettop(L); |
| 1226 | int arg = 1; |
| 1227 | size_t sfl; |
| 1228 | const char *strfrmt = luaL_checklstring(L, arg, &sfl); |
| 1229 | const char *strfrmt_end = strfrmt+sfl; |
| 1230 | luaL_Buffer b; |
| 1231 | luaL_buffinit(L, &b); |
| 1232 | while (strfrmt < strfrmt_end) { |
| 1233 | if (*strfrmt != L_ESC) |
| 1234 | luaL_addchar(&b, *strfrmt++); |
| 1235 | else if (*++strfrmt == L_ESC) |
| 1236 | luaL_addchar(&b, *strfrmt++); /* %% */ |
| 1237 | else { /* format item */ |
| 1238 | char form[MAX_FORMAT]; /* to store the format ('%...') */ |
| 1239 | int maxitem = MAX_ITEM; |
| 1240 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put formatted item */ |
| 1241 | int nb = 0; /* number of bytes in added item */ |
| 1242 | if (++arg > top) |
| 1243 | return luaL_argerror(L, arg, "no value"); |
| 1244 | strfrmt = scanformat(L, strfrmt, form); |
| 1245 | switch (*strfrmt++) { |
| 1246 | case 'c': { |
| 1247 | nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); |
| 1248 | break; |
| 1249 | } |
| 1250 | case 'd': case 'i': |
| 1251 | case 'o': case 'u': case 'x': case 'X': { |
| 1252 | lua_Integer n = luaL_checkinteger(L, arg); |
| 1253 | addlenmod(form, LUA_INTEGER_FRMLEN); |
| 1254 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); |
| 1255 | break; |
| 1256 | } |
| 1257 | case 'a': case 'A': |
| 1258 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1259 | nb = lua_number2strx(L, buff, maxitem, form, |
| 1260 | luaL_checknumber(L, arg)); |
| 1261 | break; |
| 1262 | case 'f': |
| 1263 | maxitem = MAX_ITEMF; /* extra space for '%f' */ |
| 1264 | buff = luaL_prepbuffsize(&b, maxitem); |
| 1265 | /* FALLTHROUGH */ |
| 1266 | case 'e': case 'E': case 'g': case 'G': { |
| 1267 | lua_Number n = luaL_checknumber(L, arg); |
| 1268 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 1269 | nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); |
| 1270 | break; |
| 1271 | } |
| 1272 | case 'p': { |
| 1273 | const void *p = lua_topointer(L, arg); |
| 1274 | if (p == NULL) { /* avoid calling 'printf' with argument NULL */ |
| 1275 | p = "(null)"; /* result */ |
| 1276 | form[strlen(form) - 1] = 's'; /* format it as a string */ |
| 1277 | } |
| 1278 | nb = l_sprintf(buff, maxitem, form, p); |
| 1279 | break; |
| 1280 | } |
| 1281 | case 'q': { |
nothing calls this directly
no test coverage detected