/* Copyright (C) 2015-2021, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4strmo08.ctr */ /** @file dk4strmo08.c The dk4strmo08 module. */ #include "dk4conf.h" #include #include #include #include #include #include #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif 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 DK4_USE_ASSERT assert(NULL != strm); assert(NULL != txt); #endif if ((NULL != strm) && (NULL != txt)) { if (0 != ((strm->fl) & DK4_STREAM_WRITE)) { switch (ie) { case DK4_ENCODING_PLAIN: case DK4_ENCODING_WIN1252: 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_PLAIN: { 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_WIN1252: { 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; }