MCPcopy Create free account
hub / github.com/CppCXY/EmmyLuaCodeStyle / str_format

Function str_format

3rd/lua-5.4.3/src/lstrlib.c:1227–1318  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 15

lua_gettopFunction · 0.85
luaL_checklstringFunction · 0.85
luaL_buffinitFunction · 0.85
luaL_prepbuffsizeFunction · 0.85
luaL_argerrorFunction · 0.85
scanformatFunction · 0.85
luaL_checkintegerFunction · 0.85
addlenmodFunction · 0.85
lua_number2strxFunction · 0.85
luaL_checknumberFunction · 0.85
lua_topointerFunction · 0.85
luaL_errorFunction · 0.85

Tested by

no test coverage detected