219 if(errno == 0) { |
219 if(errno == 0) { |
220 *value = val; |
220 *value = val; |
221 return 1; |
221 return 1; |
222 } else { |
222 } else { |
223 return 0; |
223 return 0; |
|
224 } |
|
225 } |
|
226 |
|
227 int util_szstrtouint(const char *str, uint64_t *value) { |
|
228 char *end; |
|
229 errno = 0; |
|
230 size_t len = strlen(str); |
|
231 uint64_t val = strtoull(str, &end, 0); |
|
232 if(end == str+len) { |
|
233 *value = val; |
|
234 return 1; |
|
235 } else if(end == str+len-1) { |
|
236 uint64_t mul = 1; |
|
237 switch(end[0]) { |
|
238 case 'k': |
|
239 case 'K': mul = 1024; break; |
|
240 case 'm': |
|
241 case 'M': mul = 1024*1024; break; |
|
242 case 'g': |
|
243 case 'G': mul = 1024*1024*1024; break; |
|
244 default: return 0; |
|
245 } |
|
246 |
|
247 uint64_t result = 0; |
|
248 if(util_uint_mul(val, mul, &result)) { |
|
249 return 0; |
|
250 } |
|
251 *value = result; |
|
252 return 1; |
|
253 } |
|
254 return 0; |
|
255 } |
|
256 |
|
257 int util_uint_mul(uint64_t a, uint64_t b, uint64_t *result) { |
|
258 if(a == 0 || b == 0) { |
|
259 *result = 0; |
|
260 return 0; |
|
261 } |
|
262 uint64_t r = a * b; |
|
263 if(r / b == a) { |
|
264 *result = r; |
|
265 return 0; |
|
266 } else { |
|
267 *result = 0; |
|
268 return 1; |
224 } |
269 } |
225 } |
270 } |
226 |
271 |
227 char* util_url_base(char *url) { |
272 char* util_url_base(char *url) { |
228 sstr_t u = sstr(url); |
273 sstr_t u = sstr(url); |