%% 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;
}