X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fparsetime.c;h=47ddbbfc7a3fe95bfccb54eb1e823e328b2958b6;hb=324419e406678c70dfdbd0a31478797cf29e06de;hp=fa2e9b5d8a4353ae6b906f18df53c1bac3742aff;hpb=d828f3eccac8dbad7bfc14812e406377669baaa4;p=rrdtool.git diff --git a/src/parsetime.c b/src/parsetime.c index fa2e9b5..47ddbbf 100644 --- a/src/parsetime.c +++ b/src/parsetime.c @@ -234,25 +234,24 @@ static struct SpecialToken TimeMultipliers[] = { */ static struct SpecialToken *Specials; -static char **scp; /* scanner - pointer at arglist */ +static const char **scp; /* scanner - pointer at arglist */ static char scc; /* scanner - count of remaining arguments */ -static char *sct; /* scanner - next char pointer in current argument */ +static const char *sct; /* scanner - next char pointer in current argument */ static int need; /* scanner - need to advance to next argument */ static char *sc_token=NULL; /* scanner - token buffer */ static size_t sc_len; /* scanner - length of token buffer */ static int sc_tokid; /* scanner - token id */ -static int need_to_free = 0; /* means that we need deallocating memory */ - /* Local functions */ +static void EnsureMemFree (void); -void EnsureMemFree () +static void EnsureMemFree (void) { - if( need_to_free ) + if( sc_token ) { free(sc_token); - need_to_free = 0; + sc_token = NULL; } } @@ -368,7 +367,7 @@ parse_token(char *arg) * init_scanner() sets up the scanner to eat arguments */ static char * -init_scanner(int argc, char **argv) +init_scanner(int argc, const char **argv) { scp = argv; scc = argc; @@ -380,7 +379,6 @@ init_scanner(int argc, char **argv) sc_token = (char *) malloc(sc_len*sizeof(char)); if( sc_token == NULL ) return "Failed to allocate memory"; - need_to_free = 1; return TIME_OK; } /* init_scanner */ @@ -561,7 +559,7 @@ tod(struct rrd_time_value *ptv) int tlen; /* save token status in case we must abort */ int scc_sv = scc; - char *sct_sv = sct; + const char *sct_sv = sct; int sc_tokid_sv = sc_tokid; tlen = strlen(sc_token); @@ -661,7 +659,8 @@ assign_date(struct rrd_time_value *ptv, long mday, long mon, long year) static char * day(struct rrd_time_value *ptv) { - long mday=0, wday, mon, year = ptv->tm.tm_year; + /* using time_t seems to help portability with 64bit oses */ + time_t mday=0, wday, mon, year = ptv->tm.tm_year; int tlen; switch (sc_tokid) { @@ -716,7 +715,7 @@ day(struct rrd_time_value *ptv) */ tlen = strlen(sc_token); mon = atol(sc_token); - if (mon > 10*356*24*60*60) { + if (mon > 10*365*24*60*60) { ptv->tm=*localtime(&mon); token(); break; @@ -785,7 +784,7 @@ day(struct rrd_time_value *ptv) * the pointer to the error message in the case of problems */ char * -parsetime(char *tspec, struct rrd_time_value *ptv) +parsetime(const char *tspec, struct rrd_time_value *ptv) { time_t now = time(NULL); int hr = 0; @@ -838,8 +837,23 @@ parsetime(char *tspec, struct rrd_time_value *ptv) /* Only absolute time specifications below */ case NUMBER: - try(tod(ptv)) - try(day(ptv)) + { + long hour_sv = ptv->tm.tm_hour; + long year_sv = ptv->tm.tm_year; + 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; + } + if ( ptv->tm.tm_hour == 30000 ){ + ptv->tm.tm_year = year_sv; + } + }; break; /* fix month parsing */ case JAN: case FEB: case MAR: case APR: case MAY: case JUN: