char *name; /* token name */
int value; /* token id */
};
-static struct SpecialToken VariousWords[] = {
+static const struct SpecialToken VariousWords[] = {
{"midnight", MIDNIGHT}, /* 00:00:00 of today or tomorrow */
{"noon", NOON}, /* 12:00:00 of today or tomorrow */
{"teatime", TEATIME}, /* 16:00:00 of today or tomorrow */
{NULL, 0} /*** SENTINEL ***/
};
-static struct SpecialToken TimeMultipliers[] = {
+static const struct SpecialToken TimeMultipliers[] = {
{"second", SECONDS}, /* seconds multiplier */
{"seconds", SECONDS}, /* (pluralized) */
{"sec", SECONDS}, /* (generic) */
* required for us to be able distinguish between 'mon' as 'month'
* and 'mon' as 'monday'
*/
-static struct SpecialToken *Specials;
+static const struct SpecialToken *Specials;
static const char **scp; /* scanner - pointer at arglist */
static char scc; /* scanner - count of remaining arguments */
greater than zero if S1 is lexicographically less than,
equal to or greater than S2. -- copied from GNU libc*/
static int mystrcasecmp(
- s1,
- s2)
- const char *s1;
- const char *s2;
+ const char *s1,
+ const char *s2)
{
const unsigned char *p1 = (const unsigned char *) s1;
const unsigned char *p2 = (const unsigned char *) s2;
* token() fetches a token from the input stream
*/
static int token(
- )
+ void)
{
int idx;
prev_multiplier = sc_tokid;
switch (sc_tokid) {
case YEARS:
- ptv->tm.tm_year += (op == PLUS) ? delta : -delta;
+ ptv->tm. tm_year += (
+ op == PLUS) ? delta : -delta;
+
return TIME_OK;
case MONTHS:
- ptv->tm.tm_mon += (op == PLUS) ? delta : -delta;
+ ptv->tm. tm_mon += (
+ op == PLUS) ? delta : -delta;
+
return TIME_OK;
case WEEKS:
delta *= 7;
/* FALLTHRU */
case DAYS:
- ptv->tm.tm_mday += (op == PLUS) ? delta : -delta;
+ ptv->tm. tm_mday += (
+ op == PLUS) ? delta : -delta;
+
return TIME_OK;
case HOURS:
ptv->offset += (op == PLUS) ? delta * 60 * 60 : -delta * 60 * 60;
sprintf(sc_token, "%d", hour);
return TIME_OK;
}
- ptv->tm.tm_hour = hour;
- ptv->tm.tm_min = minute;
- ptv->tm.tm_sec = 0;
+ ptv->tm. tm_hour = hour;
+ ptv->tm. tm_min = minute;
+ ptv->tm. tm_sec = 0;
+
if (ptv->tm.tm_hour == 24) {
- ptv->tm.tm_hour = 0;
- ptv->tm.tm_mday++;
+ ptv->tm. tm_hour = 0;
+ ptv->tm. tm_mday++;
}
return TIME_OK;
} /* tod */
panic(e("won't handle dates before epoch (01/01/1970), sorry"));
}
- ptv->tm.tm_mday = mday;
- ptv->tm.tm_mon = mon;
- ptv->tm.tm_year = year;
+ ptv->tm. tm_mday = mday;
+ ptv->tm. tm_mon = mon;
+ ptv->tm. tm_year = year;
+
return TIME_OK;
} /* assign_date */
switch (sc_tokid) {
case YESTERDAY:
- ptv->tm.tm_mday--;
+ ptv->tm. tm_mday--;
+
/* FALLTRHU */
case TODAY: /* force ourselves to stay in today - no further processing */
token();
break;
case TOMORROW:
- ptv->tm.tm_mday++;
+ ptv->tm. tm_mday++;
+
token();
break;
token();
} else
year = ptv->tm.tm_year;
+
try(assign_date(ptv, mday, mon, year));
break;
/* do a particular day of the week
*/
wday = (sc_tokid - SUN);
- ptv->tm.tm_mday += (wday - ptv->tm.tm_wday);
+ ptv->tm. tm_mday += (
+ wday - ptv->tm.tm_wday);
+
token();
break;
/*
mon = atol(sc_token);
if (mon > 10 * 365 * 24 * 60 * 60) {
ptv->tm = *localtime(&mon);
+
token();
break;
}
ptv->type = ABSOLUTE_TIME;
ptv->offset = 0;
ptv->tm = *localtime(&now);
- ptv->tm.tm_isdst = -1; /* mk time can figure this out for us ... */
+ ptv->tm. tm_isdst = -1; /* mk time can figure dst by default ... */
token();
switch (sc_tokid) {
case END:
ptv->type = RELATIVE_TO_END_TIME;
KeepItRelative:
- ptv->tm.tm_sec = 0;
- ptv->tm.tm_min = 0;
- ptv->tm.tm_hour = 0;
- ptv->tm.tm_mday = 0;
- ptv->tm.tm_mon = 0;
- ptv->tm.tm_year = 0;
+ ptv->tm. tm_sec = 0;
+ ptv->tm. tm_min = 0;
+ ptv->tm. tm_hour = 0;
+ ptv->tm. tm_mday = 0;
+ ptv->tm. tm_mon = 0;
+ ptv->tm. tm_year = 0;
+
/* FALLTHRU */
case NOW:
{
long hour_sv = ptv->tm.tm_hour;
long year_sv = ptv->tm.tm_year;
- ptv->tm.tm_hour = 30;
- ptv->tm.tm_year = 30000;
+ ptv->tm. tm_hour = 30;
+ ptv->tm. tm_year = 30000;
+
try(tod(ptv))
try(day(ptv))
if (ptv->tm.tm_hour == 30 && ptv->tm.tm_year != 30000) {
try(tod(ptv))
}
if (ptv->tm.tm_hour == 30) {
- ptv->tm.tm_hour = hour_sv;
+ ptv->tm. tm_hour = hour_sv;
}
if (ptv->tm.tm_year == 30000) {
- ptv->tm.tm_year = year_sv;
+ ptv->tm. tm_year = year_sv;
}
};
break;
ptv->tm.tm_mday++;
ptv->tm.tm_wday++;
} *//* shifting does not makes sense here ... noon is noon */
- ptv->tm.tm_hour = hr;
- ptv->tm.tm_min = 0;
- ptv->tm.tm_sec = 0;
+ ptv->tm. tm_hour = hr;
+ ptv->tm. tm_min = 0;
+ ptv->tm. tm_sec = 0;
+
token();
try(day(ptv));
break;
panic(e("unparsable trailing text: '...%s%s'", sc_token, sct));
}
- ptv->tm.tm_isdst = -1; /* for mktime to guess DST status */
if (ptv->type == ABSOLUTE_TIME)
if (mktime(&ptv->tm) == -1) { /* normalize & check */
/* can happen for "nonexistent" times, e.g. around 3am */
tmtmp.tm_mday += start_tv->tm.tm_mday;
tmtmp.tm_mon += start_tv->tm.tm_mon;
tmtmp.tm_year += start_tv->tm.tm_year;
+
*start = mktime(&tmtmp) + start_tv->offset;
} else {
*start = mktime(&(start_tv->tm)) + start_tv->offset;
tmtmp.tm_mday += end_tv->tm.tm_mday;
tmtmp.tm_mon += end_tv->tm.tm_mon;
tmtmp.tm_year += end_tv->tm.tm_year;
+
*end = mktime(&tmtmp) + end_tv->offset;
} else {
*end = mktime(&(end_tv->tm)) + end_tv->offset;