1169689Skan/*	$NetBSD: chiptotime.c,v 1.3 2005/12/11 12:18:19 christos Exp $ */
2169689Skan
3171825Skan#include <sys/types.h>
4169689Skan
5169689Skan#include <machine/prom.h>
6169689Skan
7169689Skan#include <lib/libsa/stand.h>
8169689Skan#include "libsa.h"
9169689Skan
10169689Skan/*
11169689Skan * BCD to decimal and decimal to BCD.
12169689Skan */
13169689Skan#define FROMBCD(x)      (int)((((unsigned int)(x)) >> 4) * 10 +\
14169689Skan				(((unsigned int)(x)) & 0xf))
15169689Skan#define TOBCD(x)        (int)((((unsigned int)(x)) / 10 * 16) +\
16169689Skan				(((unsigned int)(x)) % 10))
17169689Skan
18169689Skan#define SECDAY          (24 * 60 * 60)
19169689Skan#define SECYR           (SECDAY * 365)
20169689Skan#define LEAPYEAR(y)     (((y) & 3) == 0)
21169689Skan#define YEAR0		68
22169689Skan
23169689Skan/*
24169689Skan * This code is defunct after 2068.
25169689Skan * Will Unix still be here then??
26169689Skan */
27169689Skanconst short dayyr[12] =
28169689Skan    {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
29169689Skan
30169689Skanu_long
31169689Skanchiptotime(int sec, int min, int hour, int day, int mon, int year)
32169689Skan{
33169689Skan	int days, yr;
34169689Skan
35169689Skan	sec = FROMBCD(sec);
36169689Skan	min = FROMBCD(min);
37169689Skan	hour = FROMBCD(hour);
38169689Skan	day = FROMBCD(day);
39169689Skan	mon = FROMBCD(mon);
40169689Skan	year = FROMBCD(year) + YEAR0;
41169689Skan	if (year < 70)
42169689Skan		year = 70;
43169689Skan
44169689Skan	/* simple sanity checks */
45169689Skan	if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31)
46169689Skan		return (0);
47169689Skan	days = 0;
48169689Skan	for (yr = 70; yr < year; yr++)
49169689Skan		days += LEAPYEAR(yr) ? 366 : 365;
50169689Skan	days += dayyr[mon - 1] + day - 1;
51169689Skan	if (LEAPYEAR(yr) && mon > 2)
52169689Skan		days++;
53169689Skan	/* now have days since Jan 1, 1970; the rest is easy... */
54169689Skan	return days * SECDAY + hour * 3600 + min * 60 + sec;
55169689Skan}
56169689Skan