| 870 | |
| 871 | |
| 872 | static int str_format (lua_State *L) { |
| 873 | int top = lua_gettop(L); |
| 874 | int arg = 1; |
| 875 | size_t sfl; |
| 876 | const char *strfrmt = luaL_checklstring(L, arg, &sfl); |
| 877 | const char *strfrmt_end = strfrmt+sfl; |
| 878 | luaL_Buffer b; |
| 879 | luaL_buffinit(L, &b); |
| 880 | while (strfrmt < strfrmt_end) { |
| 881 | if (*strfrmt != L_ESC) |
| 882 | luaL_addchar(&b, *strfrmt++); |
| 883 | else if (*++strfrmt == L_ESC) |
| 884 | luaL_addchar(&b, *strfrmt++); /* %% */ |
| 885 | else { /* format item */ |
| 886 | char form[MAX_FORMAT]; /* to store the format ('%...') */ |
| 887 | char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */ |
| 888 | int nb = 0; /* number of bytes in added item */ |
| 889 | if (++arg > top) |
| 890 | luaL_argerror(L, arg, "no value"); |
| 891 | strfrmt = scanformat(L, strfrmt, form); |
| 892 | switch (*strfrmt++) { |
| 893 | case 'c': { |
| 894 | nb = sprintf(buff, form, (int)luaL_checkinteger(L, arg)); |
| 895 | break; |
| 896 | } |
| 897 | case 'd': case 'i': |
| 898 | case 'o': case 'u': case 'x': case 'X': { |
| 899 | lua_Integer n = luaL_checkinteger(L, arg); |
| 900 | addlenmod(form, LUA_INTEGER_FRMLEN); |
| 901 | nb = sprintf(buff, form, n); |
| 902 | break; |
| 903 | } |
| 904 | #if defined(LUA_USE_AFORMAT) |
| 905 | case 'a': case 'A': |
| 906 | #endif |
| 907 | case 'e': case 'E': case 'f': |
| 908 | case 'g': case 'G': { |
| 909 | addlenmod(form, LUA_NUMBER_FRMLEN); |
| 910 | nb = sprintf(buff, form, luaL_checknumber(L, arg)); |
| 911 | break; |
| 912 | } |
| 913 | case 'q': { |
| 914 | addquoted(L, &b, arg); |
| 915 | break; |
| 916 | } |
| 917 | case 's': { |
| 918 | size_t l; |
| 919 | const char *s = luaL_tolstring(L, arg, &l); |
| 920 | if (!strchr(form, '.') && l >= 100) { |
| 921 | /* no precision and string is too long to be formatted; |
| 922 | keep original string */ |
| 923 | luaL_addvalue(&b); |
| 924 | break; |
| 925 | } |
| 926 | else { |
| 927 | nb = sprintf(buff, form, s); |
| 928 | lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ |
| 929 | break; |
nothing calls this directly
no test coverage detected