    #include <stdio.h>
    
    unsigned long AddDays(unsigned long StartDay, unsigned long Days)
    {
      unsigned long year = StartDay / 10000, month = StartDay / 100 % 100 - 1, day = StartDay % 100 - 1;
    
      while (Days)
      {
        unsigned daysInMonth[2][12] =
        {
          { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // 365 days, non-leap
          { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }  // 366 days, leap
        };
    
        int leap = !(year % 4) && (year % 100 || !(year % 400));
    
        unsigned daysLeftInMonth = daysInMonth[leap][month] - day;
    
        if (Days >= daysLeftInMonth)
        {
          day = 0;
          Days -= daysLeftInMonth;
          if (++month >= 12)
          {
            month = 0;
            year++;
          }
        }
        else
        {
          day += Days;
          Days = 0;
        }
      }
    
      return year * 10000 + (month + 1) * 100 + day + 1;
    }
    
    int main(void)
    {
      unsigned long testData[][2] =
      {
        { 20130228, 0 },
        { 20130228, 1 },
        { 20130228, 30 },
        { 20130228, 31 },
        { 20130228, 32 },
        { 20130228, 365 },
        { 20130228, 366 },
        { 20130228, 367 },
        { 20130228, 365*3 },
        { 20130228, 365*3+1 },
        { 20130228, 365*3+2 },
      };
    
      unsigned i;
    
      for (i = 0; i < sizeof(testData) / sizeof(testData[0]); i++)
        printf("%lu + %lu = %lu\n", testData[i][0], testData[i][1], AddDays(testData[i][0], testData[i][1]));
    
      return 0;
    }

