static int match_messages(char * message, size_t size, struct mailimf_fields * fields, int32_t flags, char * charset, struct mail_search_key * key) { clistiter * cur; size_t length; size_t cur_token; int r; switch (key->type) { /* flags */ case MAIL_SEARCH_KEY_ANSWERED: return ((flags & MAIL_FLAG_ANSWERED) != 0); case MAIL_SEARCH_KEY_FLAGGED: return ((flags & MAIL_FLAG_FLAGGED) != 0); case MAIL_SEARCH_KEY_DELETED: return ((flags & MAIL_FLAG_DELETED) != 0); case MAIL_SEARCH_KEY_RECENT: return ((flags & MAIL_FLAG_NEW) != 0) && ((flags & MAIL_FLAG_SEEN) == 0); case MAIL_SEARCH_KEY_SEEN: return ((flags & MAIL_FLAG_SEEN) != 0); case MAIL_SEARCH_KEY_NEW: return ((flags & MAIL_FLAG_NEW) != 0); case MAIL_SEARCH_KEY_OLD: return ((flags & MAIL_FLAG_NEW) == 0); case MAIL_SEARCH_KEY_UNANSWERED: return ((flags & MAIL_FLAG_ANSWERED) == 0); case MAIL_SEARCH_KEY_UNDELETED: return ((flags & MAIL_FLAG_DELETED) == 0); case MAIL_SEARCH_KEY_UNFLAGGED: return ((flags & MAIL_FLAG_FLAGGED) == 0); case MAIL_SEARCH_KEY_UNSEEN: return ((flags & MAIL_FLAG_SEEN) == 0); /* headers */ case MAIL_SEARCH_KEY_BCC: return match_header(fields, "Bcc", key->bcc); case MAIL_SEARCH_KEY_CC: return match_header(fields, "Cc", key->cc); case MAIL_SEARCH_KEY_FROM: return match_header(fields, "From", key->from); case MAIL_SEARCH_KEY_SUBJECT: return match_header(fields, "Subject", key->subject); case MAIL_SEARCH_KEY_TO: return match_header(fields, "To", key->to); case MAIL_SEARCH_KEY_HEADER: return match_header(fields, key->header_name, key->header_value); /* date */ case MAIL_SEARCH_KEY_BEFORE: return (comp_date(fields, key->before) <= 0); case MAIL_SEARCH_KEY_ON: return (comp_date(fields, key->before) == 0); case MAIL_SEARCH_KEY_SINCE: return (comp_date(fields, key->before) >= 0); /* boolean */ case MAIL_SEARCH_KEY_NOT: return (!match_messages(message, size, fields, flags, charset, key->not)); case MAIL_SEARCH_KEY_OR: return (match_messages(message, size, fields, flags, charset, key->or1) || match_messages(message, size, fields, flags, charset, key->or2)); case MAIL_SEARCH_KEY_MULTIPLE: for(cur = clist_begin(key->multiple) ; cur != NULL ; cur = clist_next(cur)) { if (!match_messages(message, size, fields, flags, charset, clist_content(cur))) return FALSE; } return TRUE; /* size */ case MAIL_SEARCH_KEY_SMALLER: return (size <= key->smaller); case MAIL_SEARCH_KEY_LARGER: return (size >= key->larger); case MAIL_SEARCH_KEY_BODY: length = strlen(message); cur_token = 0; while (1) { r = mailimf_ignore_field_parse(message, length, &cur_token); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else break; } return (strstr(message + cur_token, key->body) != NULL); case MAIL_SEARCH_KEY_TEXT: return (strstr(message, key->body) != NULL); case MAIL_SEARCH_KEY_ALL: default: return TRUE; } }
int get_week(date &start,date &rear) { int flag=comp_date(start,rear); if(flag>0) { int total_day=0; //start target to start 1/1 if(start.year>rear.year) { //complete month for(int mi=1;mi<=start.month-1;mi++) { total_day+=month_day[mi]; //leap year if(mi==2&&is_leap(start.year)) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } //complete day for(int di=1;di<=start.day-1;di++) total_day++; //special cover the non-existent days if(start.year==1582&&start.month==10&&start.day>=15&&1<=4) total_day-=10; if(start.year==1752&&start.month==9&&start.day>=14&&1<=2) total_day-=11; } else if(start.year==rear.year)//the dis days is on the same year { //front if(start.month>rear.month) { for(int di=1;di<=start.day-1;di++) total_day++; //special cover the non-existent days if(start.year==1582&&start.month==10&&start.day>=15&&1<=4) total_day-=10; if(start.year==1752&&start.month==9&&start.day>=14&&1<=2) total_day-=11; } else if(start.month==rear.month) { for(int di=start.day-1;di>=rear.day;di--) total_day++; //special cover the non-existent days if(start.year==1582&&start.month==10&&start.day>=15&&rear.day<=4) total_day-=10; if(start.year==1752&&start.month==9&&start.day>=14&&rear.day<=2) total_day-=11; } //middle if(start.month-1>rear.month) { for(int mi=start.month-1;mi>=rear.month+1;mi--) { total_day+=month_day[mi]; //leap if(mi==2&&is_leap(start.year)) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } } //rear if(start.month>rear.month) { for(int di=month_day[rear.month];di>=rear.day;di--) total_day++; //leap if(is_leap(rear.year)&&rear.month==2) total_day+=1; //special cover the non-existent days if(rear.year==1582&&rear.month==10&&rear.day<=4&&month_day[rear.month]>=15) total_day-=10; if(rear.year==1752&&rear.month==9&&rear.day<=2&&month_day[rear.month]>=14) total_day-=11; } } //start to end complete year if(start.year-1>rear.year) { for(int yi=start.year-1;yi>=rear.year+1;yi--) { total_day+=is_leap(yi)? 366 : 365; //special cover the non-existent days if(yi==1582) total_day-=10; if(yi==1752) total_day-=11; } } //end 12/31 to end target if(start.year>rear.year) { for(int mi=12;mi>=rear.month+1;mi--) { total_day+=month_day[mi]; //leap if(is_leap(rear.year)&&mi==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } for(int di=month_day[rear.month];di>=rear.day;di--) total_day++; //leap if(is_leap(rear.year)&&rear.month==2) total_day+=1; //special cover the non-existent days if(rear.year==1582&&rear.month==10&&rear.day<=4&&month_day[rear.month]>=15) total_day-=10; if(rear.year==1752&&rear.month==9&&rear.day<=2&&month_day[rear.month]>=14) total_day-=11; } //calculate the rear's week according to total days rear.week=week_mod(week_sub(start.week,week_mod(total_day,7)),7); } else if(flag<0) { int total_day=0; //start target to end 12/31 the start.day is not in total days not in Dis if(start.year<rear.year) { //complete day for(int di=start.day+1;di<=month_day[start.month];di++) total_day++; //leap if(is_leap(start.year)&&start.month==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&start.month==10&&month_day[start.month]>=15&&start.day<=4) total_day-=10; if(start.year==1752&&start.month==9&&month_day[start.month]>=14&&start.day<=2) total_day-=11; //complete month for(int mi=start.month+1;mi<=12;mi++) { total_day+=month_day[mi]; //leap if(is_leap(start.month)&&mi==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } } else if(start.year==rear.year)//the dis days is on the same year { //front if(start.month<rear.month) { for(int di=start.day+1;di<=month_day[start.month];di++) total_day++; //leap if(is_leap(start.year)&&start.month==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&start.month==10&&month_day[start.month]>=15&&start.day<=4) total_day-=10; if(start.year==1752&&start.month==9&&month_day[start.month]>=14&&start.day<=2) total_day-=11; } else if(start.month==rear.month) { for(int di=start.day+1;di<=rear.day;di++) total_day++; //special cover the non-existent days if(start.year==1582&&start.month==10&&rear.day>=15&&start.day<=4) total_day-=10; if(start.year==1752&&start.month==9&&rear.day>=14&&start.day<=2) total_day-=11; } //middle if(start.month+1<rear.month) { for(int mi=start.month+1;mi<=rear.month-1;mi++) { total_day+=month_day[mi]; //leap if(is_leap(start.year)&&mi==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } } //rear if(start.month<rear.month) { for(int di=1;di<=rear.day;di++) total_day++; //special cover the non-existent days if(rear.year==1582&&rear.month==10&&1<=4&&rear.day>=15) total_day-=10; if(rear.year==1752&&rear.month==9&&1<=2&&rear.day>=14) total_day-=11; } } //start to end complete year if(start.year+1<rear.year) { for(int yi=start.year+1;yi<=rear.year-1;yi++) { total_day+=is_leap(yi)? 366 : 365; //special cover the non-existent days if(yi==1582) total_day-=10; if(yi==1752) total_day-=11; } } //end 12/31 to end target if(start.year<rear.year) { for(int mi=1;mi<=rear.month-1;mi++) { total_day+=month_day[mi]; //leap if(is_leap(rear.year)&&mi==2) total_day+=1; //special cover the non-existent days if(start.year==1582&&mi==10) total_day-=10; if(start.year==1752&&mi==9) total_day-=11; } for(int di=1;di<=rear.day;di++) total_day++; //special cover the non-existent days if(rear.year==1582&&rear.month==10&&1<=4&&rear.day>=15) total_day-=10; if(rear.year==1752&&rear.month==9&&1<=2&&rear.day>=14) total_day-=11; } //calculate the rear's week according to total days rear.week=week_mod(week_add(start.week,week_mod(total_day,7)),7); } else//start == rear { rear.week=start.week; } return(0); }