%% options
copyright owner = Dirk Krause
copyright year = 2015-xxxx
license = bsd
%% header
/** @file
String output over dk4_stream_t API,
8 bit character strings.
CRT on Windows: Not used.
*/
#include "dk4strm.h"
#ifdef __cplusplus
extern "C" {
#endif
/** Write 8 bit character string to stream.
@param strm Stream to write to.
@param txt Text to write.
@param ie Input encoding.
@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 opened for writing,
- DK4_E_SYNTAX
if ie does not indicate an 8 bit encoding,
- DK4_E_DECODING_FAILED
if input decoding failed,
- DK4_E_WRITE_FAILED
if writing one ore multiple bytes to the stream failed,
- DK4_E_FLUSH_FAILED
if flusing data downwards failed.
*/
int
dk4stream_c08_puts(dk4_stream_t *strm, const char *txt, int ie, dk4_er_t *erp);
#ifdef __cplusplus
}
#endif
%% module
#include "dk4strm.h"
#include "dk4strmo32.h"
#include "dk4enc.h"
#include "dk4ansi.h"
#include "dk4utf8.h"
int
dk4stream_c08_puts(dk4_stream_t *strm, const char *txt, int ie, dk4_er_t *erp)
{
dk4_utf8_decoder_t dec;
dk4_c32_t c32;
int back = 0;
char c;
unsigned char uc;
if ((NULL != strm) && (NULL != txt)) {
if (0 != ((strm->fl) & DK4_STREAM_WRITE)) {
switch (ie) {
case DK4_ENCODING_ASCII:
case DK4_ENCODING_ANSI:
case DK4_ENCODING_UTF8:
{
if (strm->oenc == ie) {
back = 1;
while (('\0' != *txt) && (1 == back)) {
if (0 == dk4stream_write_byte(strm, *(txt++), erp)) {
back = 0;
}
}
} else {
switch (ie) {
case DK4_ENCODING_ASCII: {
back = 1;
while (('\0' != *txt) && (1 == back)) {
c = *(txt++);
uc = (unsigned char)c;
c32 = (dk4_c32_t)uc;
if (0 == dk4stream_c32_putc(strm, c32, erp)) {
back = 0;
}
}
} break;
case DK4_ENCODING_ANSI: {
back = 1;
while (('\0' != *txt) && (1 == back)) {
if (0 != dk4ansi_decode(&c32, (unsigned char)(*(txt++)))) {
if (0 == dk4stream_c32_putc(strm, c32, erp)) {
back = 0;
}
} else {
back = 0;
dk4error_set_simple_error_code(erp, DK4_E_DECODING_FAILED);
}
}
} break;
case DK4_ENCODING_UTF8: {
back = 1;
dk4utf8_init(&dec);
while (('\0' != *txt) && (1 == back)) {
switch (dk4utf8_add(&dec, (unsigned char)(*(txt++)))) {
case DK4_EDSTM_FINISHED: {
c32 = dk4utf8_get(&dec);
dk4utf8_init(&dec);
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 == dk4utf8_is_empty(&dec)) {
back = 0;
dk4error_set_simple_error_code(erp, DK4_E_DECODING_FAILED);
}
} break;
}
}
} break;
default: {
dk4error_set_simple_error_code(erp, DK4_E_SYNTAX);
} 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;
}