Sync Citrus iconv support with NetBSD.
[dragonfly.git] / lib / libc / citrus / modules / citrus_iconv_none.c
1 /* $NetBSD: src/lib/libc/citrus/modules/citrus_iconv_none.c,v 1.2 2003/07/01 09:42:16 tshiozak Exp $ */
2 /* $DragonFly: src/lib/libc/citrus/modules/citrus_iconv_none.c,v 1.2 2008/04/10 10:21:01 hasso Exp $ */
3
4 /*-
5  * Copyright (c)2003 Citrus Project,
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include <sys/types.h>
31 #include <sys/queue.h>
32 #include <assert.h>
33 #include <errno.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "citrus_types.h"
38 #include "citrus_module.h"
39 #include "citrus_hash.h"
40 #include "citrus_iconv.h"
41 #include "citrus_iconv_none.h"
42
43 /* ---------------------------------------------------------------------- */
44
45 _CITRUS_ICONV_DECLS(iconv_none);
46 _CITRUS_ICONV_DEF_OPS(iconv_none);
47
48
49 /* ---------------------------------------------------------------------- */
50
51 int
52 _citrus_iconv_none_iconv_getops(struct _citrus_iconv_ops *ops, size_t lenops,
53                                 uint32_t expected_version)
54 {
55         if (expected_version<_CITRUS_ICONV_ABI_VERSION || lenops<sizeof(*ops))
56                 return (EINVAL);
57
58         memcpy(ops, &_citrus_iconv_none_iconv_ops,
59                sizeof(_citrus_iconv_none_iconv_ops));
60
61         return (0);
62 }
63
64 static int
65 /*ARGSUSED*/
66 _citrus_iconv_none_iconv_init_shared(
67         struct _citrus_iconv_shared * __restrict ci,
68         const char * __restrict curdir,
69         const char * __restrict in, const char * __restrict out,
70         const void * __restrict var, size_t lenvar)
71 {
72         ci->ci_closure = NULL;
73         return 0;
74 }
75
76 static void
77 /*ARGSUSED*/
78 _citrus_iconv_none_iconv_uninit_shared(struct _citrus_iconv_shared *ci)
79 {
80 }
81
82 static int
83 /*ARGSUSED*/
84 _citrus_iconv_none_iconv_init_context(struct _citrus_iconv *cv)
85 {
86         cv->cv_closure = NULL;
87 }
88
89 static void
90 /*ARGSUSED*/
91 _citrus_iconv_none_iconv_uninit_context(struct _citrus_iconv *cv)
92 {
93 }
94
95 static int
96 /*ARGSUSED*/
97 _citrus_iconv_none_iconv_convert(struct _citrus_iconv * __restrict ci,
98                                  const char * __restrict * __restrict in,
99                                  size_t * __restrict inbytes,
100                                  char * __restrict * __restrict out,
101                                  size_t * __restrict outbytes,
102                                  u_int32_t flags, size_t * __restrict invalids)
103 {
104         int e2big;
105         size_t len;
106
107         len = *inbytes;
108         e2big = 0;
109         if (*outbytes<len) {
110                 e2big = 1;
111                 len = *outbytes;
112         }
113         memcpy(*out, *in, len);
114         in += len;
115         *inbytes -= len;
116         out+=len;
117         *outbytes -= len;
118         *invalids = 0;
119         if (e2big) {
120                 return (E2BIG);
121         }
122
123         return (0);
124 }