X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=snooze.c;h=8bbd93fb366b35437a7fa0aef6cf0610e725074b;hb=c95b0c00842219d98d43a5f859ecbb995e4d438e;hp=3811977decfc404ba31144ecacf5c9ccf0a167ed;hpb=2f222fde9ff914f7fb68976f6fbbf99e14a8208f;p=user%2Fhenk%2Fcode%2Fsnooze.git diff --git a/snooze.c b/snooze.c index 3811977..8bbd93f 100644 --- a/snooze.c +++ b/snooze.c @@ -99,7 +99,7 @@ parse(char *expr, char *buf, long bufsiz, int offset) while (*s) { switch (*s) { case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': + case '5': case '6': case '7': case '8': case '9': n = parse_int(&s, -offset, bufsiz); buf[n+offset] = '*'; break; @@ -120,7 +120,7 @@ parse(char *expr, char *buf, long bufsiz, int offset) for (i = n0; i < bufsiz; i += n) buf[i+offset] = '*'; break; - case ',': + case ',': s++; n = 0; break; @@ -140,8 +140,8 @@ parse(char *expr, char *buf, long bufsiz, int offset) } char weekday[8] = {0}; -char dayofmonth[31] = {0}; -char month[12] = {0}; +char dayofmonth[32] = {0}; +char month[13] = {0}; char dayofyear[367] = {0}; char weekofyear[54] = {0}; char hour[24] = {0}; @@ -168,11 +168,12 @@ find_next(time_t from) tm = localtime(&t); next_day: - while (!(weekday[tm->tm_wday] == '*' - && dayofmonth[tm->tm_mday-1] == '*' - && month[tm->tm_mon] == '*' - && weekofyear[isoweek(tm)-1] == '*' - && dayofyear[tm->tm_yday] == '*')) { + while (!( + weekday[tm->tm_wday] == '*' && + dayofmonth[tm->tm_mday-1] == '*' && + month[tm->tm_mon] == '*' && + weekofyear[isoweek(tm)-1] == '*' && + dayofyear[tm->tm_yday] == '*')) { if (month[tm->tm_mon] != '*') { // if month is not good, step month tm->tm_mon++; @@ -181,20 +182,24 @@ next_day: tm->tm_mday++; } + tm->tm_isdst = -1; tm->tm_sec = 0; tm->tm_min = 0; tm->tm_hour = 0; t = mktime(tm); + tm->tm_isdst = -1; + if (t > from+(366*24*60*60)) // no result within a year return -1; } int y = tm->tm_yday; // save yday - while (!(hour[tm->tm_hour] == '*' - && minute[tm->tm_min] == '*' - && second[tm->tm_sec] == '*')) { + while (!( + hour[tm->tm_hour] == '*' && + minute[tm->tm_min] == '*' && + second[tm->tm_sec] == '*')) { if (hour[tm->tm_hour] != '*') { tm->tm_hour++; tm->tm_min = 0; @@ -209,7 +214,7 @@ next_day: if (tm->tm_yday != y) // hit a different day, retry... goto next_day; } - + return t; } @@ -221,7 +226,8 @@ isotime(const struct tm *tm) return isobuf; } -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { int c; time_t t; @@ -238,8 +244,10 @@ int main(int argc, char *argv[]) minute[0] = '*'; second[0] = '*'; + setvbuf(stdout, 0, _IOLBF, 0); + while ((c = getopt(argc, argv, "+D:W:H:M:S:T:R:d:m:ns:t:vw:")) != -1) - switch(c) { + switch (c) { case 'D': parse(optarg, dayofyear, sizeof dayofyear, -1); break; case 'W': parse(optarg, weekofyear, sizeof weekofyear, -1); break; case 'H': parse(optarg, hour, sizeof hour, 0); break; @@ -249,7 +257,7 @@ int main(int argc, char *argv[]) case 'm': parse(optarg, month, sizeof month, -1); break; case 'w': parse(optarg, weekday, sizeof weekday, 0); // special case: sunday is both 0 and 7. - if (weekday[7] == '*') + if (weekday[7] == '*') weekday[0] = '*'; break; case 'n': nflag++; break; @@ -259,13 +267,13 @@ int main(int argc, char *argv[]) case 't': timefile = optarg; break; case 'R': randdelay = parse_dur(optarg); break; default: - fprintf(stderr, "Usage: %s [-nv] [-t timefile] [-T timewait] [-R randdelay] [-s slack]\n" + fprintf(stderr, "Usage: %s [-nv] [-t timefile] [-T timewait] [-R randdelay] [-s slack]\n" " [-d mday] [-m mon] [-w wday] [-D yday] [-W yweek] [-H hour] [-M min] [-S sec] COMMAND...\n" "Timespec: exact: 1,3,5\n" " range: 1-7\n" " every n-th: /10\n", argv[0]); - exit(2); - } + exit(2); + } time_t start = now + 1;