diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4time08.ctr |
Initial commit
Diffstat (limited to 'support/dktools/dk4time08.ctr')
-rw-r--r-- | support/dktools/dk4time08.ctr | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/support/dktools/dk4time08.ctr b/support/dktools/dk4time08.ctr new file mode 100644 index 0000000000..a85cba406e --- /dev/null +++ b/support/dktools/dk4time08.ctr @@ -0,0 +1,370 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2015-xxxx +license = bsd + + +%% header + +/** @file + Convert timestamp to char string, timestamp either given as set + of components (year, month, day, hour, minute, second), as + pointer to struct tm or as dk4_time_t value. + + CRT on Windows: Optional. +*/ + +#ifndef DK4CONF_H_INCLUDED +#include "dk4conf.h" +#endif + +#ifndef DK4TYPES_H_INCLUDED +#include "dk4types.h" +#endif + +#ifndef DK4ERROR_H_INCLUDED +#include "dk4error.h" +#endif + +#ifndef DK4TIME_H_INCLUDED +#include "dk4time.h" +#endif + +#ifndef DK4TIMEC_H_INCLUDED +#include "dk4timec.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Convert timestamp to char string. + CRT on Windows: Optional. + @param dptr Destination buffer address. + @param dsz Destination buffer size (number of char). + @param format Output format: + DK4_TIMEFORMAT_DATE_TIME for sortable date/time + combination + yyyy-mm-dd hh:mm:ss + (default), + DK4_TIMEFORMAT_DATE_SORTABLE for sortable date + yyyy-mm-dd, + DK4_TIMEFORMAT_DATE_ENGLISH for English style date + mm/dd/yyyy, + DK4_TIMEFORMAT_DATE_GERMAN for German style date + dd.mm.yyyy. + @param year Year. + @param month Month (1 to 12). + @param mday Day within month (1 to 31). + @param hour Hour of day (0 to 23). + @param min Minute within hour (0 to 59). + @param sec Second within minute (0 to 59). + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if dptr is NULL or dsz is 0, + - DK4_E_BUFFER_TOO_SMALL<br> + if the buffer is too small. + +*/ +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 +); + +/** Create text representation for a struct tm. + CRT on Windows: Required. + @param dptr Destination buffer address. + @param dsz Destination buffer size (number of wchar_t). + @param tm Struct to convert. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if dptr is NULL or dsz is 0, + - DK4_E_BUFFER_TOO_SMALL<br> + if the buffer is too small. +*/ +int +dk4time_convert_to_text_c8( + char *dptr, size_t dsz, const struct tm *tm, dk4_er_t *erp +); + +/** Create text representation for timestamp. + CRT on Windows: Required. + @param dptr Destination buffer address. + @param dsz Destination buffer size. + @param timer Timestamp to convert. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if dptr is NULL or dsz is 0, + - DK4_E_BUG<br> + if an internal conversion function fails, + - DK4_E_BUFFER_TOO_SMALL<br> + if the buffer is too small. +*/ +int +dk4time_as_text_c8( + char *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp +); + +#ifdef __cplusplus +} +#endif + +%% module + +#include "dk4time08.h" + +#ifndef DK4STR8_H_INCLUDED +#include "dk4str8.h" +#endif + +#ifndef DK4MAO8D_H_INCLUDED +#include "dk4mao8d.h" +#endif + + + +$!trace-include + + + +/** Constant text strings used by this module. +*/ +static const char * const dk4time08_kw[] = { +$!string-table +0 +- +/ +. + +: +$!end +}; + + + +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 +) +{ + char bye[8]; + char bmo[8]; + char bda[8]; + char bho[8]; + char bmi[8]; + char bse[8]; + int res; + int back = 0; + if ((NULL != dptr) && (0 < dsz)) { + back = 1; + res = dk4ma_write_c8_decimal_unsigned( + bye, sizeof(bye), (dk4_um_t)year, 4, erp + ); + if (0 == res) { back = 0; } + res = dk4ma_write_c8_decimal_unsigned( + bmo, sizeof(bmo), (dk4_um_t)month, 2, erp + ); + if (0 == res) { back = 0; } + res = dk4ma_write_c8_decimal_unsigned( + bda, sizeof(bda), (dk4_um_t)mday, 2, erp + ); + if (0 == res) { back = 0; } + if (DK4_TIMEFORMAT_DATE_SORTABLE != format) { + if (DK4_TIMEFORMAT_DATE_ENGLISH != format) { + if (DK4_TIMEFORMAT_DATE_GERMAN != format) { + res = dk4ma_write_c8_decimal_unsigned( + bho, sizeof(bho), (dk4_um_t)hour, 2, erp + ); + if (0 == res) { back = 0; } + res = dk4ma_write_c8_decimal_unsigned( + bmi, sizeof(bmi), (dk4_um_t)min, 2, erp + ); + if (0 == res) { back = 0; } + res = dk4ma_write_c8_decimal_unsigned( + bse, sizeof(bse), (dk4_um_t)sec, 2, erp + ); + if (0 == res) { back = 0; } + } + } + } + if (0 != back) { + back = 0; + switch (format) { + case DK4_TIMEFORMAT_DATE_ENGLISH: { + if (0 != dk4str8_cpy_s(dptr, dsz, bmo, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[2], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bda, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[2], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bye, erp)) { + back = 1; + } + } + } + } + } + } break; + case DK4_TIMEFORMAT_DATE_GERMAN: { + if (0 != dk4str8_cpy_s(dptr, dsz, bda, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[3], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bmo, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[3], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bye, erp)) { + back = 1; + } + } + } + } + } + } break; + default: { + /* yyyy-mm-dd */ + if (0 != dk4str8_cpy_s(dptr, dsz, bye, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[1], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bmo, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[1], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bda, erp)) { + back = 1; + } + } + } + } + } + if ((0 != back) && (DK4_TIMEFORMAT_DATE_SORTABLE != format)) { + back = 0; + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[4], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bho, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[5], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bmi, erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, dk4time08_kw[5], erp)) { + if (0 != dk4str8_cat_s(dptr, dsz, bse, erp)) { + back = 1; + } + } + } + } + } + } + } + } break; + } + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + return back; +} + + + +int +dk4time_convert_to_text_c8( + char *dptr, size_t dsz, const struct tm *tm, dk4_er_t *erp +) +{ + int back = 0; + if ((NULL != dptr) && (0 < dsz)) { + *dptr = '\0'; + if (NULL != tm) { + back = dk4time_to_text_c8( + dptr, dsz, DK4_TIMEFORMAT_DATE_TIME, + (1900 + tm->tm_year), (1 + tm->tm_mon), tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, + erp + ); + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + return back; +} + + + +static +int +dk4time_i_as_text_c8( + char *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp +) +{ +#if DK4_ON_WINDOWS + /* +++ Windows */ + struct tm lct; + int back = 0; + if (0 == _localtime64_s(&lct, timer)) { + back = dk4time_convert_to_text_c8(dptr, dsz, &lct, erp); + } else { + dk4error_set_simple_error_code(erp, DK4_E_BUG); + } + return back; + /* --- Windows */ +#else + /* +++ non-Windows */ +#if DK4_HAVE_LOCALTIME_R + struct tm lct; + int back = 0; + if (NULL != localtime_r(timer, &lct)) { + back = dk4time_convert_to_text_c8(dptr, dsz, &lct, erp); + } else { + dk4error_set_simple_error_code(erp, DK4_E_BUG); + } + return back; +#else + dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); + return 0; +#endif + /* --- non-Windows */ +#endif +} + + + +int +dk4time_as_text_c8( + char *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp +) +{ + int back = 0; + if ((NULL != dptr) && (0 < dsz)) { + *dptr = '\0'; + if (NULL != timer) { + back = dk4time_i_as_text_c8(dptr, dsz, timer, erp); + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + } else { + dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); + } + return back; +} + + |