int getfield(char *p, char **endp, int *flags) { int val, var; char *start, savech; for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); if (*p == '*') { /* `*' is current month */ *flags |= F_ISMONTH; *endp = p+1; return(tp->tm_mon + 1); } if (isdigit((unsigned char)*p)) { val = strtol(p, &p, 10); /* if 0, it's failure */ for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); *endp = p; return(val); } for (start = p; isalpha((unsigned char)*++p);); /* Sunday-1 */ if (*p == '+' || *p == '-') for(; isdigit((unsigned char)*++p);); savech = *p; *p = '\0'; /* Month */ if ((val = getmonth(start)) != 0) *flags |= F_ISMONTH; /* Day */ else if ((val = getday(start)) != 0) { *flags |= F_ISDAY; /* variable weekday */ if ((var = getdayvar(start)) != 0) { if (var <=5 && var >= -4) val += var * 10; #ifdef DEBUG printf("var: %d\n", var); #endif } } /* Easter */ else if ((val = geteaster(start, tp->tm_year + 1900)) != 0) *flags |= F_EASTER; /* Paskha */ else if ((val = getpaskha(start, tp->tm_year + 1900)) != 0) *flags |= F_EASTER; /* undefined rest */ else { *p = savech; return (0); } for (*p = savech; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); *endp = p; return(val); }
int getfield(char *p, char **endp, int *flags) { int val, var, i; char *start, savech; for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*' && *p != '\t'; ++p) ; if (*p == '*') { /* `*' is every month */ *flags |= F_ISMONTH; *endp = p+1; return (-1); /* means 'every month' */ } if (isdigit((unsigned char)*p)) { val = strtol(p, &p, 10); /* if 0, it's failure */ for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p) ; *endp = p; return (val); } for (start = p; isalpha((unsigned char)*++p);) ; /* Sunday-1 */ if (*p == '+' || *p == '-') for(; isdigit((unsigned char)*++p); ) ; savech = *p; *p = '\0'; /* Month */ if ((val = getmonth(start)) != 0) *flags |= F_ISMONTH; /* Day */ else if ((val = getday(start)) != 0) { *flags |= F_ISDAY; /* variable weekday */ if ((var = getdayvar(start)) != 0) { if (var <= 5 && var >= -4) val += var * 10; #ifdef DEBUG printf("var: %d\n", var); #endif } } /* Try specials (Easter, Paskha, ...) */ else { for (i = 0; i < NUMEV; i++) { if (strncasecmp(start, spev[i].name, spev[i].nlen) == 0) { start += spev[i].nlen; val = i + 1; i = NUMEV + 1; } else if (spev[i].uname != NULL && strncasecmp(start, spev[i].uname, spev[i].ulen) == 0) { start += spev[i].ulen; val = i + 1; i = NUMEV + 1; } } if (i > NUMEV) { const char *errstr; switch (*start) { case '-': case '+': var = strtonum(start + 1, 0, 365, &errstr); if (errstr) return (0); /* Someone is just being silly */ if (*start == '-') var = -var; val += (NUMEV + 1) * var; /* We add one to the matching event and multiply by * (NUMEV + 1) so as not to return 0 if there's a match. * val will overflow if there is an obscenely large * number of special events. */ break; } *flags |= F_SPECIAL; } if (!(*flags & F_SPECIAL)) { /* undefined rest */ *p = savech; return (0); } } for (*p = savech; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*' && *p != '\t'; ++p) ; *endp = p; return (val); }