libidav/utils.c

changeset 534
9a4857d6444e
parent 512
3320a015a3bc
child 535
d814ee31c04f
equal deleted inserted replaced
533:5b9f20aa88c2 534:9a4857d6444e
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);

mercurial