DEADSOFTWARE

subsystem C99 renamed to PosixC
[cpc.git] / src / posix / generic / Host / Mod / Dates.cp
1 MODULE HostDates;
3 IMPORT Dates, Strings, time := PosixCtime;
5 (* add localization? *)
7 TYPE
8 Hook = POINTER TO RECORD (Dates.Hook) END;
10 VAR
11 day: ARRAY 7, 10 OF CHAR;
12 month: ARRAY 12, 10 OF CHAR;
14 PROCEDURE (h: Hook) GetTime (OUT d: Dates.Date; OUT t: Dates.Time);
15 VAR epoch: time.time_t; tm: time.struct_tm; ptm: time.Pstruct_tm;
16 BEGIN
17 epoch := time.time(NIL);
18 ptm := time.localtime_r(epoch, tm);
19 IF ptm # NIL THEN
20 d.year := tm.tm_year + 1900;
21 d.month := tm.tm_mon + 1;
22 d.day := tm.tm_mday;
23 t.hour := tm.tm_hour;
24 t.minute := tm.tm_min;
25 t.second := tm.tm_sec
26 ELSE
27 d.year := 0;
28 d.month := 0;
29 d.day := 0;
30 t.hour := 0;
31 t.minute := 0;
32 t.second := 0
33 END
34 END GetTime;
36 PROCEDURE (h: Hook) GetUTCTime (OUT d: Dates.Date; OUT t: Dates.Time);
37 VAR epoch: time.time_t; tm: time.struct_tm; ptm: time.Pstruct_tm;
38 BEGIN
39 epoch := time.time(NIL);
40 ptm := time.gmtime_r(epoch, tm);
41 IF ptm # NIL THEN
42 d.year := tm.tm_year + 1900;
43 d.month := tm.tm_mon + 1;
44 d.day := tm.tm_mday;
45 t.hour := tm.tm_hour;
46 t.minute := tm.tm_min;
47 t.second := tm.tm_sec
48 ELSE
49 d.year := 0;
50 d.month := 0;
51 d.day := 0;
52 t.hour := 0;
53 t.minute := 0;
54 t.second := 0
55 END
56 END GetUTCTime;
58 PROCEDURE (h: Hook) GetUTCBias (OUT bias: INTEGER);
59 BEGIN
60 time.tzset;
61 (* !!! fix Dev2 *)
62 (* bias := time.timezone DIV 60 *)
63 bias := 0;
64 END GetUTCBias;
66 PROCEDURE (h: Hook) DateToString (d: Dates.Date; format: INTEGER; OUT str: ARRAY OF CHAR);
67 VAR s: ARRAY 20 OF CHAR;
69 PROCEDURE Copy (IN s: ARRAY OF CHAR; n: INTEGER; OUT str: ARRAY OF CHAR);
70 VAR i: INTEGER;
71 BEGIN
72 FOR i := 0 TO n - 1 DO
73 str[i] := s[i]
74 END;
75 str[i] := 0X
76 END Copy;
78 BEGIN
79 CASE format OF
80 | Dates.short:
81 str[0] := CHR(d.day DIV 10 MOD 10 + ORD("0"));
82 str[1] := CHR(d.day MOD 10 + ORD("0"));
83 str[2] := "/";
84 str[3] := CHR(d.month DIV 10 MOD 10 + ORD("0"));
85 str[4] := CHR(d.month MOD 10 + ORD("0"));
86 str[5] := "/";
87 str[6] := CHR(d.year DIV 10 MOD 10 + ORD("0"));
88 str[7] := CHR(d.year MOD 10 + ORD("0"));
89 str[8] := 0X
90 | Dates.abbreviated:
91 Copy(day[d.day - 1], 3, str);
92 Copy(month[d.month - 1], 3, s); str := str + ", " + s;
93 Strings.IntToString(d.year, s); str := str + ", " + s
94 | Dates.long:
95 str := day[d.day - 1] + ", " + month[d.month - 1];
96 Strings.IntToString(d.year, s); str := str + ", " + s
97 | Dates.plainAbbreviated:
98 Copy(month[d.month - 1], 3, str);
99 Strings.IntToString(d.day, s); str := str + " " + s;
100 Strings.IntToString(d.year, s); str := str + ", " + s
101 | Dates.plainLong:
102 Strings.IntToString(d.day, s); str := month[d.month - 1] + " " + s;
103 Strings.IntToString(d.year, s); str := str + ", " + s
104 END
105 END DateToString;
107 PROCEDURE (h: Hook) TimeToString (t: Dates.Time; OUT str: ARRAY OF CHAR);
108 VAR s: ARRAY 12 OF CHAR;
109 BEGIN
110 Strings.IntToString(t.hour, str);
111 Strings.IntToString(t.minute, s); str := str + ":" + s;
112 Strings.IntToString(t.second, s); str := str + ":" + s;
113 END TimeToString;
115 PROCEDURE Init;
116 VAR h: Hook;
117 BEGIN
118 day[0] := "Monday";
119 day[1] := "Tuesday";
120 day[2] := "Wednesday";
121 day[3] := "Thursday";
122 day[4] := "Friday";
123 day[5] := "Saturday";
124 day[6] := "Sunday";
125 month[0] := "January";
126 month[1] := "February";
127 month[2] := "March";
128 month[3] := "April";
129 month[4] := "May";
130 month[5] := "June";
131 month[6] := "July";
132 month[7] := "August";
133 month[8] := "September";
134 month[9] := "October";
135 month[10] := "November";
136 month[11] := "December";
137 NEW(h); Dates.SetHook(h)
138 END Init;
140 BEGIN
141 Init
142 END HostDates.