mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 23:08:40 +02:00
Accept either 12:34 or '12:34' as a time constant.
This commit is contained in:
37
src/expr.c
37
src/expr.c
@@ -1904,21 +1904,25 @@ static int set_constant_value(expr_node *atom)
|
|||||||
return OK;
|
return OK;
|
||||||
} else if (*s == '\'') { /* It's a literal date */
|
} else if (*s == '\'') { /* It's a literal date */
|
||||||
s++;
|
s++;
|
||||||
if ((r=ParseLiteralDate(&s, &dse, &tim)) != 0) {
|
if ((r=ParseLiteralDateOrTime(&s, &dse, &tim)) != 0) {
|
||||||
if (*s == ':' || *s == '.' || *s == TimeSep) {
|
Eprint("%s: %s", ErrMsg[r], DBufValue(&ExprBuf));
|
||||||
Eprint("%s: %s:\n\t(If you meant a TIME constant, leave out the single quotes.)", ErrMsg[r], DBufValue(&ExprBuf));
|
|
||||||
} else {
|
|
||||||
Eprint("%s: %s", ErrMsg[r], DBufValue(&ExprBuf));
|
|
||||||
}
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
if (*s != '\'') {
|
if (*s != '\'') {
|
||||||
Eprint("%s: %s", ErrMsg[E_BAD_DATE], DBufValue(&ExprBuf));
|
if (dse != NO_DATE) {
|
||||||
return E_BAD_DATE;
|
Eprint("%s: %s", ErrMsg[E_BAD_DATE], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_DATE;
|
||||||
|
} else {
|
||||||
|
Eprint("%s: %s", ErrMsg[E_BAD_TIME], DBufValue(&ExprBuf));
|
||||||
|
return E_BAD_TIME;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (tim == NO_TIME) {
|
if (tim == NO_TIME) {
|
||||||
atom->u.value.type = DATE_TYPE;
|
atom->u.value.type = DATE_TYPE;
|
||||||
atom->u.value.v.val = dse;
|
atom->u.value.v.val = dse;
|
||||||
|
} else if (dse == NO_DATE) {
|
||||||
|
atom->u.value.type = TIME_TYPE;
|
||||||
|
atom->u.value.v.val = tim;
|
||||||
} else {
|
} else {
|
||||||
atom->u.value.type = DATETIME_TYPE;
|
atom->u.value.type = DATETIME_TYPE;
|
||||||
atom->u.value.v.val = (dse * MINUTES_PER_DAY) + tim;
|
atom->u.value.v.val = (dse * MINUTES_PER_DAY) + tim;
|
||||||
@@ -2868,25 +2872,32 @@ int ParseLiteralTime(char const **s, int *tim)
|
|||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* ParseLiteralDate */
|
/* ParseLiteralDateOrTime */
|
||||||
/* */
|
/* */
|
||||||
/* Parse a literal date or datetime. Return result in dse */
|
/* Parse a literal date or datetime. Return result in dse */
|
||||||
/* and tim; update s. */
|
/* and tim; update s. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
int ParseLiteralDate(char const **s, int *dse, int *tim)
|
int ParseLiteralDateOrTime(char const **s, int *dse, int *tim)
|
||||||
{
|
{
|
||||||
int y, m, d;
|
int y, m, d;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
char const *orig_s = *s;
|
||||||
|
|
||||||
y=0; m=0; d=0;
|
y=0; m=0; d=0;
|
||||||
|
|
||||||
*tim = NO_TIME;
|
*tim = NO_TIME;
|
||||||
|
*dse = NO_DATE;
|
||||||
if (!isdigit(**s)) return E_BAD_DATE;
|
if (!isdigit(**s)) return E_BAD_DATE;
|
||||||
while (isdigit(**s)) {
|
while (isdigit(**s)) {
|
||||||
y *= 10;
|
y *= 10;
|
||||||
y += *(*s)++ - '0';
|
y += *(*s)++ - '0';
|
||||||
}
|
}
|
||||||
|
if (**s == ':' || **s == '.' || **s == TimeSep) {
|
||||||
|
*s = orig_s;
|
||||||
|
return ParseLiteralTime(s, tim);
|
||||||
|
}
|
||||||
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
|
if (**s != '/' && **s != '-' && **s != DateSep) return E_BAD_DATE;
|
||||||
(*s)++;
|
(*s)++;
|
||||||
if (!isdigit(**s)) return E_BAD_DATE;
|
if (!isdigit(**s)) return E_BAD_DATE;
|
||||||
@@ -2942,7 +2953,8 @@ int DoCoerce(char type, Value *v)
|
|||||||
return OK;
|
return OK;
|
||||||
case STR_TYPE:
|
case STR_TYPE:
|
||||||
s = v->v.str;
|
s = v->v.str;
|
||||||
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
|
if (ParseLiteralDateOrTime(&s, &i, &m)) return E_CANT_COERCE;
|
||||||
|
if (i == NO_DATE) return E_CANT_COERCE;
|
||||||
if (*s) return E_CANT_COERCE;
|
if (*s) return E_CANT_COERCE;
|
||||||
v->type = DATETIME_TYPE;
|
v->type = DATETIME_TYPE;
|
||||||
free(v->v.str);
|
free(v->v.str);
|
||||||
@@ -3024,7 +3036,8 @@ int DoCoerce(char type, Value *v)
|
|||||||
|
|
||||||
case STR_TYPE:
|
case STR_TYPE:
|
||||||
s = v->v.str;
|
s = v->v.str;
|
||||||
if (ParseLiteralDate(&s, &i, &m)) return E_CANT_COERCE;
|
if (ParseLiteralDateOrTime(&s, &i, &m)) return E_CANT_COERCE;
|
||||||
|
if (i == NO_DATE) return E_CANT_COERCE;
|
||||||
if (*s) return E_CANT_COERCE;
|
if (*s) return E_CANT_COERCE;
|
||||||
v->type = DATE_TYPE;
|
v->type = DATE_TYPE;
|
||||||
free(v->v.str);
|
free(v->v.str);
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ int TriggerReminder (ParsePtr p, Trigger *t, TimeTrig *tim, int dse, int is_queu
|
|||||||
int ShouldTriggerReminder (Trigger *t, TimeTrig *tim, int dse, int *err);
|
int ShouldTriggerReminder (Trigger *t, TimeTrig *tim, int dse, int *err);
|
||||||
int DoSubst (ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse, int mode);
|
int DoSubst (ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int dse, int mode);
|
||||||
int DoSubstFromString (char const *source, DynamicBuffer *dbuf, int dse, int tim);
|
int DoSubstFromString (char const *source, DynamicBuffer *dbuf, int dse, int tim);
|
||||||
int ParseLiteralDate (char const **s, int *dse, int *tim);
|
int ParseLiteralDateOrTime (char const **s, int *dse, int *tim);
|
||||||
int ParseLiteralTime (char const **s, int *tim);
|
int ParseLiteralTime (char const **s, int *tim);
|
||||||
expr_node *parse_expression(char const **e, int *r, Var *locals);
|
expr_node *parse_expression(char const **e, int *r, Var *locals);
|
||||||
|
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
if (*s == '-' || *s == '/') {
|
if (*s == '-' || *s == '/') {
|
||||||
char const *p = s_orig;
|
char const *p = s_orig;
|
||||||
int dse, tim;
|
int dse, tim;
|
||||||
r = ParseLiteralDate(&p, &dse, &tim);
|
r = ParseLiteralDateOrTime(&p, &dse, &tim);
|
||||||
if (r == OK) {
|
if (r == OK) {
|
||||||
if (*p) {
|
if (*p) {
|
||||||
if (tim == NO_TIME) {
|
if (tim == NO_TIME) {
|
||||||
@@ -273,6 +273,11 @@ void FindNumericToken(char const *s, Token *t)
|
|||||||
t->val = dse;
|
t->val = dse;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (dse == NO_DATE) {
|
||||||
|
t->type = T_Time;
|
||||||
|
t->val = tim;
|
||||||
|
return;
|
||||||
|
}
|
||||||
t->type = T_DateTime;
|
t->type = T_DateTime;
|
||||||
t->val = MINUTES_PER_DAY * dse + tim;
|
t->val = MINUTES_PER_DAY * dse + tim;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user