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;
}
示例#2
0
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;
}