]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/io/wallclock/v2_0/include/wallclock/wallclock.inl
Initial revision
[karo-tx-redboot.git] / packages / io / wallclock / v2_0 / include / wallclock / wallclock.inl
1 #ifndef CYGONCE_IO_WALLCLOCK_INL
2 #define CYGONCE_IO_WALLCLOCK_INL
3
4 //==========================================================================
5 //
6 //      wallclock.inl
7 //
8 //      Wallclock internal helper functions
9 //
10 //==========================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
15 //
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
19 //
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23 // for more details.
24 //
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
28 //
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
35 //
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
38 //
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //==========================================================================
44 //#####DESCRIPTIONBEGIN####
45 //
46 // Author(s):     jskov
47 // Contributors:  jskov
48 // Date:          2000-05-26
49 // Purpose:       Wall Clock internal helper functions
50 //
51 //####DESCRIPTIONEND####
52 //
53 //==========================================================================
54
55 #include <cyg/infra/cyg_type.h>
56 #include <cyg/infra/cyg_ass.h>          // assertions
57
58 // -------------------------------------------------------------------------
59 // Some helper functions
60
61 #define is_leap(_y_) (((0==(_y_)%4 && 0!=(_y_)%100) || 0==(_y_)%400) ? 1 : 0)
62 #define year_days(_y_) (is_leap(_y_) ? 366 : 365)
63
64 static cyg_int32 days_per_month[2][12] = {
65     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
66     {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
67 };
68
69 #ifndef time_t
70 #define time_t cyg_uint32
71 #endif
72
73 static time_t
74 _simple_mktime(cyg_uint32 year, cyg_uint32 mon,
75                cyg_uint32 day, cyg_uint32 hour,
76                cyg_uint32 min, cyg_uint32 sec)
77 {
78     time_t secs;
79     cyg_uint32 y, m, days;
80
81     CYG_ASSERT(year <= 3124, "Year is unreasonably large");
82     CYG_ASSERT(mon <= 12, "Month is invalid");
83     CYG_ASSERT(day <= 31, "Day is invalid");
84     CYG_ASSERT(hour <= 23, "Hour is invalid");
85     CYG_ASSERT(min <= 59, "Minutes is invalid");
86     CYG_ASSERT(sec <= 61, "Seconds is invalid");
87
88     // Number of days due to years
89     days = 0;
90     for (y = 1970; y < year; y++)
91         days += year_days(y);
92
93     // Due to months
94     for (m = 0; m < mon-1; m++)
95         days += days_per_month[is_leap(year)][m];
96     // Add days
97     days += day - 1;
98
99     // Add hours, minutes, and seconds
100     secs = ((days * 24 + hour) * 60 + min) * 60 + sec;
101
102     return secs;
103 }
104
105 #ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
106
107
108 static void
109 _simple_mkdate(time_t time,
110                cyg_uint32* year, cyg_uint32* mon,
111                cyg_uint32* day, cyg_uint32* hour,
112                cyg_uint32* min, cyg_uint32* sec)
113 {
114     cyg_int32 days, hms, y, m, *dpm;
115
116     days = (cyg_int32) (time / (24*60*60));
117     hms  = (cyg_int32) (time % (24*60*60));
118
119     // Nothing fancy about the time - no leap year magic involved
120     *sec = hms % 60;
121     *min = (hms % (60*60)) / 60;
122     *hour = hms / (60*60);
123
124     // Find year
125     for (y = 1970; days >= year_days(y); y++)
126         days -= year_days(y);
127     *year = y;
128     dpm = &days_per_month[is_leap(y)][0];
129
130     // Find month
131     for (m = 0; days >= dpm[m]; m++)
132         days -= dpm[m];
133     m++;
134     *mon = m;
135
136     *day = days+1;
137 }
138
139 #endif
140
141 //-----------------------------------------------------------------------------
142 // BCD helper macros
143 #define TO_BCD(x) ((((x)/10)<<4) | ((x)%10))
144 #define TO_DEC(x) ((((x)>>4)*10) + ((x)&0xf))
145
146 #endif // ifndef CYGONCE_DEVS_WALLCLOCK_INL
147 // EOF wallclock.inl