| 1022 | |
| 1023 | |
| 1024 | static int num2straux (char *buff, int sz, lua_Number x) { |
| 1025 | /* if 'inf' or 'NaN', format it like '%g' */ |
| 1026 | if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) |
| 1027 | return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); |
| 1028 | else if (x == 0) { /* can be -0... */ |
| 1029 | /* create "0" or "-0" followed by exponent */ |
| 1030 | return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x); |
| 1031 | } |
| 1032 | else { |
| 1033 | int e; |
| 1034 | lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ |
| 1035 | int n = 0; /* character count */ |
| 1036 | if (m < 0) { /* is number negative? */ |
| 1037 | buff[n++] = '-'; /* add sign */ |
| 1038 | m = -m; /* make it positive */ |
| 1039 | } |
| 1040 | buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ |
| 1041 | m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ |
| 1042 | e -= L_NBFD; /* this digit goes before the radix point */ |
| 1043 | if (m > 0) { /* more digits? */ |
| 1044 | buff[n++] = lua_getlocaledecpoint(); /* add radix point */ |
| 1045 | do { /* add as many digits as needed */ |
| 1046 | m = adddigit(buff, n++, m * 16); |
| 1047 | } while (m > 0); |
| 1048 | } |
| 1049 | n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ |
| 1050 | lua_assert(n < sz); |
| 1051 | return n; |
| 1052 | } |
| 1053 | } |
| 1054 | |
| 1055 | |
| 1056 | static int lua_number2strx (lua_State *L, char *buff, int sz, |
no test coverage detected