| 839 | |
| 840 | |
| 841 | static int num2straux (char *buff, int sz, lua_Number x) { |
| 842 | /* if 'inf' or 'NaN', format it like '%g' */ |
| 843 | if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) |
| 844 | return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); |
| 845 | else if (x == 0) { /* can be -0... */ |
| 846 | /* create "0" or "-0" followed by exponent */ |
| 847 | return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x); |
| 848 | } |
| 849 | else { |
| 850 | int e; |
| 851 | lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ |
| 852 | int n = 0; /* character count */ |
| 853 | if (m < 0) { /* is number negative? */ |
| 854 | buff[n++] = '-'; /* add signal */ |
| 855 | m = -m; /* make it positive */ |
| 856 | } |
| 857 | buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ |
| 858 | m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ |
| 859 | e -= L_NBFD; /* this digit goes before the radix point */ |
| 860 | if (m > 0) { /* more digits? */ |
| 861 | buff[n++] = lua_getlocaledecpoint(); /* add radix point */ |
| 862 | do { /* add as many digits as needed */ |
| 863 | m = adddigit(buff, n++, m * 16); |
| 864 | } while (m > 0); |
| 865 | } |
| 866 | n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ |
| 867 | lua_assert(n < sz); |
| 868 | return n; |
| 869 | } |
| 870 | } |
| 871 | |
| 872 | |
| 873 | static int lua_number2strx (lua_State *L, char *buff, int sz, |
no test coverage detected