/****************************************************************/ /* */ /* systime.c */ /* */ /* DOS/NT Date/Time Functions */ /* */ /* Copyright (c) 1995 */ /* Pasquale J. Villani */ /* All Rights Reserved */ /* */ /* This file is part of DOS-C. */ /* */ /* DOS-C is free software; you can redistribute it and/or */ /* modify it under the terms of the GNU General Public License */ /* as published by the Free Software Foundation; either version */ /* 2, or (at your option) any later version. */ /* */ /* DOS-C is distributed in the hope that it will be useful, but */ /* WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public */ /* License along with DOS-C; see the file COPYING. If not, */ /* write to the Free Software Foundation, 675 Mass Ave, */ /* Cambridge, MA 02139, USA. */ /****************************************************************/ #include "../../hdr/portab.h" #include "../../hdr/time.h" #include "../../hdr/date.h" #include "globals.h" /* $Logfile: C:/dos-c/src/kernel/systime.c_v $ */ static BYTE *systimeRcsId = "$Header: C:/dos-c/src/kernel/systime.c_v 1.1 01 Sep 1995 17:54:16 patv $"; /* * $Log: C:/dos-c/src/kernel/systime.c_v $ * * Rev 1.1 01 Sep 1995 17:54:16 patv * First GPL release. * * Rev 1.0 02 Jul 1995 8:32:20 patv * Initial revision. */ static BYTE *clk_name = "CLOCK$"; static WORD days[2][13] = { {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366} }; static WORD ndays[2][13] = { /* 1 2 3 4 5 6 7 8 9 10 11 12 */ {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, }; static COUNT sysHour = 0, sysMinute = 0, sysSecond = 0, Hundreths = 0; static COUNT Month = EPOCH_MONTH, Day = EPOCH_DAY, Year = EPOCH_YEAR, DayOfWeek = EPOCH_WEEKDAY; VOID DosGetTime(hp, mp, sp, hdp) BYTE FAR *hp, FAR *mp, FAR *sp, FAR *hdp; { struct ClockRecord buf; request rq; rq.r_length = sizeof(request); rq.r_command = C_INPUT; rq.r_count = sizeof(buf); rq.r_trans = (BYTE FAR *)(&buf); rq.r_status = 0; execrh((request FAR *)&rq, (struct dhdr FAR *)clock); if(rq.r_status & S_ERROR) return; *hp = sysHour = buf.clkHours; *mp = sysMinute = buf.clkMinutes; *sp = sysSecond = buf.clkSeconds; *hdp = Hundreths = buf.clkHundredths; } COUNT DosSetTime(hp, mp, sp, hdp) BYTE FAR *hp, FAR *mp, FAR *sp, FAR *hdp; { struct ClockRecord buf; request rq; DosGetDate((BYTE FAR *)&DayOfWeek, (BYTE FAR *)&Month, (BYTE FAR *)&Day, (BYTE FAR *)&Year); buf.clkHours = sysHour = *hp; buf.clkMinutes = sysMinute = *mp; buf.clkSeconds = sysSecond = *sp; buf.clkHundredths = Hundreths = *hdp; buf.clkDays = Day + days[!(Year & 0x3)][Month - 1] + ((Year - 1980) * 365) + ((Year - 1980 + 3) / 4); rq.r_length = sizeof(request); rq.r_command = C_OUTPUT; rq.r_count = sizeof(buf); rq.r_trans = (BYTE FAR *)(&buf); rq.r_status = 0; execrh((request FAR *)&rq, (struct dhdr FAR *)clock); if(rq.r_status & S_ERROR) return char_error(&rq, clk_name); return SUCCESS; } VOID DosGetDate(wdp, mp, mdp, yp) BYTE FAR *wdp, FAR *mp, FAR *mdp; COUNT FAR *yp; { COUNT count, c; struct ClockRecord buf; request rq; rq.r_length = sizeof(request); rq.r_command = C_INPUT; rq.r_count = sizeof(buf); rq.r_trans = (BYTE FAR *)(&buf); rq.r_status = 0; execrh((request FAR *)&rq, (struct dhdr FAR *)clock); if(rq.r_status & S_ERROR) return; for(Year = 1980, c = buf.clkDays; c > 0; ) { count = !(Year & 0x3) ? 366 : 365; if(c > count) { ++Year; c -= count; } else break; } /* c contains the days left and count the number of days for */ /* that year. Use this to index the table. */ for(Month = 1; Month < 13; Month++) { if(days[count == 366][Month] > c) { Day = c - days[count == 366][Month - 1]; break; } } *mp = Month; *mdp = Day; *yp = Year; /* Day of week is simple. Take mod 7, add 2 (for Tuesday */ /* 1-1-80) and take mod again */ DayOfWeek = (buf.clkDays - 1) % 7; DayOfWeek += 2; DayOfWeek %= 7; *wdp = DayOfWeek; } COUNT DosSetDate(mp, mdp, yp) BYTE FAR *mp, FAR *mdp; COUNT FAR *yp; { struct ClockRecord buf; request rq; Month = *mp; Day = *mdp; Year = *yp; if(Year < 1980 || Year > 2099 || Month < 1 || Month > 12 || Day < 1 || Day > ndays[!(Year & 0x3)][Month]) return DE_INVLDDATA; DosGetTime((BYTE FAR *)&sysHour, (BYTE FAR *)&sysMinute, (BYTE FAR *)&sysSecond, (BYTE FAR *)&Hundreths); buf.clkHours = sysHour; buf.clkMinutes = sysMinute; buf.clkSeconds = sysSecond; buf.clkHundredths = Hundreths; buf.clkDays = Day + days[!(Year & 0x3)][Month - 1] + ((Year - 1980) * 365) + ((Year - 1980 + 3) / 4); rq.r_length = sizeof(request); rq.r_command = C_OUTPUT; rq.r_count = sizeof(buf); rq.r_trans = (BYTE FAR *)(&buf); rq.r_status = 0; execrh((request FAR *)&rq, (struct dhdr FAR *)clock); if(rq.r_status & S_ERROR) return char_error(&rq, clk_name); return SUCCESS; }