dot = memchr(p, '.', pc - p);
if (dot) {
- if (dot + 3 != pc)
- return -EINVAL;
- if (dot[1] < '0' || dot[1] > '9' || dot[2] < '0' || dot[2] > '9')
+ if (dot + 3 == pc) {
+ /* Support two places after the dot */
+
+ if (dot[1] < '0' || dot[1] > '9' || dot[2] < '0' || dot[2] > '9')
+ return -EINVAL;
+ q = (dot[1] - '0') * 10 + (dot[2] - '0');
+
+ } else if (dot + 2 == pc) {
+ /* Support one place after the dot */
+
+ if (dot[1] < '0' || dot[1] > '9')
+ return -EINVAL;
+ q = (dot[1] - '0') * 10;
+ } else
+ /* We do not support zero or more than two places */
return -EINVAL;
- q = (dot[1] - '0') * 10 + (dot[2] - '0');
+
n = strndupa(p, dot - p);
} else {
q = 0;
assert_se(parse_percent("") == -EINVAL);
assert_se(parse_percent("foo") == -EINVAL);
assert_se(parse_percent("0") == -EINVAL);
+ assert_se(parse_percent("0.1") == -EINVAL);
assert_se(parse_percent("50") == -EINVAL);
assert_se(parse_percent("100") == -EINVAL);
assert_se(parse_percent("-1") == -EINVAL);
assert_se(parse_permille("50") == -EINVAL);
assert_se(parse_permille("100") == -EINVAL);
assert_se(parse_permille("-1") == -EINVAL);
+ assert_se(parse_permille("0.1") == -EINVAL);
+ assert_se(parse_permille("5%") == 50);
+ assert_se(parse_permille("5.5%") == 55);
+ assert_se(parse_permille("5.12%") == -EINVAL);
assert_se(parse_permille("0‰") == 0);
assert_se(parse_permille("555‰") == 555);
assert_se(parse_permille("‰1") == -EINVAL);
assert_se(parse_permille("1‰‰") == -EINVAL);
assert_se(parse_permille("3.2‰") == -EINVAL);
+ assert_se(parse_permille("0.1‰") == -EINVAL);
assert_se(parse_permille("0%") == 0);
assert_se(parse_permille("55%") == 550);
assert_se(parse_permille("%1") == -EINVAL);
assert_se(parse_permille("1%%") == -EINVAL);
assert_se(parse_permille("3.21%") == -EINVAL);
+ assert_se(parse_permille("0.1%") == 1);
}
static void test_parse_permille_unbounded(void) {
assert_se(parse_permyriad("0%") == 0);
assert_se(parse_permyriad("55%") == 5500);
+ assert_se(parse_permyriad("55.5%") == 5550);
+ assert_se(parse_permyriad("55.50%") == 5550);
assert_se(parse_permyriad("55.53%") == 5553);
assert_se(parse_permyriad("100%") == 10000);
assert_se(parse_permyriad("-7%") == -ERANGE);