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