Navigation Menu

Skip to content

Commit

Permalink
Add grn_atoull()
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Apr 17, 2015
1 parent a07f74f commit 10bdc8a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/grn_str.h
Expand Up @@ -54,6 +54,7 @@ GRN_API int grn_atoi(const char *nptr, const char *end, const char **rest);
GRN_API unsigned int grn_atoui(const char *nptr, const char *end, const char **rest);
unsigned int grn_htoui(const char *nptr, const char *end, const char **rest);
GRN_API int64_t grn_atoll(const char *nptr, const char *end, const char **rest);
GRN_API uint64_t grn_atoull(const char *nptr, const char *end, const char **rest);
grn_rc grn_itoa(int i, char *p, char *end, char **rest);
grn_rc grn_lltoa(int64_t i, char *p, char *end, char **rest);
grn_rc grn_ulltoa(uint64_t i, char *p, char *end, char **rest);
Expand Down
14 changes: 14 additions & 0 deletions lib/str.c
Expand Up @@ -1500,6 +1500,20 @@ grn_atoll(const char *nptr, const char *end, const char **rest)
return n ? -v : v;
}

uint64_t
grn_atoull(const char *nptr, const char *end, const char **rest)
{
uint64_t v = 0, t;
while (nptr < end && *nptr >= '0' && *nptr <= '9') {
t = v * 10 + (*nptr - '0');
if (t < v) { v = 0; break; }
v = t;
nptr++;
}
if (rest) { *rest = nptr; }
return v;
}

unsigned int
grn_htoui(const char *nptr, const char *end, const char **rest)
{
Expand Down
38 changes: 38 additions & 0 deletions test/unit/util/test-string.c
Expand Up @@ -52,6 +52,8 @@ void data_str_len(void);
void test_str_len(gconstpointer data);
void data_aton(void);
void test_aton(gconstpointer data);
void data_atoull(void);
void test_atoull(gconstpointer data);
void data_itoh(void);
void test_itoh(gconstpointer data);

Expand Down Expand Up @@ -1002,6 +1004,42 @@ test_aton(gconstpointer data)
}
}

void
data_atoull(void)
{
#define ADD_DATUM(label, expected, input) \
gcut_add_datum(label " - " #expected, \
"expected", G_TYPE_UINT64, expected, \
"input", G_TYPE_STRING, input, \
NULL)

ADD_DATUM("uint32 max",
G_GUINT64_CONSTANT(4294967295),
"4294967295");
ADD_DATUM("int64 max",
G_GUINT64_CONSTANT(344494643000000),
"344494643000000");
ADD_DATUM("uint64 max",
G_GUINT64_CONSTANT(18446744073709551615),
"18446744073709551615");

#undef ADD_DATUM
}

void
test_atoull(gconstpointer data)
{
const gchar *input, *input_end, *rest;
uint64_t value;

input = gcut_data_get_string(data, "input");
input_end = strchr(input, '\0');
value = grn_atoull(input, input_end, &rest);
cut_assert_equal_string(input_end, rest);
gcut_assert_equal_uint64(gcut_data_get_uint64(data, "expected"),
value);
}

void
data_itoh(void)
{
Expand Down

0 comments on commit 10bdc8a

Please sign in to comment.