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