/* Copyright (C) 2015-2020, 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: dk4strmo16.ctr */ /** @file dk4strmo16.c The dk4strmo16 module. */ #line 74 "dk4strmo16.ctr" #include "dk4conf.h" #include "dk4strmo16.h" #include "dk4strmo32.h" #include "dk4enc.h" #include "dk4utf16.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif 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 DK4_USE_ASSERT assert(NULL != strm); assert(NULL != txt); #endif 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; }