;/* date.c F.Swift (c)1993 (updated by M.Weller,1993,99,2000)
dcc -c -o date.o -pr date.c
quit
 ***********************************************/

#include <stdio.h>
#include <dos/dos.h>

#define MINS_PER_HOUR   60
#define TICS_PER_SEC    50
#define DAYS_PER_WEEK   7

/* Days from Jan.1, 0000 to Jan.1, 1978 */

#define DDELTA    722449

static char *Months[12] =
{
  "Jan","Feb","Mar",
  "Apr","May","Jun",
  "Jul","Aug","Sep",
  "Oct","Nov","Dec"
};

static char *Days[7] =
{
  "Sun",   /* Note: these have to appear right in this order. */
  "Mon",
  "Tue",
  "Wed",
  "Thu",
  "Fri",
  "Sat"
};

static char *LongDays[7] =
{
  "Sunday",
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday"
};

static SHORT MonthVectors[14] =
{
  -1, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364
};

char *DateString(char *buff, struct DateStamp *Date,int type)
{
  LONG JulianDate, Day0, Day1, Day2, Day3;
  LONG Year, Month, Day, Mill;
  LONG Weekday;
  LONG Hour, Minute, Second;

  JulianDate = Date->ds_Days + DDELTA;

  Year = (JulianDate / 146097) * 400;

  Day0 = Day1 = JulianDate %= 146097;

  Year += (JulianDate / 36524) * 100;

  Day2 = Day1 %= 36524;

  Year += (Day2 / 1461) * 4;

  Day3 = Day1 %= 1461;

  Year += Day3 / 365;

  Month = 1 + (Day1 %= 365);

  Day = Month % 30;

  Month /= 30;

  if (   (Day3 >= 59 && Day0 < 59)
      || (Day3 < 59 && (Day2 >= 59 || Day0 < 59)))
    Day1++;

  if (Day1 > MonthVectors[1 + Month])
    Month++;

  Day = Day1 - MonthVectors[Month];

  Weekday = Date->ds_Days % DAYS_PER_WEEK;

  Hour    = Date->ds_Minute / MINS_PER_HOUR;
  Minute  = Date->ds_Minute % MINS_PER_HOUR;
  Second  = Date->ds_Tick   / TICS_PER_SEC;

  switch(type)
        {
         case 0 :   sprintf(buff,"%s %02ld-%s-%02ld %02ld:%02ld:%02ld",
                    Days[Weekday],
                    Day,
                    Months[Month - 1],
                    Year % 100,
                    Hour,
                    Minute,
                    Second);
                    break;

         case 1 :   sprintf(buff,"%s %02ld-%s-%02ld",
                    Days[Weekday],
                    Day,
                    Months[Month - 1],
                    Year % 100);
                    break;

         case 2 :   sprintf(buff,"%02ld-%s-%02ld",
                    Day,
                    Months[Month - 1],
                    Year % 100);
                    break;

         case 3 :   sprintf(buff,"%02ld:%02ld:%02ld",
                    Hour,
                    Minute,
                    Second);
                    break;

         case 4 :   sprintf(buff,"%02ld%02ld",
                    Day,
                    Month);
                    break;

         case 5 :   Mill = Year % 100; /* use this with care!*/
                    if(Mill > 78) Mill += 1900;
                    else Mill += 2000;
                    sprintf(buff,"%02ld-%s-%04ld",
                    Day,
                    Months[Month - 1],
                    Mill);
                    break;
        }

  return (buff + strlen(buff));
}

