| 923 | |
| 924 | |
| 925 | static int num2straux(char *buff, int sz, lua_Number x) { |
| 926 | if (x != x || x == HUGE_VAL || x == -HUGE_VAL) /* inf or NaN? */ |
| 927 | return l_sprintf(buff, sz, LUA_NUMBER_FMT, x); /* equal to '%g' */ |
| 928 | else if (x == 0) { /* can be -0... */ |
| 929 | /* create "0" or "-0" followed by exponent */ |
| 930 | return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", x); |
| 931 | } |
| 932 | else { |
| 933 | int e; |
| 934 | lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ |
| 935 | int n = 0; /* character count */ |
| 936 | if (m < 0) { /* is number negative? */ |
| 937 | buff[n++] = '-'; /* add signal */ |
| 938 | m = -m; /* make it positive */ |
| 939 | } |
| 940 | buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ |
| 941 | m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ |
| 942 | e -= L_NBFD; /* this digit goes before the radix point */ |
| 943 | if (m > 0) { /* more digits? */ |
| 944 | buff[n++] = lua_getlocaledecpoint(); /* add radix point */ |
| 945 | do { /* add as many digits as needed */ |
| 946 | m = adddigit(buff, n++, m * 16); |
| 947 | } while (m > 0); |
| 948 | } |
| 949 | n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ |
| 950 | lua_assert(n < sz); |
| 951 | return n; |
| 952 | } |
| 953 | } |
| 954 | |
| 955 | |
| 956 | static int lua_number2strx(lua_State *L, char *buff, int sz, |
no test coverage detected