X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fparsetime.c;h=0c2f3f92af771ea2fead9d3cca953e729c2c748c;hb=0dd9e81745110d811a021513843c05fead623b8d;hp=cea967caaed7653e19ffd0a522d04dcc3ac64a1e;hpb=5837606887a6d81e8b1f7588525cb1c8783fb62b;p=rrdtool.git diff --git a/src/parsetime.c b/src/parsetime.c index cea967c..0c2f3f9 100644 --- a/src/parsetime.c +++ b/src/parsetime.c @@ -32,6 +32,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* NOTE: nothing in here is thread-safe!!!! Not even the localtime + calls ... */ + /* * The BNF-like specification of the time syntax parsed is below: * @@ -450,10 +453,10 @@ token() /* - * expect() gets a token and complins if it's not the token we want + * expect2() gets a token and complins if it's not the token we want */ static char * -expect(int desired, char *complain_fmt, ...) +expect2(int desired, char *complain_fmt, ...) { va_list ap; va_start( ap, complain_fmt ); @@ -463,7 +466,7 @@ expect(int desired, char *complain_fmt, ...) va_end( ap ); return TIME_OK; -} /* expect */ +} /* expect2 */ /* @@ -481,7 +484,7 @@ plus_minus(struct time_value *ptv, int doop) if( doop >= 0 ) { op = doop; - try(expect(NUMBER,"There should be number after '%c'", op == PLUS ? '+' : '-')); + try(expect2(NUMBER,"There should be number after '%c'", op == PLUS ? '+' : '-')); prev_multiplier = -1; /* reset months-minutes guessing mechanics */ } /* if doop is < 0 then we repeat the previous op @@ -581,7 +584,7 @@ tod(struct time_value *ptv) return TIME_OK; } if (sc_tokid == COLON ) { - try(expect(NUMBER, + try(expect2(NUMBER, "Parsing HH:MM syntax, expecting MM as number, got none")); minute = atoi(sc_token); if (minute > 59) { @@ -678,7 +681,7 @@ day(struct time_value *ptv) /* do month mday [year] */ mon = (sc_tokid-JAN); - try(expect(NUMBER, + try(expect2(NUMBER, "the day of the month should follow month name")); mday = atol(sc_token); if (token() == NUMBER) { @@ -697,6 +700,7 @@ day(struct time_value *ptv) */ wday = (sc_tokid-SUN); ptv->tm.tm_mday += (wday - ptv->tm.tm_wday); + token(); break; /* mday = ptv->tm.tm_mday; @@ -733,11 +737,11 @@ day(struct time_value *ptv) if (mon <= 31 && (sc_tokid == SLASH || sc_tokid == DOT)) { int sep; sep = sc_tokid; - try(expect(NUMBER,"there should be %s number after '%c'", + try(expect2(NUMBER,"there should be %s number after '%c'", sep == DOT ? "month" : "day", sep == DOT ? '.' : '/')); mday = atol(sc_token); if (token() == sep) { - try(expect(NUMBER,"there should be year number after '%c'", + try(expect2(NUMBER,"there should be year number after '%c'", sep == DOT ? '.' : '/')); year = atol(sc_token); token(); @@ -835,7 +839,8 @@ parsetime(char *tspec, struct time_value *ptv) /* Only absolute time specifications below */ case NUMBER: try(tod(ptv)) - if (sc_tokid != NUMBER) break; + try(day(ptv)) + break; /* fix month parsing */ case JAN: case FEB: case MAR: case APR: case MAY: case JUN: case JUL: case AUG: case SEP: case OCT: case NOV: case DEC: