diff options
author | Hristo Venev <hristo@venev.name> | 2015-11-16 10:15:05 +0200 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2017-05-17 15:22:13 +0200 |
commit | 0cbf72e06dc4f8f7711537f29fd9b889a58ddc6e (patch) | |
tree | 19b67c9216fcf07009e90e6c8ab9ae78e468598f /src/basic/parse-util.c | |
parent | 1e2a451e2c0fcfe05875cb4f7ebe0461f66b97e0 (diff) |
calendarspec: sub-second support, v3
Diffstat (limited to 'src/basic/parse-util.c')
-rw-r--r-- | src/basic/parse-util.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index e50355977..6e24bdee4 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -492,3 +492,39 @@ int safe_atod(const char *s, double *ret_d) { *ret_d = (double) d; return 0; } + +int parse_fractional_part_u(const char **p, size_t digits, unsigned *res) { + size_t i; + unsigned val = 0; + const char *s; + + s = *p; + + /* accept any number of digits, strtoull is limted to 19 */ + for(i=0; i < digits; i++,s++) { + if (*s < '0' || *s > '9') { + if (i == 0) + return -EINVAL; + + /* too few digits, pad with 0 */ + for (; i < digits; i++) + val *= 10; + + break; + } + + val *= 10; + val += *s - '0'; + } + + /* maybe round up */ + if (*s >= '5' && *s <= '9') + val++; + + s += strspn(s, DIGITS); + + *p = s; + *res = val; + + return 0; +} |