/*
 * Date operation lib
 *    Copyright (c) 2001 hiro <hiro@zob.ne.jp>
 */

#include "date.h"

static BYTE mdays[] = {
  31, 28, 31, 30, 31, 30,
  31, 31, 30, 31, 30, 31,
};

static char *mname[] = {
 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
 "January", "Febrary", "March", "April",
 "May", "June", "July", "August",
 "September", "October", "November", "December"
};

ulong
d_get_days(d_date_t far *d_)
{
  int y, m;
  y = d_->year; m = d_->month - 3;
  if (m < 0) {
    --y; m += 12;
  }
  return (ulong)(y * 365L) +
    (ulong)((y / 4) - (y / 100) + (y / 400)) + 
    (ulong)((m * 306 + 5) / 10) + (ulong)d_->day;
}

int
d_get_day(d_date_t far *d_)
{
  ulong days = d_get_days(d_) + 1L;
  return (int)(days % 7);
}

int
d_get_mdays(d_date_t far *d_)
{
  if (d_->month <= 0 || d_->month > 12) {
    return 0; /* invalid */
  }
  if (d_->month == 2 && 
      (d_->year % 4 == 0 && (d_->year % 100 !=0 || d_->year % 400 == 0))) {
    return (int)(mdays[1]) + 1;
  }
  return (int)(mdays[d_->month - 1]);
}

d_date_t far *
d_adjust_last(d_date_t far *d_)
{
  int last = d_get_mdays(d_);
  if (d_->day > last) {
    d_->day = last;
  }
  return d_;
}

char far *
d_month_name(d_date_t far *d_, int format_)
{
  if (d_->month <= 0 || d_->month > 12 || format_ < 0 || format_ > 1) {
    return (char far*)NULL;
  }
  return mname[d_->month - 1 + 12 * format_];
}
