summaryrefslogtreecommitdiff
path: root/src/basic/parse-util.c
diff options
context:
space:
mode:
authorHristo Venev <hristo@venev.name>2015-11-16 10:15:05 +0200
committerSven Eden <yamakuzure@gmx.net>2017-05-17 15:22:13 +0200
commit0cbf72e06dc4f8f7711537f29fd9b889a58ddc6e (patch)
tree19b67c9216fcf07009e90e6c8ab9ae78e468598f /src/basic/parse-util.c
parent1e2a451e2c0fcfe05875cb4f7ebe0461f66b97e0 (diff)
calendarspec: sub-second support, v3
Diffstat (limited to 'src/basic/parse-util.c')
-rw-r--r--src/basic/parse-util.c36
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;
+}