int parse_size_str(const char *in, size_t in_size, uint64_t *out) { int retval; char int_buf[sizeof("18446744073709551615")]; int chars_copied = copy_numeric(in, in_size, int_buf, sizeof(int_buf)); if (chars_copied == 0) { return ERROR_parse_size_str_NO_LEADING_NUMERIC_CHARS; } int base = 10; unsigned long long int size = strtoull(int_buf, NULL, base); char *suffix_in = (char*)in + chars_copied; size_t suffix_size = in_size - chars_copied; suffix_t suffix; retval = parse_suffix(suffix_in, suffix_size, &suffix); if (retval < 0) return retval; uint64_t multiplier = suffix_to_multiplier(&suffix); // thanks to http://stackoverflow.com/a/199363 bool would_overflow = (multiplier > (UINT64_MAX / size)); if (would_overflow) { return ERROR_parse_size_str_WOULD_OVERFLOW_UINT64; } *out = size * multiplier; return RETURN_SUCCESS; }
time_t parse_time( const char *str, time_t current ) { struct tm t; int count; char suffix[2]; int n; memset(&t,0,sizeof(t)); if(!strcmp(str,"now")) { return current; } n = sscanf(str, "%d%[yYdDhHmMsS]", &count, suffix); if(n==2) { return current - count*suffix_to_multiplier(suffix[0]); } n = sscanf(str, "%d-%d-%d %d:%d:%d", &t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); if(n==6) { if (t.tm_hour>23) t.tm_hour = 0; if (t.tm_min>23) t.tm_min = 0; if (t.tm_sec>23) t.tm_sec = 0; t.tm_year -= 1900; t.tm_mon -= 1; return mktime(&t); } n = sscanf(str, "%d-%d-%d", &t.tm_year,&t.tm_mon,&t.tm_mday); if(n==3) { t.tm_year -= 1900; t.tm_mon -= 1; return mktime(&t); } return 0; }