⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpl_time.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -