diff --git a/src/cron/c/expression.c b/src/cron/c/expression.c index 59d1bf0..4e1ca3c 100644 --- a/src/cron/c/expression.c +++ b/src/cron/c/expression.c @@ -102,7 +102,8 @@ void ce_next_from_now(cron_simple_time *out, cron_expression *ce) { gmtime_r(&t, &gm); cron_simple_time ref = { - .year = gm.tm_year, + // tm_year contains years since 1900 + .year = 1900 + gm.tm_year, // tm_mon goes from 0 to 11 .month = gm.tm_mon + 1, .day = gm.tm_mday, diff --git a/src/cron/c/parse.c b/src/cron/c/parse.c index f54b818..7a66200 100644 --- a/src/cron/c/parse.c +++ b/src/cron/c/parse.c @@ -40,18 +40,6 @@ const uint8_t max_parts = 4; * - a-b/c */ cron_parse_error ce_parse_range(uint64_t *out, char *s, uint8_t min, uint8_t max) { - // The * expression means "every possible value" - if (s[0] == '*') { - // A '*' is only valid on its own - if (s[1] != '\0') { - return cron_parse_invalid_expression; - } - - *out = ~0; - - return cron_parse_ok; - } - size_t slash_index = 0; size_t dash_index = 0; size_t i = 0; @@ -74,14 +62,17 @@ cron_parse_error ce_parse_range(uint64_t *out, char *s, uint8_t min, uint8_t max } // Parse the three possible numbers in the pattern - uint8_t start = 0; + uint8_t start = min; uint8_t end = max; uint8_t interval = 1; - SAFE_ATOI(start, s, min, max); + // * simply sets start as min and end as max + if (!(s[0] == '*' && strlen(s) == 1)) { + SAFE_ATOI(start, s, min, max); - if (dash_index > 0) { - SAFE_ATOI(end, &s[dash_index + 1], min, max); + if (dash_index > 0) { + SAFE_ATOI(end, &s[dash_index + 1], min, max); + } } if (slash_index > 0) { diff --git a/src/cron/expression_test.v b/src/cron/expression_test.v index 7d1516d..c016b72 100644 --- a/src/cron/expression_test.v +++ b/src/cron/expression_test.v @@ -34,3 +34,11 @@ fn test_next_simple() ! { //// Overlap to next year util_test_time('0 3', '2002-12-31 04:00:00', '2003-01-01 03:00:00')! } + +fn test_leading_star() { + mut x := false + + parse_expression('*5 8') or { x = true } + + assert x +}