📄 cpl_time.c
字号:
case '3': case '4': case '5': case '6': case '7': case '8': case '9': _t = _t*10 + *_p - '0'; break; case 'w': case 'W': if(!_fl) return 0; _ft += _t*7*24*3600; _t = 0; break; case 'd': case 'D': if(!_fl) return 0; _ft += _t*24*3600; _t = 0; break; case 'h': case 'H': if(_fl) return 0; _ft += _t*3600; _t = 0; break; case 'm': case 'M': if(_fl) return 0; _ft += _t*60; _t = 0; break; case 's': case 'S': if(_fl) return 0; _ft += _t; _t = 0; break; case 't': case 'T': if(!_fl) return 0; _fl = 0; break; default: return 0; } _p++; } return _ft;}tr_byxxx_p ic_parse_byday(char *_in){ tr_byxxx_p _bxp = NULL; int _nr, _s, _v; char *_p; if(!_in) return NULL; _bxp = tr_byxxx_new(); if(!_bxp) return NULL; _p = _in; _nr = 1; while(*_p) { if(*_p == ',') _nr++; _p++; } if(tr_byxxx_init(_bxp, _nr) < 0) { tr_byxxx_free(_bxp); return NULL; } _p = _in; _nr = _v = 0; _s = 1; while(*_p && _nr < _bxp->nr) { switch(*_p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': _v = _v*10 + *_p - '0'; break; case 's': case 'S': _p++; switch(*_p) { case 'a': case 'A': _bxp->xxx[_nr] = WDAY_SA; _bxp->req[_nr] = _s*_v; break; case 'u': case 'U': _bxp->xxx[_nr] = WDAY_SU; _bxp->req[_nr] = _s*_v; break; default: goto error; } _s = 1; _v = 0; break; case 'm': case 'M': _p++; if(*_p!='o' && *_p!='O') goto error; _bxp->xxx[_nr] = WDAY_MO; _bxp->req[_nr] = _s*_v; _s = 1; _v = 0; break; case 't': case 'T': _p++; switch(*_p) { case 'h': case 'H': _bxp->xxx[_nr] = WDAY_TH; _bxp->req[_nr] = _s*_v; break; case 'u': case 'U': _bxp->xxx[_nr] = WDAY_TU; _bxp->req[_nr] = _s*_v; break; default: goto error; } _s = 1; _v = 0; break; case 'w': case 'W': _p++; if(*_p!='e' && *_p!='E') goto error; _bxp->xxx[_nr] = WDAY_WE; _bxp->req[_nr] = _s*_v; _s = 1; _v = 0; break; case 'f': case 'F': _p++; if(*_p!='r' && *_p!='R') goto error; _bxp->xxx[_nr] = WDAY_FR; _bxp->req[_nr] = _s*_v; _s = 1; _v = 0; break; case '-': _s = -1; break; case '+': case ' ': case '\t': break; case ',': _nr++; break; default: goto error; } _p++; } return _bxp;error: tr_byxxx_free(_bxp); return NULL;}tr_byxxx_p ic_parse_byxxx(char *_in){ tr_byxxx_p _bxp = NULL; int _nr, _s, _v; char *_p; if(!_in) return NULL; _bxp = tr_byxxx_new(); if(!_bxp) return NULL; _p = _in; _nr = 1; while(*_p) { if(*_p == ',') _nr++; _p++; } if(tr_byxxx_init(_bxp, _nr) < 0) { tr_byxxx_free(_bxp); return NULL; } _p = _in; _nr = _v = 0; _s = 1; while(*_p && _nr < _bxp->nr) { switch(*_p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': _v = _v*10 + *_p - '0'; break; case '-': _s = -1; break; case '+': case ' ': case '\t': break; case ',': _bxp->xxx[_nr] = _v; _bxp->req[_nr] = _s; _s = 1; _v = 0; _nr++; break; default: goto error; } _p++; } if(_nr < _bxp->nr) { _bxp->xxx[_nr] = _v; _bxp->req[_nr] = _s; } return _bxp;error: tr_byxxx_free(_bxp); return NULL;}int ic_parse_wkst(char *_in){ if(!_in || strlen(_in)!=2) goto error; switch(_in[0]) { case 's': case 'S': switch(_in[1]) { case 'a': case 'A': return WDAY_SA; case 'u': case 'U': return WDAY_SU; default: goto error; } case 'm': case 'M': if(_in[1]!='o' && _in[1]!='O') goto error; return WDAY_MO; case 't': case 'T': switch(_in[1]) { case 'h': case 'H': return WDAY_TH; case 'u': case 'U': return WDAY_TU; default: goto error; } case 'w': case 'W': if(_in[1]!='e' && _in[1]!='E') goto error; return WDAY_WE; case 'f': case 'F': if(_in[1]!='r' && _in[1]!='R') goto error; return WDAY_FR; break; default: goto error; } error:#ifdef USE_YWEEK_U return WDAY_SU;#else return WDAY_MO;#endif}/*********************** imported from "checktr.c" **************************/#define REC_ERR -1#define REC_MATCH 0#define REC_NOMATCH 1#define _IS_SET(x) (((x)>0)?1:0)/*** local headers ***/int get_min_interval(tmrec_p);int check_min_unit(tmrec_p, ac_tm_p, tr_res_p);int check_freq_interval(tmrec_p _trp, ac_tm_p _atp);int check_byxxx(tmrec_p, ac_tm_p);/** * * return 0/REC_MATCH - the time falls in * -1/REC_ERR - error * 1/REC_NOMATCH - the time falls out */int check_tmrec(tmrec_p _trp, ac_tm_p _atp, tr_res_p _tsw){ if(!_trp || !_atp || (!_IS_SET(_trp->duration) && !_IS_SET(_trp->dtend))) return REC_ERR; // it is before start date if(_atp->time < _trp->dtstart) return REC_NOMATCH; // compute the duration of the recurrence interval if(!_IS_SET(_trp->duration)) _trp->duration = _trp->dtend - _trp->dtstart; if(_atp->time <= _trp->dtstart+_trp->duration) { if(_tsw) { if(_tsw->flag & TSW_RSET) { if(_tsw->rest>_trp->dtstart+_trp->duration-_atp->time) _tsw->rest = _trp->dtstart+_trp->duration - _atp->time; } else { _tsw->flag |= TSW_RSET; _tsw->rest = _trp->dtstart+_trp->duration - _atp->time; } } return REC_MATCH; } // after the bound of recurrence if(_IS_SET(_trp->until) && _atp->time >= _trp->until + _trp->duration) return REC_NOMATCH; // check if the instance of recurrence matches the 'interval' if(check_freq_interval(_trp, _atp)!=REC_MATCH) return REC_NOMATCH; if(check_min_unit(_trp, _atp, _tsw)!=REC_MATCH) return REC_NOMATCH; if(check_byxxx(_trp, _atp)!=REC_MATCH) return REC_NOMATCH; return REC_MATCH;}int check_freq_interval(tmrec_p _trp, ac_tm_p _atp){ int _t0, _t1; struct tm _tm; if(!_trp || !_atp) return REC_ERR; if(!_IS_SET(_trp->freq)) return REC_NOMATCH; if(!_IS_SET(_trp->interval) || _trp->interval==1) return REC_MATCH; switch(_trp->freq) { case FREQ_DAILY: case FREQ_WEEKLY: memset(&_tm, 0, sizeof(struct tm)); _tm.tm_year = _trp->ts.tm_year; _tm.tm_mon = _trp->ts.tm_mon; _tm.tm_mday = _trp->ts.tm_mday; _t0 = (int)mktime(&_tm); memset(&_tm, 0, sizeof(struct tm)); _tm.tm_year = _atp->t.tm_year; _tm.tm_mon = _atp->t.tm_mon; _tm.tm_mday = _atp->t.tm_mday; _t1 = (int)mktime(&_tm); if(_trp->freq == FREQ_DAILY) return (((_t1-_t0)/(24*3600))%_trp->interval==0)? REC_MATCH:REC_NOMATCH;#ifdef USE_YWEEK_U _t0 -= _trp->ts.tm_wday*24*3600; _t1 -= _atp->t.tm_wday*24*3600;#else _t0 -= ((_trp->ts.tm_wday+6)%7)*24*3600; _t1 -= ((_atp->t.tm_wday+6)%7)*24*3600;#endif return (((_t1-_t0)/(7*24*3600))%_trp->interval==0)? REC_MATCH:REC_NOMATCH; case FREQ_MONTHLY: _t0 = (_atp->t.tm_year-_trp->ts.tm_year)*12 + _atp->t.tm_mon-_trp->ts.tm_mon; return (_t0%_trp->interval==0)?REC_MATCH:REC_NOMATCH; case FREQ_YEARLY: return ((_atp->t.tm_year-_trp->ts.tm_year)%_trp->interval==0)? REC_MATCH:REC_NOMATCH; } return REC_NOMATCH;}int get_min_interval(tmrec_p _trp){ if(!_trp) return FREQ_NOFREQ; if(_trp->freq == FREQ_DAILY || _trp->byday || _trp->bymday || _trp->byyday) return FREQ_DAILY; if(_trp->freq == FREQ_WEEKLY || _trp->byweekno) return FREQ_WEEKLY; if(_trp->freq == FREQ_MONTHLY || _trp->bymonth) return FREQ_MONTHLY; if(_trp->freq == FREQ_YEARLY) return FREQ_YEARLY; return FREQ_NOFREQ;}int check_min_unit(tmrec_p _trp, ac_tm_p _atp, tr_res_p _tsw){ int _v0, _v1; if(!_trp || !_atp) return REC_ERR; switch(get_min_interval(_trp)) { case FREQ_DAILY: break; case FREQ_WEEKLY: if(_trp->ts.tm_wday != _atp->t.tm_wday) return REC_NOMATCH; break; case FREQ_MONTHLY: if(_trp->ts.tm_mday != _atp->t.tm_mday) return REC_NOMATCH; break; case FREQ_YEARLY: if(_trp->ts.tm_mon != _atp->t.tm_mon || _trp->ts.tm_mday != _atp->t.tm_mday) return REC_NOMATCH; break; default: return REC_NOMATCH; } _v0 = _trp->ts.tm_hour*3600 + _trp->ts.tm_min*60 + _trp->ts.tm_sec; _v1 = _atp->t.tm_hour*3600 + _atp->t.tm_min*60 + _atp->t.tm_sec; if(_v1 >= _v0 && _v1 < _v0 + _trp->duration) { if(_tsw) { if(_tsw->flag & TSW_RSET) { if(_tsw->rest>_v0+_trp->duration-_v1) _tsw->rest = _v0 + _trp->duration - _v1; } else { _tsw->flag |= TSW_RSET; _tsw->rest = _v0 + _trp->duration - _v1; } } return REC_MATCH; } return REC_NOMATCH;}int check_byxxx(tmrec_p _trp, ac_tm_p _atp){ int i; ac_maxval_p _amp = NULL; if(!_trp || !_atp) return REC_ERR; if(!_trp->byday && !_trp->bymday && !_trp->byyday && !_trp->bymonth && !_trp->byweekno) return REC_MATCH; _amp = ac_get_maxval(_atp); if(!_amp) return REC_NOMATCH; if(_trp->bymonth) { for(i=0; i<_trp->bymonth->nr; i++) { if(_atp->t.tm_mon == (_trp->bymonth->xxx[i]*_trp->bymonth->req[i]+12)%12) break; } if(i>=_trp->bymonth->nr) return REC_NOMATCH; } if(_trp->freq==FREQ_YEARLY && _trp->byweekno) { for(i=0; i<_trp->byweekno->nr; i++) { if(_atp->yweek == (_trp->byweekno->xxx[i]*_trp->byweekno->req[i]+ _amp->yweek)%_amp->yweek) break; } if(i>=_trp->byweekno->nr) return REC_NOMATCH; } if(_trp->byyday) { for(i=0; i<_trp->byyday->nr; i++) { if(_atp->t.tm_yday == (_trp->byyday->xxx[i]*_trp->byyday->req[i]+ _amp->yday)%_amp->yday) break; } if(i>=_trp->byyday->nr) return REC_NOMATCH; } if(_trp->bymday) { for(i=0; i<_trp->bymday->nr; i++) {#ifdef EXTRA_DEBUG DBG("Req:bymday: %d == %d\n", _atp->t.tm_mday, (_trp->bymday->xxx[i]*_trp->bymday->req[i]+ _amp->mday)%_amp->mday + ((_trp->bymday->req[i]<0)?1:0));#endif if(_atp->t.tm_mday == (_trp->bymday->xxx[i]*_trp->bymday->req[i]+ _amp->mday)%_amp->mday + (_trp->bymday->req[i]<0)?1:0) break; } if(i>=_trp->bymday->nr) return REC_NOMATCH; } if(_trp->byday) { for(i=0; i<_trp->byday->nr; i++) { if(_trp->freq==FREQ_YEARLY) {#ifdef EXTRA_DEBUG DBG("Req:byday:y: %d==%d && %d==%d\n", _atp->t.tm_wday, _trp->byday->xxx[i], _atp->ywday+1, (_trp->byday->req[i]+_amp->ywday)%_amp->ywday);#endif if(_atp->t.tm_wday == _trp->byday->xxx[i] && _atp->ywday+1 == (_trp->byday->req[i]+_amp->ywday)% _amp->ywday) break; } else { if(_trp->freq==FREQ_MONTHLY) {#ifdef EXTRA_DEBUG DBG("Req:byday:m: %d==%d && %d==%d\n", _atp->t.tm_wday, _trp->byday->xxx[i], _atp->mwday+1, (_trp->byday->req[i]+_amp->mwday)%_amp->mwday);#endif if(_atp->t.tm_wday == _trp->byday->xxx[i] && _atp->mwday+1==(_trp->byday->req[i]+ _amp->mwday)%_amp->mwday) break; } else { if(_atp->t.tm_wday == _trp->byday->xxx[i]) break; } } } if(i>=_trp->byday->nr) return REC_NOMATCH; } return REC_MATCH;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -