* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libc / msdos / time.c
blob7f7b1834966e889e240eacd0e80b0705695adf22
2 #include <time.h>
4 static int mdays[13] = { 0,31,31+28,31+28+31,31+28+31+30,
5 31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31,
6 31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30,
7 31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30,
8 365 };
10 #define SECSPERHOUR (60*60)
11 #define SECSPERDAY (SECSPERHOUR*24L)
13 /****************************************
14 * Return the number of seconds that have elapsed since the start
15 * of 1970.
16 * Input:
17 * timer pointer to where to store result (or NULL)
18 * Output:
19 * *timer = result (unless timer == NULL)
20 * Returns:
21 * time
24 static long get_time(ah)
26 #asm
27 #if !__FIRST_ARG_IN_AX__
28 mov bx,sp
29 mov ax,[bx+2]
30 #endif
31 mov ah,al
32 int $21
33 mov ax,dx
34 mov dx,cx
35 #endasm
38 time_t time(timer)
39 time_t *timer;
41 unsigned day,month,year;
42 long rv;
43 time_t t;
45 rv = get_time(0x2C);
46 rv >>= 8; t = (rv & 0xFF);
47 rv >>= 8; t += (rv & 0xFF)*60;
48 rv >>= 8; t += (rv & 0xFF)*3600;
50 rv = get_time(0x2A);
51 day = (rv & 0xFF);
52 rv >>= 8; month = (rv & 0xFF) -1;
53 rv >>= 8; year = (rv & 0xFFFF) - 1970;
55 if (month <= 1 || year & 3) /* if before Feb or not a leap year */
56 day--; /* don't add day for this leap year */
57 day += mdays[month]; /* day in year */
58 day += (year + 3) >> 2; /* add a day for each leap year, but */
59 /* don't worry about 2100 */
60 t += ((year * 365L) + day) * SECSPERDAY;
61 if (timer)
62 *timer = t;
63 return t;