I am bored, I could not resist trying to solve. Here's a prototype in ruby - should be clear enough to translate to C.
offset , : Baseyear, Baseday, Basesec, 0 = 1,
year= Baseyear
day = Baseday
sec = Basesec+offset
is_leap = is_leap_year(year)
days_remaining = 365+(is_leap ? 1 : 0) - day
secs_remaining = SEC_PER_DAY*days_remaining
while (sec>=secs_remaining)
sec-=secs_remaining
year+=1
is_leap = is_leap_year(year)
days_remaining = 365+(is_leap ? 1 : 0)
secs_remaining = SEC_PER_DAY*days_remaining
day=0
end
day += sec / SEC_PER_DAY
day = day.to_i
sec %= SEC_PER_DAY
for i in (0..11)
dpm = DAYS_PER_MONTH[i]
if (i==1 && is_leap)
dpm+=1
end
if day < dpm
month = i
break
else
day-=dpm
end
end
day+=1
hour = sec/3600
min = (sec%3600)/60
sec = sec%60
puts "%s %d, %d @ %02d:%02d:%02d" % [MONTHNAME[month],day,year, hour, min, sec]
, DST .