| 147 | |
| 148 | |
| 149 | int |
| 150 | json_normalize_number(DYNAMIC_STRING *out, const char *str, size_t str_len) |
| 151 | { |
| 152 | int err= 0; |
| 153 | long int magnitude= 0; |
| 154 | int negative= 0; |
| 155 | size_t i= 0; |
| 156 | size_t j= 0; |
| 157 | size_t k= 0; |
| 158 | char *buf= NULL; |
| 159 | size_t buf_size = str_len + 1; |
| 160 | |
| 161 | buf= json_norm_malloc(buf_size); |
| 162 | if (!buf) |
| 163 | return 1; |
| 164 | |
| 165 | memset(buf, 0x00, buf_size); |
| 166 | |
| 167 | if (str[0] == '-') |
| 168 | { |
| 169 | negative= 1; |
| 170 | ++i; |
| 171 | } |
| 172 | |
| 173 | /* grab digits preceding the decimal */ |
| 174 | for (; i < str_len && str[i] != '.' && str[i] != 'e' && str[i] != 'E'; ++i) |
| 175 | buf[j++] = str[i]; |
| 176 | |
| 177 | magnitude = (long)(j - 1); |
| 178 | |
| 179 | if (i < str_len) |
| 180 | { |
| 181 | /* skip the . */ |
| 182 | if (str[i] == '.') |
| 183 | ++i; |
| 184 | |
| 185 | /* grab rest of digits before the E */ |
| 186 | for (; i < str_len && str[i] != 'e' && str[i] != 'E'; ++i) |
| 187 | buf[j++] = str[i]; |
| 188 | } |
| 189 | |
| 190 | /* trim trailing zeros */ |
| 191 | for (k = j - 1; k && buf[k] == '0'; --k, --j) |
| 192 | buf[k] = '\0'; |
| 193 | |
| 194 | /* trim the leading zeros */ |
| 195 | for (k = 0; buf[k] && buf[k] == '0'; ++k); |
| 196 | if (k) |
| 197 | { |
| 198 | memmove(buf, buf + k, j - k); |
| 199 | j = j - k; |
| 200 | buf[j] = '\0'; |
| 201 | magnitude -= (long)k; |
| 202 | } |
| 203 | |
| 204 | if (!j) |
| 205 | { |
| 206 | err= dynstr_append_mem(out, STRING_WITH_LEN("0.0E0")); |
no test coverage detected