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: dk4rec19.ctr
12 */
13 
14 /**	@file dk4rec19.c The dk4rec19 module.
15 */
16 
17 
18 #include "dk4conf.h"
19 #include <libdk4c/dk4rec19.h>
20 #include <libdk4c/dk4utf16.h>
21 
22 #if	DK4_HAVE_ASSERT_H
23 #ifndef	ASSERT_H_INCLUDED
24 #include <assert.h>
25 #define	ASSERT_H_INCLUDED 1
26 #endif
27 #endif
28 
29 
30 int
dk4recode_utf16_to_c32(dk4_c32_t * dstb,size_t szdstb,const dk4_c16_t * src,dk4_er_t * erp)31 dk4recode_utf16_to_c32(
32   dk4_c32_t *dstb, size_t szdstb, const dk4_c16_t *src, dk4_er_t *erp
33 )
34 {
35   dk4_utf16_decoder_t	 dec;
36   size_t		 used	=	0;
37   size_t		 rd	=	0;
38   dk4_c32_t		 c32	=	dkC32(0);
39   int			 back	=	0;
40 
41 #if	DK4_USE_ASSERT
42   assert(NULL != dstb);
43   assert(0 < szdstb);
44   assert(NULL != src);
45 #endif
46   if ((NULL != dstb) && (NULL != src) && (0 < szdstb)) {
47     back = 1;
48     dk4utf16_init(&dec);
49     while(((dk4_c16_t)0U != *src) && (1 == back) && (used < szdstb)) {
50       switch(dk4utf16_add(&dec, *(src++))) {
51         case DK4_EDSTM_FINISHED: {
52 	  c32 = dk4utf16_get(&dec);
53 	  dk4utf16_init(&dec);
54 	  dstb[used++] = c32;
55 	} break;
56 	case DK4_EDSTM_ERROR: {
57 	  back = 0;
58 	  dk4error_set_elsize_nelem(erp, DK4_E_SYNTAX, 2, rd);
59 	} break;
60       }
61       if (0 != back) { rd++; }
62     }
63     if (used < szdstb) {
64       dstb[used] = '\0';
65     } else {
66       dstb[szdstb - 1] = '\0';
67       back = 0;
68       dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL);
69     }
70     if (0 == dk4utf16_is_empty(&dec)) {
71       back = 0;
72       dk4error_set_elsize_nelem(erp, DK4_E_SYNTAX, 2, rd);
73     }
74   } else {
75     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
76   }
77   return back;
78 }
79 
80