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