static void test_skip_leading_chars(void) { char input1[] = " \n \r k \n \r ", input2[] = "kkkkthiskkkiskkkaktestkkk", input3[] = "abcdef"; assert_se(streq(skip_leading_chars(input1, WHITESPACE), "k \n \r ")); assert_se(streq(skip_leading_chars(input2, "k"), "thiskkkiskkkaktestkkk")); assert_se(streq(skip_leading_chars(input2, "tk"), "hiskkkiskkkaktestkkk")); assert_se(streq(skip_leading_chars(input3, WHITESPACE), "abcdef")); assert_se(streq(skip_leading_chars(input3, "bcaef"), "def")); }
static int condition_test_kernel_version(Condition *c) { enum { /* Listed in order of checking. Note that some comparators are prefixes of others, hence the longest * should be listed first. */ LOWER_OR_EQUAL, GREATER_OR_EQUAL, LOWER, GREATER, EQUAL, _ORDER_MAX, }; static const char *const prefix[_ORDER_MAX] = { [LOWER_OR_EQUAL] = "<=", [GREATER_OR_EQUAL] = ">=", [LOWER] = "<", [GREATER] = ">", [EQUAL] = "=", }; const char *p = NULL; struct utsname u; size_t i; int k; assert(c); assert(c->parameter); assert(c->type == CONDITION_KERNEL_VERSION); assert_se(uname(&u) >= 0); for (i = 0; i < _ORDER_MAX; i++) { p = startswith(c->parameter, prefix[i]); if (p) break; } /* No prefix? Then treat as glob string */ if (!p) return fnmatch(skip_leading_chars(c->parameter, NULL), u.release, 0) == 0; k = str_verscmp(u.release, skip_leading_chars(p, NULL)); switch (i) { case LOWER: return k < 0; case LOWER_OR_EQUAL: return k <= 0; case EQUAL: return k == 0; case GREATER_OR_EQUAL: return k >= 0; case GREATER: return k > 0; default: assert_not_reached("Can't compare"); } }