strparse: speed up number parsing
No binary (build failed)
—
(log yok)
| @@ -191,12 +191,17 @@ static int str_num_base(const char **linep, curl_off_t *nump, curl_off_t max, | |
| } while(valid_digit(*p, m)); | |
| } | |
| else { | |
| - | do { |
| - | int n = curlx_hexval(*p++); |
| - | if(num > ((max - n) / base)) |
| - | return STRE_OVERFLOW; |
| - | num = (num * base) + n; |
| - | } while(valid_digit(*p, m)); |
| + | curl_off_t cutoff = (max - (base - 1)) / base; |
| + | while(valid_digit(*p, m)) { |
| + | if(num <= cutoff) |
| + | num = (num * base) + curlx_hexval(*p++); |
| + | else { |
| + | int n = curlx_hexval(*p++); |
| + | if(num > ((max - n) / base)) |
| + | return STRE_OVERFLOW; |
| + | num = (num * base) + n; |
| + | } |
| + | } |
| } | |
| *nump = num; | |
| *linep = p; | |