#include <stdio.h>
#include <time.h>
int days_between ( struct tm * tsa, struct tm * tsb) {
return ( b - a) / ( 60 * 60 * 24 ) ;
}
int days_of_year ( int y) {
struct tm tsa = { 0 } ;
struct tm tsb = { 0 } ;
tsa.tm_mday = 1 ;
tsa.tm_year = y - 1900 ;
tsb.tm_mday = 1 ;
tsb.tm_year = y + 1 - 1900 ;
return days_between( & tsa, & tsb) ;
}
int days_of_month ( int m, int y, int * weekdays) {
struct tm tsa = { 0 } ;
struct tm tsb = { 0 } ;
int days;
tsa.tm_mday = 1 ;
tsa.tm_mon = m - 1 ;
tsa.tm_year = y - 1900 ;
tsb.tm_mday = 1 ;
tsb.tm_mon = m;
tsb.tm_year = y - 1900 ;
days = days_between( & tsa, & tsb) ;
if ( weekdays) {
int dss = tsa.tm_wday ;
* weekdays = 8 ;
switch ( days) {
case 31 : if ( dss == 0 || dss == 6 ) * weekdays += 1 ;
dss = ( dss + 1 ) % 7 ;
case 30 : if ( dss == 0 || dss == 6 ) * weekdays += 1 ;
dss = ( dss + 1 ) % 7 ;
case 29 : if ( dss == 0 || dss == 6 ) * weekdays += 1 ;
default : break ;
}
}
return days;
}
void print_days_info ( int m, int y) {
int w;
int d = days_of_month( m, y, & w) ;
printf ( "%d-%d: days: %d, weekdays: %d, days in year: %d\n " , m, y, d, w, days_of_year( y) ) ;
}
int main ( int argc, char * argv[ ] ) {
print_days_info( 8 , 2012 ) ;
print_days_info( 9 , 2012 ) ;
print_days_info( 10 , 2012 ) ;
print_days_info( 11 , 2012 ) ;
print_days_info( 12 , 2012 ) ;
print_days_info( 1 , 2013 ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgppbnQgZGF5c19iZXR3ZWVuIChzdHJ1Y3QgdG0gKnRzYSwgc3RydWN0IHRtICp0c2IpIHsKICAgIHRpbWVfdCBhID0gbWt0aW1lKHRzYSk7CiAgICB0aW1lX3QgYiA9IG1rdGltZSh0c2IpOwogICAgcmV0dXJuIChiIC0gYSkvKDYwKjYwKjI0KTsKfQoKaW50IGRheXNfb2ZfeWVhciAoaW50IHkpIHsKICAgIHN0cnVjdCB0bSB0c2EgPSB7MH07CiAgICBzdHJ1Y3QgdG0gdHNiID0gezB9OwoKICAgIHRzYS50bV9tZGF5ID0gMTsKICAgIHRzYS50bV95ZWFyID0geSAtIDE5MDA7CgogICAgdHNiLnRtX21kYXkgPSAxOwogICAgdHNiLnRtX3llYXIgPSB5ICsgMSAtIDE5MDA7CgogICAgcmV0dXJuIGRheXNfYmV0d2VlbigmdHNhLCAmdHNiKTsKfQoKaW50IGRheXNfb2ZfbW9udGggKGludCBtLCBpbnQgeSwgaW50ICp3ZWVrZGF5cykgewogICAgc3RydWN0IHRtIHRzYSA9IHswfTsKICAgIHN0cnVjdCB0bSB0c2IgPSB7MH07CiAgICBpbnQgZGF5czsKCiAgICB0c2EudG1fbWRheSA9IDE7CiAgICB0c2EudG1fbW9uID0gbSAtIDE7CiAgICB0c2EudG1feWVhciA9IHkgLSAxOTAwOwoKICAgIHRzYi50bV9tZGF5ID0gMTsKICAgIHRzYi50bV9tb24gPSBtOwogICAgdHNiLnRtX3llYXIgPSB5IC0gMTkwMDsKCiAgICBkYXlzID0gZGF5c19iZXR3ZWVuKCZ0c2EsICZ0c2IpOwogICAgaWYgKHdlZWtkYXlzKSB7CiAgICAgICAgaW50IGRzcyA9IHRzYS50bV93ZGF5OwogICAgICAgICp3ZWVrZGF5cyA9IDg7CiAgICAgICAgc3dpdGNoIChkYXlzKSB7CiAgICAgICAgY2FzZSAzMTogaWYgKGRzcyA9PSAwIHx8IGRzcyA9PSA2KSAqd2Vla2RheXMgKz0gMTsKICAgICAgICAgICAgICAgICBkc3MgPSAoZHNzICsgMSkgJSA3OwogICAgICAgIGNhc2UgMzA6IGlmIChkc3MgPT0gMCB8fCBkc3MgPT0gNikgKndlZWtkYXlzICs9IDE7CiAgICAgICAgICAgICAgICAgZHNzID0gKGRzcyArIDEpICUgNzsKICAgICAgICBjYXNlIDI5OiBpZiAoZHNzID09IDAgfHwgZHNzID09IDYpICp3ZWVrZGF5cyArPSAxOwogICAgICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXlzOwp9Cgp2b2lkIHByaW50X2RheXNfaW5mbyAoaW50IG0sIGludCB5KSB7CiAgICBpbnQgdzsKICAgIGludCBkID0gZGF5c19vZl9tb250aChtLCB5LCAmdyk7CgogICAgcHJpbnRmKCIlZC0lZDogZGF5czogJWQsIHdlZWtkYXlzOiAlZCwgZGF5cyBpbiB5ZWFyOiAlZFxuIiwKICAgICAgICAgICBtLCB5LCBkLCB3LCBkYXlzX29mX3llYXIoeSkpOwp9CgppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoKICAgIHByaW50X2RheXNfaW5mbyg4LCAyMDEyKTsKICAgIHByaW50X2RheXNfaW5mbyg5LCAyMDEyKTsKICAgIHByaW50X2RheXNfaW5mbygxMCwgMjAxMik7CiAgICBwcmludF9kYXlzX2luZm8oMTEsIDIwMTIpOwogICAgcHJpbnRfZGF5c19pbmZvKDEyLCAyMDEyKTsKICAgIHByaW50X2RheXNfaW5mbygxLCAyMDEzKTsKICAgIHJldHVybiAwOwp9Cg==
stdout
8-2012: days: 31, weekdays: 8, days in year: 366
9-2012: days: 30, weekdays: 10, days in year: 366
10-2012: days: 31, weekdays: 8, days in year: 366
11-2012: days: 30, weekdays: 8, days in year: 366
12-2012: days: 31, weekdays: 10, days in year: 366
1-2013: days: 31, weekdays: 8, days in year: 365