%% 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
if dptr is NULL or dsz is 0,
- DK4_E_BUFFER_TOO_SMALL
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
if dptr is NULL or dsz is 0,
- DK4_E_BUFFER_TOO_SMALL
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
if dptr is NULL or dsz is 0,
- DK4_E_BUG
if an internal conversion function fails,
- DK4_E_BUFFER_TOO_SMALL
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;
}