forked from vieter-v/vieter
Compare commits
2 Commits
da5a77e489
...
a135068b31
| Author | SHA1 | Date |
|---|---|---|
|
|
a135068b31 | |
|
|
2f4acf59e3 |
|
|
@ -102,7 +102,8 @@ void ce_next_from_now(cron_simple_time *out, cron_expression *ce) {
|
||||||
gmtime_r(&t, &gm);
|
gmtime_r(&t, &gm);
|
||||||
|
|
||||||
cron_simple_time ref = {
|
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
|
// tm_mon goes from 0 to 11
|
||||||
.month = gm.tm_mon + 1,
|
.month = gm.tm_mon + 1,
|
||||||
.day = gm.tm_mday,
|
.day = gm.tm_mday,
|
||||||
|
|
|
||||||
|
|
@ -40,18 +40,6 @@ const uint8_t max_parts = 4;
|
||||||
* - a-b/c
|
* - a-b/c
|
||||||
*/
|
*/
|
||||||
cron_parse_error ce_parse_range(uint64_t *out, char *s, uint8_t min, uint8_t max) {
|
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 slash_index = 0;
|
||||||
size_t dash_index = 0;
|
size_t dash_index = 0;
|
||||||
size_t i = 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
|
// Parse the three possible numbers in the pattern
|
||||||
uint8_t start = 0;
|
uint8_t start = min;
|
||||||
uint8_t end = max;
|
uint8_t end = max;
|
||||||
uint8_t interval = 1;
|
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) {
|
if (dash_index > 0) {
|
||||||
SAFE_ATOI(end, &s[dash_index + 1], min, max);
|
SAFE_ATOI(end, &s[dash_index + 1], min, max);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slash_index > 0) {
|
if (slash_index > 0) {
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ enum ParseError as u8 {
|
||||||
too_many_parts = 4
|
too_many_parts = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// str returns the string representation of a ParseError.
|
||||||
fn (e ParseError) str() string {
|
fn (e ParseError) str() string {
|
||||||
return match e {
|
return match e {
|
||||||
.ok { '' }
|
.ok { '' }
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,13 @@ module cron
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
// free the memory associated with the Expression.
|
||||||
[unsafe]
|
[unsafe]
|
||||||
pub fn (ce &Expression) free() {
|
pub fn (ce &Expression) free() {
|
||||||
C.ce_free(ce)
|
C.ce_free(ce)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse_expression parses a string into an Expression.
|
||||||
pub fn parse_expression(exp string) !&Expression {
|
pub fn parse_expression(exp string) !&Expression {
|
||||||
out := C.ce_init()
|
out := C.ce_init()
|
||||||
res := C.ce_parse_expression(out, exp.str)
|
res := C.ce_parse_expression(out, exp.str)
|
||||||
|
|
@ -18,6 +20,8 @@ pub fn parse_expression(exp string) !&Expression {
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// next calculates the next occurence of the cron schedule, given a reference
|
||||||
|
// point.
|
||||||
pub fn (ce &Expression) next(ref time.Time) time.Time {
|
pub fn (ce &Expression) next(ref time.Time) time.Time {
|
||||||
st := SimpleTime{
|
st := SimpleTime{
|
||||||
year: ref.year
|
year: ref.year
|
||||||
|
|
@ -39,6 +43,8 @@ pub fn (ce &Expression) next(ref time.Time) time.Time {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// next_from_now calculates the next occurence of the cron schedule with the
|
||||||
|
// current time as reference.
|
||||||
pub fn (ce &Expression) next_from_now() time.Time {
|
pub fn (ce &Expression) next_from_now() time.Time {
|
||||||
out := SimpleTime{}
|
out := SimpleTime{}
|
||||||
C.ce_next_from_now(&out, ce)
|
C.ce_next_from_now(&out, ce)
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,11 @@ fn test_next_simple() ! {
|
||||||
//// Overlap to next year
|
//// Overlap to next year
|
||||||
util_test_time('0 3', '2002-12-31 04:00:00', '2003-01-01 03:00:00')!
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue