libamxp  1.4.0
Patterns C Implementation
amxp_cron_parser_priv.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include <amxc/amxc_macros.h>

Go to the source code of this file.

Data Structures

struct  _amxp_cron_hits
 

Typedefs

typedef int(* amxp_cron_set_hits_fn_t) (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)
 
typedef struct _amxp_cron_hits amxp_cron_hits_t
 

Functions

PRIVATE uint8_t cron_get_bit (const uint8_t *rbyte, int idx)
 
PRIVATE int amxp_cron_set_hits (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)
 
PRIVATE int amxp_cron_reset (amxp_cron_expr_t *cron_expr)
 
PRIVATE int amxp_cron_set_months (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)
 
PRIVATE int amxp_cron_set_days_of_week (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)
 
PRIVATE int amxp_cron_set_days_of_month (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)
 

Typedef Documentation

◆ amxp_cron_hits_t

◆ amxp_cron_set_hits_fn_t

typedef int(* amxp_cron_set_hits_fn_t) (amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)

Definition at line 68 of file amxp_cron_parser_priv.h.

Function Documentation

◆ amxp_cron_reset()

PRIVATE int amxp_cron_reset ( amxp_cron_expr_t cron_expr)

Definition at line 285 of file amxp_cron_parser.c.

285  {
286  int retval = -1;
287  when_null(cron_expr, exit);
288  memset(cron_expr, 0, sizeof(amxp_cron_expr_t));
289 
290 exit:
291  return retval;
292 }
Structure containing parsed cron expression.
Definition: amxp_cron.h:103

◆ amxp_cron_set_days_of_month()

PRIVATE int amxp_cron_set_days_of_month ( amxc_var_t *  value,
uint8_t *  target,
uint32_t  min,
uint32_t  max,
const char **  error 
)

Definition at line 404 of file amxp_cron_parser.c.

408  {
409  const char* field = GET_CHAR(value, NULL);
410 
411  if((strlen(field) == 1) && (field[0] == '?')) {
412  amxc_var_set(cstring_t, value, "*");
413  }
414 
415  return amxp_cron_set_hits(value, target, min, max, error);
416 }
int amxp_cron_set_hits(amxc_var_t *value, uint8_t *target, uint32_t min, uint32_t max, const char **error)

◆ amxp_cron_set_days_of_week()

PRIVATE int amxp_cron_set_days_of_week ( amxc_var_t *  value,
uint8_t *  target,
uint32_t  min,
uint32_t  max,
const char **  error 
)

Definition at line 370 of file amxp_cron_parser.c.

374  {
375  int rv = -1;
376  amxc_string_t str_value;
377  char* v = amxc_var_take(cstring_t, value);
378 
379  amxc_string_init(&str_value, 0);
380 
381  amxc_string_push_buffer(&str_value, v, strlen(v) + 1);
382  amxc_string_to_upper(&str_value);
383 
384  if((amxc_string_text_length(&str_value) == 1) && (str_value.buffer[0] == '?')) {
385  str_value.buffer[0] = '*';
386  }
387 
390  amxc_var_set(cstring_t, value, amxc_string_get(&str_value, 0));
391 
392  rv = amxp_cron_set_hits(value, target, min, max, error);
393 
394  if(cron_get_bit(target, 7)) {
395  // Sunday can be represented as 0 or 7
396  cron_set_bit(target, 0);
397  cron_del_bit(target, 7);
398  }
399 
400  amxc_string_clean(&str_value);
401  return rv;
402 }
#define CRON_DAYS_ARR_LEN
static const char *const DAYS_ARR[]
static void cron_del_bit(uint8_t *rbyte, int idx)
static void cron_set_bit(uint8_t *rbyte, int idx)
static void replace_ordinals(amxc_string_t *value, const char *const *arr, uint32_t arr_len)
uint8_t cron_get_bit(const uint8_t *rbyte, int idx)
static const char *const DAYS_ARR_FULL[]

◆ amxp_cron_set_hits()

PRIVATE int amxp_cron_set_hits ( amxc_var_t *  value,
uint8_t *  target,
uint32_t  min,
uint32_t  max,
const char **  error 
)

Definition at line 294 of file amxp_cron_parser.c.

298  {
299  amxc_var_t fields;
300  uint32_t delta = 1;
301  uint32_t* range = NULL;
302  char* field_expr = NULL;
303  int rv = -1;
304 
305  amxc_var_init(&fields);
306  amxc_var_set(csv_string_t, &fields, GET_CHAR(value, NULL));
307  amxc_var_cast(&fields, AMXC_VAR_ID_LIST);
308 
309  amxc_var_for_each(field, &fields) {
310  field_expr = amxc_var_take(cstring_t, field);
311  if(!has_char(field_expr, '/')) {
312  range = get_range(field_expr, min, max, error);
313  when_null(range, exit);
314  when_not_null_status(*error, exit, free(range));
315  } else {
316  range = get_range_increment(field_expr, min, max, &delta, error);
317  when_null(range, exit);
318  when_not_null_status(*error, exit, free(range));
319  if(delta == 0) {
320  *error = "Incrementer may not be zero";
321  free(range);
322  goto exit;
323  }
324  }
325 
326  for(size_t i = range[0]; i <= range[1]; i += delta) {
327  cron_set_bit(target, i);
328  }
329  free(range);
330  free(field_expr);
331  field_expr = NULL;
332  }
333 
334  rv = 0;
335 
336 exit:
337  free(field_expr);
338  amxc_var_clean(&fields);
339  return rv;
340 }
static uint32_t * get_range_increment(char *field, uint32_t min, uint32_t max, uint32_t *increment, const char **error)
static bool has_char(const char *str, char ch)
static uint32_t * get_range(char *field, uint32_t min, uint32_t max, const char **error)

◆ amxp_cron_set_months()

PRIVATE int amxp_cron_set_months ( amxc_var_t *  value,
uint8_t *  target,
uint32_t  min,
uint32_t  max,
const char **  error 
)

Definition at line 342 of file amxp_cron_parser.c.

346  {
347  int rv = -1;
348  amxc_string_t str_value;
349  char* v = amxc_var_take(cstring_t, value);
350  amxc_string_init(&str_value, 0);
351 
352  amxc_string_push_buffer(&str_value, v, strlen(v) + 1);
353  amxc_string_to_upper(&str_value);
355  amxc_var_set(cstring_t, value, amxc_string_get(&str_value, 0));
356  rv = amxp_cron_set_hits(value, target, min, max, error);
357 
358  /* ... and then rotate it to the front of the months */
359  for(uint32_t i = 1; i <= max; i++) {
360  if(cron_get_bit(target, i)) {
361  cron_set_bit(target, i - 1);
362  cron_del_bit(target, i);
363  }
364  }
365 
366  amxc_string_clean(&str_value);
367  return rv;
368 }
static const char *const MONTHS_ARR[]
#define CRON_MONTHS_ARR_LEN

◆ cron_get_bit()

PRIVATE uint8_t cron_get_bit ( const uint8_t *  rbyte,
int  idx 
)

Definition at line 274 of file amxp_cron_parser.c.

274  {
275  uint8_t j = (uint8_t) (idx / 8);
276  uint8_t k = (uint8_t) (idx % 8);
277 
278  if(rbyte[j] & (1 << k)) {
279  return 1;
280  } else {
281  return 0;
282  }
283 }