%{ #include #include "time.h" extern struct datespec *dsp; static struct tm *tm; static time_t time1; #define PUTRANGE() printf("range: from %u to %u\n", dsp->lower, dsp->upper) #define SETTIME(x) do { \ if ((tm = malloc(sizeof(struct tm))) == 0) \ errx(1, "exhausted memory."); \ x = time(NULL); \ tm = localtime(&x); \ } while (0) %} %token EQ LT GT LE GE GL DATE TIME %union { char *string; } %token TIMESPEC DATESPEC %% ENTRY : timecmp { ; } | datecmp { ; } | combocmp { ; } ; timecmp : TIME EQ TIMESPEC { SETTIME(time1); strptime($3, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1; dsp->lower = time1; } | TIME GT TIMESPEC { SETTIME(time1); time1 = time(NULL); tm = localtime(&time1); strptime($3, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1 + 1; } | TIME LT TIMESPEC { SETTIME(time1); time1 = time(NULL); tm = localtime(&time1); strptime($3, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1 - 1; dsp->lower = 0; } | TIME GE TIMESPEC { SETTIME(time1); strptime($3, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1; } | TIME LE TIMESPEC { SETTIME(time1); strptime($3, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1; dsp->lower = 0; } | TIME TIMESPEC GL TIMESPEC { if ((tm = malloc(sizeof(struct tm))) == 0) errx(1, "exhausted memory."); time1 = time(NULL); tm = localtime(&time1); strptime($2, "%H:%M:%S", tm); time1 = mktime(tm); dsp->lower = time1; time1 = time(NULL); strptime($4, "%H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1; } ; datecmp : DATE EQ DATESPEC { SETTIME(time1); memset(tm, 0, sizeof(*tm)); strptime($3, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->lower = time1; dsp->upper = time1 + (86400 - 1); } | DATE GT DATESPEC { SETTIME(time1); memset(tm, 0, sizeof(*tm)); strptime($3, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1 + 86400; } | DATE LT DATESPEC { SETTIME(time1); memset(tm, 0, sizeof(*tm)); strptime($3, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->upper = time1 - 1; dsp->lower = 0; } | DATE GE DATESPEC { SETTIME(time1); memset(tm, 0, sizeof(*tm)); strptime($3, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1; } | DATE LE DATESPEC { SETTIME(time1); memset(tm, 0, sizeof(*tm)); strptime($3, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->upper = time1 + (86400 - 1); dsp->lower = 0; } | DATE DATESPEC GL DATESPEC { if ((tm = malloc(sizeof(struct tm))) == 0) errx(1, "exhausted memory"); memset(tm, 0, sizeof(*tm)); strptime($2, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->lower = time1 + 86400; memset(tm, 0, sizeof(*tm)); strptime($4, "%Y-%m-%d", tm); time1 = mktime(tm); dsp->upper = time1 - 1; } ; combocmp : DATE TIME EQ DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $4, $5); SETTIME(time1); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = dsp->lower = time1; } | DATE TIME GT DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $4, $5); SETTIME(time1); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1 + 1; } | DATE TIME LT DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $4, $5); SETTIME(time1); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1 - 1; dsp->lower = 0; } | DATE TIME GE DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $4, $5); SETTIME(time1); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = UINT_MAX; dsp->lower = time1; } | DATE TIME LE DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $4, $5); SETTIME(time1); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1; dsp->lower = 0; } | DATE TIME DATESPEC TIMESPEC GL DATESPEC TIMESPEC { char tmbuf[20]; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $3, $4); if ((tm = malloc(sizeof(struct tm))) == 0) errx(1, "exhausted memory."); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->lower = time1 + 1; snprintf(tmbuf, sizeof(tmbuf), "%s %s", $6, $7); strptime(tmbuf, "%Y-%m-%d %H:%M:%S", tm); time1 = mktime(tm); dsp->upper = time1 - 1; } ; %%