%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file String output over dk4_stream_t API, 16 bit character strings. CRT on Windows: Not used. */ #include "dk4conf.h" #include "dk4types.h" #include "dk4strm.h" #ifdef __cplusplus extern "C" { #endif /** Write one 32 bit character string to stream. @param strm Stream to write to. @param txt Text string to write. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if strm is null or not set up for writing, - DK4_E_ENCODING_FAILED
if it is not possible to encode c32 to the output encoding for the stream, - DK4_E_WRITE_FAILED
if writing one ore multiple bytes to the stream failed, - DK4_E_FLUSH_FAILED
if flushing data downwards failed. */ int dk4stream_c16_puts(dk4_stream_t *strm, const dk4_c16_t *txt, dk4_er_t *erp); #ifdef __cplusplus } #endif %% module #include "dk4strmo16.h" #include "dk4strmo32.h" #include "dk4enc.h" #include "dk4utf16.h" int dk4stream_c16_puts(dk4_stream_t *strm, const dk4_c16_t *txt, dk4_er_t *erp) { dk4_utf16_decoder_t enc; dk4_c16_t c16; dk4_c32_t c32; int back = 0; char c8; if ((NULL != strm) && (NULL != txt)) { if (0 != ((strm->fl) & DK4_STREAM_WRITE)) { switch (strm->oenc) { case DK4_FILE_ENCODING_UTF16_LE: case DK4_FILE_ENCODING_UTF16_BE: { back = 1; while((0 != *txt) && (1 == back)) { c16 = *(txt++); if (DK4_FILE_ENCODING_UTF16_LE == strm->oenc) { c8 = (char)(c16 & 0x00FF); if (0 == dk4stream_write_byte(strm, c8, erp)) { back = 0; } else { c8 = (char)((c16 >> 8) & 0x00FF); if (0 == dk4stream_write_byte(strm, c8, erp)) { back = 0; } } } else { c8 = (char)((c16 >> 8) & 0x00FF); if (0 == dk4stream_write_byte(strm, c8, erp)) { back = 0; } else { c8 = (char)(c16 & 0x00FF); if (0 == dk4stream_write_byte(strm, c8, erp)) { back = 0; } } } } } break; default: { back = 1; dk4utf16_init(&enc); while((0 != *txt) && (1 == back)) { switch (dk4utf16_add(&enc, *(txt++))) { case DK4_EDSTM_FINISHED: { c32 = dk4utf16_get(&enc); dk4utf16_init(&enc); if (0 == dk4stream_c32_putc(strm, c32, erp)) { back = 0; } } break; case DK4_EDSTM_ERROR: { back = 0; dk4error_set_simple_error_code(erp,DK4_E_DECODING_FAILED); } break; } } if (0 == dk4utf16_is_empty(&enc)) { back = 0; dk4error_set_simple_error_code(erp,DK4_E_DECODING_FAILED); } } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }