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