%% options copyright owner = Dirk Krause copyright year = 2016-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file dk4serf.h Serialize data to binary file. */ #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4TYPES_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" #else #include #endif #endif #ifndef DK4ERROR_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" #else #include #endif #endif #if DK4_HAVE_STDLIB_H #ifndef DK4_STDLIB_H_INCLUDED #include #define DK4_STDLIB_H_INCLUDED 1 #endif #endif #if DK4_HAVE_SYS_TYPES_H #ifndef DK4_SYS_TYPES_H_INCLUDED #include #define DK4_SYS_TYPES_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STDINT_H #ifndef DK4_STDINT_H_INCLUDED #include #define DK4_STDINT_H_INCLUDED 1 #endif #endif #include #ifdef __cplusplus extern "C" { #endif /** Serialize 16 bit unsigned int to file. @param fipo Output file. @param u Number to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if fipo is NULL or u is out of range, - DK4_E_WRITE_FAILED
if fwrite() failed. */ int dk4serialize_file_uint16_t(FILE *fipo, uint16_t u, dk4_er_t *erp); /** Serialize 16 bit signed int to file. @param fipo Output file. @param i Number to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if fipo is NULL or i is out of range, - DK4_E_WRITE_FAILED
if fwrite() failed. */ int dk4serialize_file_int16_t(FILE *fipo, int16_t i, dk4_er_t *erp); /** Serialize 32 bit unsigned int to file. @param fipo Output file. @param u Number to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if fipo is NULL or u is out of range, - DK4_E_WRITE_FAILED
if fwrite() failed. */ int dk4serialize_file_uint32_t(FILE *fipo, uint32_t u, dk4_er_t *erp); /** Serialize 32 bit signed int to file. @param fipo Output file. @param i Number to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if fipo is NULL or i is out of range, - DK4_E_WRITE_FAILED
if fwrite() failed. */ int dk4serialize_file_int32_t(FILE *fipo, int32_t i, dk4_er_t *erp); /** Serialize UTF-8 encoded string to file. @param fipo Output file. @param str String to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4serialize_file_utf8_string(FILE *fipo, const char *str, dk4_er_t *erp); /** Serialize dkChar string to file (convert to UTF-8). @param fipo Output file. @param str String to write. @param de Encoding for dkChar strings. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4serialize_file_dk_string(FILE *fipo,const dkChar *str,int de,dk4_er_t *erp); /** Serialize double value to file. The value is converted to string and saved as string, so you may loose information. @param fipo Output file. @param d Value to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. */ int dk4serialize_file_double(FILE *fipo, double d, dk4_er_t *erp); #ifdef __cplusplus } #endif %% module #include "dk4conf.h" #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STRING_H #ifndef STRING_H_INCLUDED #include #define STRING_H_INCLUDED 1 #endif #endif #include "dk4serf.h" #include "dk4mem.h" #include "dk4mao8dbl.h" #include "dk4enc.h" #include "dk4maasz.h" #include "dk4rec03.h" #include "dk4rec05.h" #include "dk4rec12.h" #include "dk4rec18.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif $!trace-include int dk4serialize_file_uint16_t(FILE *fipo, uint16_t u, dk4_er_t *erp) { unsigned char uc[4]; int back = 0; #if DK4_USE_ASSERT assert(NULL != fipo); #endif if (NULL != fipo) { uc[0] = (unsigned char)((u >> 8) & 0x00FFU); uc[1] = (unsigned char)(u & 0x00FFU); errno = 0; if (2 == fwrite(uc, 1, 2, fipo)) { back = 1; } else { dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_int16_t(FILE *fipo, int16_t i, dk4_er_t *erp) { unsigned char uc[4]; int back = 0; #if DK4_USE_ASSERT assert(NULL != fipo); #endif if (NULL != fipo) { uc[0] = (unsigned char)((((uint16_t)i) >> 8) & 0x00FFU); uc[1] = (unsigned char)(((uint16_t)i) & 0x00FFU); errno = 0; if (2 == fwrite(uc, 1, 2, fipo)) { back = 1; } else { dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_uint32_t(FILE *fipo, uint32_t u, dk4_er_t *erp) { unsigned char uc[4]; int back = 0; #if DK4_USE_ASSERT assert(NULL != fipo); #endif if ((NULL != fipo) && (DK4_U32_MAX >= u)) { uc[0] = (unsigned char)((u >> 24) & 0x000000FFUL); uc[1] = (unsigned char)((u >> 16) & 0x000000FFUL); uc[2] = (unsigned char)((u >> 8) & 0x000000FFUL); uc[3] = (unsigned char)(u & 0x000000FFUL); errno = 0; if (4 == fwrite(uc, 1, 4, fipo)) { back = 1; } else { dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_int32_t(FILE *fipo, int32_t i, dk4_er_t *erp) { unsigned char uc[4]; int back = 0; #if DK4_USE_ASSERT assert(NULL != fipo); #endif if ((NULL != fipo) && (DK4_I32_MAX >= i) && (DK4_I32_MIN <= i)) { uc[0] = (unsigned char)((((uint32_t)i) >> 24) & 0x000000FFUL); uc[1] = (unsigned char)((((uint32_t)i) >> 16) & 0x000000FFUL); uc[2] = (unsigned char)((((uint32_t)i) >> 8) & 0x000000FFUL); uc[3] = (unsigned char)(((uint32_t)i) & 0x000000FFUL); errno = 0; if (4 == fwrite(uc, 1, 4, fipo)) { back = 1; } else { dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_utf8_string(FILE *fipo, const char *str, dk4_er_t *erp) { dk4_er_t er; size_t sz; int back = 0; uint16_t usz; #if DK4_USE_ASSERT assert(NULL != fipo); assert(NULL != str); #endif if ((NULL != fipo) && (NULL != str)) { sz = strlen(str); dk4error_init(&er); sz = dk4ma_size_t_add(sz, 1, &er); if (DK4_E_NONE == er.ec) { if (((dk4_um_t)DK4_U16_MAX) >= ((dk4_um_t)sz)) { usz = (uint16_t)sz; if (0 != dk4serialize_file_uint16_t(fipo, usz, erp)) { errno = 0; if (fwrite(str, 1, usz, fipo) == usz) { back = 1; } else { dk4error_set_idetails(erp, DK4_E_WRITE_FAILED, errno); } } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_double(FILE *fipo, double d, dk4_er_t *erp) { #if 64 > (2 * DK4_DBL_DIGITS) char buffer[64]; #else char buffer[2 * DK4_DBL_DIGITS]; #endif int back = 0; #if DK4_USE_ASSERT assert(NULL != fipo); #endif if (NULL != fipo) { if (0 != dk4ma_write_c8_double(buffer, sizeof(buffer), d, 1, 1, erp)) { back = dk4serialize_file_utf8_string(fipo, buffer, erp); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } int dk4serialize_file_dk_string(FILE *fipo,const dkChar *str,int de,dk4_er_t *erp) { char *tmpbuf = NULL; size_t szbuf = 0; int back = 0; #if DK4_USE_ASSERT assert(NULL != str); assert(NULL != fipo); #endif if ((NULL != fipo) && (NULL != str)) { switch (de) { #if DK4_CHAR_SIZE > 1 #if DK4_CHAR_SIZE > 2 case DK4_ENCODING_32 : { szbuf = dk4recode_size_c32_to_utf8(str, erp); if (0 < szbuf) { tmpbuf = dk4mem_new(char,szbuf,erp); if (NULL != tmpbuf) { if (0 != dk4recode_c32_to_utf8(tmpbuf, szbuf, str, erp)) { back = dk4serialize_file_utf8_string(fipo, tmpbuf, erp); } dk4mem_free(tmpbuf); } } } break; #else case DK4_ENCODING_UTF16 : { szbuf = dk4recode_size_utf16_to_utf8(str, erp); if (0 < szbuf) { tmpbuf = dk4mem_new(char,szbuf,erp); if (NULL != tmpbuf) { if (0 != dk4recode_utf16_to_utf8(tmpbuf, szbuf, str, erp)) { back = dk4serialize_file_utf8_string(fipo, tmpbuf, erp); } dk4mem_free(tmpbuf); } } } break; #endif #else case DK4_ENCODING_PLAIN : { szbuf = dk4recode_size_ascii_to_utf8(str, erp); if (0 < szbuf) { tmpbuf = dk4mem_new(char,szbuf,erp); if (NULL != tmpbuf) { if (0 != dk4recode_ascii_to_utf8(tmpbuf, szbuf, str, erp)) { back = dk4serialize_file_utf8_string(fipo, tmpbuf, erp); } dk4mem_free(tmpbuf); } } } break; case DK4_ENCODING_WIN1252 : { szbuf = dk4recode_size_ansi_to_utf8(str, erp); if (0 < szbuf) { tmpbuf = dk4mem_new(char,szbuf,erp); if (NULL != tmpbuf) { if (0 != dk4recode_ansi_to_utf8(tmpbuf, szbuf, str, erp)) { back = dk4serialize_file_utf8_string(fipo, tmpbuf, erp); } dk4mem_free(tmpbuf); } } } break; case DK4_ENCODING_UTF8 : { back = dk4serialize_file_utf8_string(fipo, str, erp); } break; #endif default : { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }