%% options
copyright owner = Dirk Krause
copyright year = 2015-xxxx
license = bsd
%% header
/** @file
Convert timestamp to wchar_t 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.
*/
#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 wchar_t string.
CRT on Windows: Optional.
@param dptr Destination buffer address.
@param dsz Destination buffer size (number of wchar_t).
@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_wc(
wchar_t *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: Optional.
@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_wc(
wchar_t *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 (number of wchar_t).
@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_wc(
wchar_t *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp
);
#ifdef __cplusplus
}
#endif
%% module
#include "dk4timewc.h"
#ifndef DK4TIME08_H_INCLUDED
#include "dk4time08.h"
#endif
#ifndef DK4REC23_H_INCLUDED
#include "dk4rec23.h"
#endif
int
dk4time_to_text_wc(
wchar_t *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 buffer[64];
int back = 0;
back = dk4time_to_text_c8(
buffer, sizeof(buffer), format, year, month, mday, hour, min, sec, erp
);
if (0 != back) {
back = dk4recode_char_to_wchar_t(dptr, dsz, buffer, erp);
}
return back;
}
int
dk4time_convert_to_text_wc(
wchar_t *dptr, size_t dsz, const struct tm *tm, dk4_er_t *erp
)
{
int back = 0;
if ((NULL != dptr) && (0 < dsz)) {
*dptr = L'\0';
if (NULL != tm) {
back = dk4time_to_text_wc(
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_wc(
wchar_t *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_wc(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_wc(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_wc(
wchar_t *dptr, size_t dsz, const dk4_time_t *timer, dk4_er_t *erp
)
{
int back = 0;
if ((dptr != NULL) && (0 < dsz)) {
*dptr = L'\0';
if (NULL != timer) {
back = dk4time_i_as_text_wc(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;
}