1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: dk4rec18.ctr
12 */
13
14 /** @file dk4rec18.c The dk4rec18 module.
15 */
16
17
18 #include "dk4conf.h"
19 #include <libdk4c/dk4rec18.h>
20 #include <libdk4base/dk4mem.h>
21 #include <libdk4c/dk4utf8.h>
22
23 #if DK4_HAVE_ASSERT_H
24 #ifndef ASSERT_H_INCLUDED
25 #include <assert.h>
26 #define ASSERT_H_INCLUDED 1
27 #endif
28 #endif
29
30
31
32
33
34
35 size_t
dk4recode_size_c32_to_utf8(const dk4_c32_t * src,dk4_er_t * erp)36 dk4recode_size_c32_to_utf8(const dk4_c32_t *src, dk4_er_t *erp)
37 {
38 dk4_er_t er;
39 unsigned char buf[8];
40 size_t sz;
41 size_t rd = 0;
42 size_t back = 0;
43 dk4_c32_t c32 = dkC32(0);
44 #if DK4_USE_ASSERT
45 assert(NULL != src);
46 #endif
47 if (NULL != src) {
48 dk4error_init(&er);
49 while (dkC32(0) != (c32 = *(src++))) {
50 sz = sizeof(buf);
51 if (0 != dk4utf8_encode(buf, &sz, c32, &er)) {
52 if ((SIZE_MAX - sz) >= back) {
53 back += sz;
54 rd++;
55 } else {
56 dk4error_set_simple_error_code(&er, DK4_E_MATH_OVERFLOW);
57 }
58 }
59 }
60 if (SIZE_MAX > back) {
61 back++;
62 } else {
63 dk4error_set_simple_error_code(&er, DK4_E_MATH_OVERFLOW);
64 }
65 if (DK4_E_NONE != er.ec) {
66 back = 0;
67 dk4error_copy(erp, &er);
68 }
69 } else {
70 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
71 }
72 return back;
73 }
74
75
76
77 int
dk4recode_c32_to_utf8(char * dstb,size_t szdstb,const dk4_c32_t * src,dk4_er_t * erp)78 dk4recode_c32_to_utf8(
79 char *dstb, size_t szdstb, const dk4_c32_t *src, dk4_er_t *erp
80 )
81 {
82 unsigned char buf[8];
83 size_t sz;
84 size_t rd = 0;
85 size_t used = 0;
86 dk4_c32_t c32 = dkC32(0);
87 int back = 0;
88 #if DK4_USE_ASSERT
89 assert(NULL != dstb);
90 assert(0 < szdstb);
91 assert(NULL != src);
92 #endif
93 if ((NULL != dstb) && (0 < szdstb) && (NULL != src)) {
94 back = 1;
95 while((dkC32(0) != *src) && (1 == back) && (used < szdstb)) {
96 c32 = *(src++);
97 sz = sizeof(buf);
98 if (0 != dk4utf8_encode(buf, &sz, c32, erp)) {
99 if ((szdstb - used) > sz) {
100 DK4_MEMCPY(&(dstb[used]),buf,sz);
101 used += sz;
102 } else {
103 back = 0;
104 dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL);
105 }
106 } else {
107 back = 0;
108 dk4error_set_elsize_nelem(erp, DK4_E_SYNTAX, 4, rd);
109 }
110 if (0 != back) { rd++; }
111 }
112 if (used < szdstb) {
113 dstb[used] = '\0';
114 } else {
115 dstb[szdstb - 1] = '\0';
116 back = 0;
117 dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL);
118 }
119 } else {
120 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
121 }
122 return back;
123 }
124
125
126