提交 b639aebd authored 作者: Mathieu Rene's avatar Mathieu Rene

fix dow to support multiple coma-separated conditions. BLUEBOX-133

上级 17ac6ba9
...@@ -711,7 +711,7 @@ SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst); ...@@ -711,7 +711,7 @@ SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst);
SWITCH_DECLARE(const char *) switch_dow_int2str(int val); SWITCH_DECLARE(const char *) switch_dow_int2str(int val);
SWITCH_DECLARE(int) switch_dow_str2int(const char *exp); SWITCH_DECLARE(int) switch_dow_str2int(const char *exp);
SWITCH_DECLARE(int) switch_dow_cmp(const char *exp, int val); SWITCH_DECLARE(switch_bool_t) switch_dow_cmp(const char *exp, int val);
SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val); SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val);
SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val); SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val);
......
...@@ -2467,7 +2467,6 @@ SWITCH_DECLARE(int) switch_isxdigit(int c) ...@@ -2467,7 +2467,6 @@ SWITCH_DECLARE(int) switch_isxdigit(int c)
{ {
return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char) c] & (_N | _X))); return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char) c] & (_N | _X)));
} }
static const char *DOW[] = { static const char *DOW[] = {
"sat", "sat",
"sun", "sun",
...@@ -2475,28 +2474,22 @@ static const char *DOW[] = { ...@@ -2475,28 +2474,22 @@ static const char *DOW[] = {
"tue", "tue",
"wed", "wed",
"thu", "thu",
"fri", "fri"
"sat",
"sun",
NULL
}; };
SWITCH_DECLARE(const char *) switch_dow_int2str(int val) { SWITCH_DECLARE(const char *) switch_dow_int2str(int val) {
if (val >= sizeof(DOW) / sizeof (const char*)) { if (val >= switch_arraylen(DOW)) {
return NULL; val = val % switch_arraylen(DOW);
} }
return DOW[val]; return DOW[val];
} }
SWITCH_DECLARE(int) switch_dow_str2int(const char *exp) { SWITCH_DECLARE(int) switch_dow_str2int(const char *exp) {
int ret = -1; int ret = -1;
int x = -1; int x;
for (x = 0;; x++) {
if (!DOW[x]) {
break;
}
if (!strcasecmp(DOW[x], exp)) { for (x = 0; x < switch_arraylen(DOW); x++) {
if (!strncasecmp(DOW[x], exp, 3)) {
ret = x; ret = x;
break; break;
} }
...@@ -2504,44 +2497,77 @@ SWITCH_DECLARE(int) switch_dow_str2int(const char *exp) { ...@@ -2504,44 +2497,77 @@ SWITCH_DECLARE(int) switch_dow_str2int(const char *exp) {
return ret; return ret;
} }
SWITCH_DECLARE(int) switch_dow_cmp(const char *exp, int val) typedef enum {
DOW_ERR = -2,
DOW_EOF = -1,
DOW_SAT = 0,
DOW_SUN,
DOW_MON,
DOW_TUE,
DOW_WED,
DOW_THU,
DOW_FRI,
DOW_HYPHEN = '-',
DOW_COMA = ','
} dow_t;
static inline dow_t _dow_read_token(const char **s)
{ {
char *dup = strdup(exp); int i;
char *p_start;
char *p_end;
int ret = 0;
int start, end;
switch_assert(dup); if (**s == '-') {
(*s)++;
return DOW_HYPHEN;
} else if (**s == ',') {
(*s)++;
return DOW_COMA;
} else if (**s >= '0' && **s <= '9') {
(*s)++;
return **s;
} else if ((i = switch_dow_str2int(*s)) && i != -1) {
(*s) += 3;
return i;
} else if (!**s) {
return DOW_EOF;
} else {
return DOW_ERR;
}
}
p_start = dup; SWITCH_DECLARE(switch_bool_t) switch_dow_cmp(const char *exp, int val)
{
dow_t cur, prev = DOW_EOF;
const char *p = exp;
if ((p_end=strchr(dup, '-'))) { while ((cur = _dow_read_token(&p)) != DOW_EOF) {
*p_end++ = '\0'; if (cur == DOW_COMA) {
/* Reset state */
cur = prev = DOW_EOF;
} else if (cur == DOW_HYPHEN) {
/* Save the current token and move to the next one */
prev = cur;
} else if (cur == DOW_ERR) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse error for [%s] at position %td (%.6s)\n", exp, p - exp, p);
break;
} else { } else {
p_end = p_start; /* Valid day found */
if (prev != DOW_EOF) { /* Evaluating a range */
if (prev < cur) {
if (val >= prev && val <= cur) {
return SWITCH_TRUE;
} }
if (strlen(p_start) == 3) {
start = switch_dow_str2int(p_start);
} else { } else {
start = atol(p_start); if (val >= cur && val <= prev) {
return SWITCH_TRUE;
} }
if (strlen(p_end) == 3) {
end = switch_dow_str2int(p_end);
} else {
end = atol(p_end);
} }
/* Following used for this example : mon-sat = 2-0, so we need to make 0(sat) + 7 */ } else if (val == cur) {
if (end < start) { return SWITCH_TRUE;
end += 7; }
} }
if (start != -1 && end != -1 && val >= start && val <= end) {
ret = 1;
} }
switch_safe_free(dup); return SWITCH_FALSE;
return ret;
} }
SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val) SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论