Index: lib/sdk/crt/time/strftime.c =================================================================== --- lib/sdk/crt/time/strftime.c (revision 57579) +++ lib/sdk/crt/time/strftime.c (working copy) @@ -17,3 +17,40 @@ return 0; } +/* first_wday + * Gives you the yday for the first occurence of @wday in the year described + * by time.tm_wday and time.tm_yday. + * Does not validate the 'realness' of the year. + * Necessary for calculating %g, %G, %V and %U. + */ +static +int +first_wday(struct tm time, int wday) +{ + TCHAR circ_week[] = {_T('\x0A'), _T('\x01'), _T('\x02'), _T('\x03'), _T('\x04'), _T('\x05'), _T('\x06'), + _T('\x0A'), _T('\x01'), _T('\x02'), _T('\x03'), _T('\x04'), _T('\x05'), _T('\x06')}; + int delta; + int f_mon; + TCHAR* mon_ptr; + + if (time.tm_wday < 0 || time.tm_wday > 6 || time.tm_yday < 0 || time.tm_yday > 365 || wday < 0 || wday > 6) + return -1; + + if (0 == wday) + wday = 0x0A; + + // If true, time.tm_wday first day is in the first week of the year + // If false, in second week + if (time.tm_yday % 7 <= time.tm_wday) + mon_ptr = _tcschr(&circ_week[time.tm_wday], wday); + else + mon_ptr = _tcschr(circ_week, wday); + + if (NULL == mon_ptr) + return -1; + + delta = mon_ptr - &circ_week[time.tm_wday]; + f_mon = circ_week[time.tm_yday % 7 + delta] % 0x0A; + + return f_mon; +}