1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4time08.ctr
12 */
13
14 /** @file dk4time08.c The dk4time08 module.
15 */
16
17
18 #include "dk4conf.h"
19
20 #if DK4_HAVE_ASSERT_H
21 #ifndef ASSERT_H_INCLUDED
22 #include <assert.h>
23 #define ASSERT_H_INCLUDED 1
24 #endif
25 #endif
26
27 #include <libdk4c/dk4time08.h>
28
29 #ifndef DK4STR8_H_INCLUDED
30 #include <libdk4base/dk4str8.h>
31 #endif
32
33 #ifndef DK4MAO8D_H_INCLUDED
34 #include <libdk4maio8d/dk4mao8d.h>
35 #endif
36
37
38
39
40
41
42
43 /** Constant text strings used by this module.
44 */
45 static const char * const dk4time08_kw[] = {
46 /* 0 */
47 "0",
48
49 /* 1 */
50 "-",
51
52 /* 2 */
53 "/",
54
55 /* 3 */
56 ".",
57
58 /* 4 */
59 " ",
60
61 /* 5 */
62 ":",
63
64 NULL
65
66 };
67
68
69
70 int
dk4time_to_text_c8(char * dptr,size_t dsz,int format,unsigned short year,unsigned short month,unsigned short mday,unsigned short hour,unsigned short min,unsigned short sec,dk4_er_t * erp)71 dk4time_to_text_c8(
72 char *dptr,
73 size_t dsz,
74 int format,
75 unsigned short year,
76 unsigned short month,
77 unsigned short mday,
78 unsigned short hour,
79 unsigned short min,
80 unsigned short sec,
81 dk4_er_t *erp
82 )
83 {
84 char bye[8];
85 char bmo[8];
86 char bda[8];
87 char bho[8];
88 char bmi[8];
89 char bse[8];
90 int res;
91 int back = 0;
92 #if DK4_USE_ASSERT
93 assert(NULL != dptr);
94 assert(0 < dsz);
95 #endif
96 if ((NULL != dptr) && (0 < dsz)) {
97 back = 1;
98 res = dk4ma_write_c8_decimal_unsigned(
99 bye, sizeof(bye), (dk4_um_t)year, 4, erp
100 );
101 if (0 == res) { back = 0; }
102 res = dk4ma_write_c8_decimal_unsigned(
103 bmo, sizeof(bmo), (dk4_um_t)month, 2, erp
104 );
105 if (0 == res) { back = 0; }
106 res = dk4ma_write_c8_decimal_unsigned(
107 bda, sizeof(bda), (dk4_um_t)mday, 2, erp
108 );
109 if (0 == res) { back = 0; }
110 if (DK4_TIMEFORMAT_DATE_SORTABLE != format) {
111 if (DK4_TIMEFORMAT_DATE_ENGLISH != format) {
112 if (DK4_TIMEFORMAT_DATE_GERMAN != format) {
113 res = dk4ma_write_c8_decimal_unsigned(
114 bho, sizeof(bho), (dk4_um_t)hour, 2, erp
115 );
116 if (0 == res) { back = 0; }
117 res = dk4ma_write_c8_decimal_unsigned(
118 bmi, sizeof(bmi), (dk4_um_t)min, 2, erp
119 );
120 if (0 == res) { back = 0; }
121 res = dk4ma_write_c8_decimal_unsigned(
122 bse, sizeof(bse), (dk4_um_t)sec, 2, erp
123 );
124 if (0 == res) { back = 0; }
125 }
126 }
127 }
128 if (0 != back) {
129 back = 0;
130 switch (format) {
131 case DK4_TIMEFORMAT_DATE_ENGLISH: {
132 if (0 != dk4str8_cpy_s(dptr, dsz, bmo, erp)) {
133 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[2], erp)) {
134 if (0 != dk4str8_cat_s(dptr, dsz, bda, erp)) {
135 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[2], erp)) {
136 if (0 != dk4str8_cat_s(dptr, dsz, bye, erp)) {
137 back = 1;
138 }
139 }
140 }
141 }
142 }
143 } break;
144 case DK4_TIMEFORMAT_DATE_GERMAN: {
145 if (0 != dk4str8_cpy_s(dptr, dsz, bda, erp)) {
146 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[3], erp)) {
147 if (0 != dk4str8_cat_s(dptr, dsz, bmo, erp)) {
148 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[3], erp)) {
149 if (0 != dk4str8_cat_s(dptr, dsz, bye, erp)) {
150 back = 1;
151 }
152 }
153 }
154 }
155 }
156 } break;
157 default: {
158 /* yyyy-mm-dd */
159 if (0 != dk4str8_cpy_s(dptr, dsz, bye, erp)) {
160 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[1], erp)) {
161 if (0 != dk4str8_cat_s(dptr, dsz, bmo, erp)) {
162 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[1], erp)) {
163 if (0 != dk4str8_cat_s(dptr, dsz, bda, erp)) {
164 back = 1;
165 }
166 }
167 }
168 }
169 }
170 if ((0 != back) && (DK4_TIMEFORMAT_DATE_SORTABLE != format)) {
171 back = 0;
172 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[4], erp)) {
173 if (0 != dk4str8_cat_s(dptr, dsz, bho, erp)) {
174 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[5], erp)) {
175 if (0 != dk4str8_cat_s(dptr, dsz, bmi, erp)) {
176 if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[5], erp)) {
177 if (0 != dk4str8_cat_s(dptr, dsz, bse, erp)) {
178 back = 1;
179 }
180 }
181 }
182 }
183 }
184 }
185 }
186 } break;
187 }
188 }
189 } else {
190 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
191 }
192 return back;
193 }
194
195
196
197 int
dk4time_convert_to_text_c8(char * dptr,size_t dsz,const struct tm * tm,dk4_er_t * erp)198 dk4time_convert_to_text_c8(
199 char *dptr, size_t dsz, const struct tm *tm, dk4_er_t *erp
200 )
201 {
202 int back = 0;
203 #if DK4_USE_ASSERT
204 assert(NULL != dptr);
205 assert(0 < dsz);
206 assert(NULL != tm);
207 #endif
208 if ((NULL != dptr) && (0 < dsz)) {
209 *dptr = '\0';
210 if (NULL != tm) {
211 back = dk4time_to_text_c8(
212 dptr, dsz, DK4_TIMEFORMAT_DATE_TIME,
213 (unsigned short)(1900 + tm->tm_year),
214 (unsigned short)(1 + tm->tm_mon),
215 (unsigned short)(tm->tm_mday),
216 (unsigned short)(tm->tm_hour),
217 (unsigned short)(tm->tm_min),
218 (unsigned short)(tm->tm_sec),
219 erp
220 );
221 } else {
222 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
223 }
224 } else {
225 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
226 }
227 return back;
228 }
229
230
231
232 static
233 int
dk4time_i_as_text_c8(char * dptr,size_t dsz,const dk4_time_t * timer,dk4_er_t * erp)234 dk4time_i_as_text_c8(
235 char *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp
236 )
237 {
238 #if DK4_ON_WINDOWS
239 /* +++ Windows */
240 struct tm lct;
241 int back = 0;
242 #if DK4_USE_ASSERT
243 assert(NULL != dptr);
244 assert(0 < dsz);
245 assert(NULL != timer);
246 #endif
247 if (0 == _localtime64_s(&lct, timer)) {
248 back = dk4time_convert_to_text_c8(dptr, dsz, &lct, erp);
249 } else {
250 dk4error_set_simple_error_code(erp, DK4_E_BUG);
251 }
252 return back;
253 /* --- Windows */
254 #else
255 /* +++ non-Windows */
256 #if DK4_HAVE_LOCALTIME_R
257 struct tm lct;
258 int back = 0;
259 #if DK4_USE_ASSERT
260 assert(NULL != dptr);
261 assert(0 < dsz);
262 assert(NULL != timer);
263 #endif
264 if (NULL != localtime_r(timer, &lct)) {
265 back = dk4time_convert_to_text_c8(dptr, dsz, &lct, erp);
266 } else {
267 dk4error_set_simple_error_code(erp, DK4_E_BUG);
268 }
269 return back;
270 #else
271 dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED);
272 return 0;
273 #endif
274 /* --- non-Windows */
275 #endif
276 }
277
278
279
280 int
dk4time_as_text_c8(char * dptr,size_t dsz,const dk4_time_t * timer,dk4_er_t * erp)281 dk4time_as_text_c8(
282 char *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp
283 )
284 {
285 int back = 0;
286 #if DK4_USE_ASSERT
287 assert(NULL != dptr);
288 assert(0 < dsz);
289 assert(NULL != timer);
290 #endif
291 if ((NULL != dptr) && (0 < dsz)) {
292 *dptr = '\0';
293 if (NULL != timer) {
294 back = dk4time_i_as_text_c8(dptr, dsz, timer, erp);
295 } else {
296 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
297 }
298 } else {
299 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
300 }
301 return back;
302 }
303
304
305