1219019Sgabor/* $FreeBSD$ */
2219019Sgabor/* $NetBSD: citrus_stdenc_local.h,v 1.4 2008/02/09 14:56:20 junyoung Exp $ */
3219019Sgabor
4219019Sgabor/*-
5219019Sgabor * Copyright (c)2003 Citrus Project,
6219019Sgabor * All rights reserved.
7219019Sgabor *
8219019Sgabor * Redistribution and use in source and binary forms, with or without
9219019Sgabor * modification, are permitted provided that the following conditions
10219019Sgabor * are met:
11219019Sgabor * 1. Redistributions of source code must retain the above copyright
12219019Sgabor *    notice, this list of conditions and the following disclaimer.
13219019Sgabor * 2. Redistributions in binary form must reproduce the above copyright
14219019Sgabor *    notice, this list of conditions and the following disclaimer in the
15219019Sgabor *    documentation and/or other materials provided with the distribution.
16219019Sgabor *
17219019Sgabor * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18219019Sgabor * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19219019Sgabor * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20219019Sgabor * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21219019Sgabor * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22219019Sgabor * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23219019Sgabor * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24219019Sgabor * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25219019Sgabor * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26219019Sgabor * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27219019Sgabor * SUCH DAMAGE.
28219019Sgabor *
29219019Sgabor */
30219019Sgabor
31219019Sgabor#ifndef _CITRUS_STDENC_LOCAL_H_
32219019Sgabor#define _CITRUS_STDENC_LOCAL_H_
33219019Sgabor
34219019Sgabor#include <iconv.h>
35219019Sgabor
36219019Sgabor#include "citrus_module.h"
37219019Sgabor
38219019Sgabor#define _CITRUS_STDENC_GETOPS_FUNC_BASE(n)			\
39219019Sgabor   int n(struct _citrus_stdenc_ops *, size_t)
40219019Sgabor#define _CITRUS_STDENC_GETOPS_FUNC(_e_)					\
41219019Sgabor   _CITRUS_STDENC_GETOPS_FUNC_BASE(_citrus_##_e_##_stdenc_getops)
42219019Sgabortypedef _CITRUS_STDENC_GETOPS_FUNC_BASE((*_citrus_stdenc_getops_t));
43219019Sgabor
44219019Sgabor
45219019Sgabor#define _CITRUS_STDENC_DECLS(_e_)					\
46219019Sgaborstatic int	 _citrus_##_e_##_stdenc_init				\
47219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
48219019Sgabor		    const void * __restrict, size_t,			\
49219019Sgabor		    struct _citrus_stdenc_traits * __restrict);		\
50219019Sgaborstatic void	 _citrus_##_e_##_stdenc_uninit(struct _citrus_stdenc *);\
51219019Sgaborstatic int	 _citrus_##_e_##_stdenc_init_state			\
52219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
53219019Sgabor		    void * __restrict);					\
54219019Sgaborstatic int	 _citrus_##_e_##_stdenc_mbtocs				\
55219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
56219019Sgabor		    _citrus_csid_t * __restrict,			\
57219019Sgabor		    _citrus_index_t * __restrict,			\
58219019Sgabor		    char ** __restrict, size_t,				\
59219019Sgabor		    void * __restrict, size_t * __restrict,		\
60219019Sgabor		    struct iconv_hooks *);				\
61219019Sgaborstatic int	 _citrus_##_e_##_stdenc_cstomb				\
62219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
63219019Sgabor		    char * __restrict, size_t, _citrus_csid_t,		\
64219019Sgabor		    _citrus_index_t, void * __restrict,			\
65219019Sgabor		    size_t * __restrict, struct iconv_hooks *);		\
66219019Sgaborstatic int	 _citrus_##_e_##_stdenc_mbtowc				\
67219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
68219019Sgabor		    _citrus_wc_t * __restrict,				\
69219019Sgabor		    char ** __restrict, size_t,				\
70219019Sgabor		    void * __restrict, size_t * __restrict,		\
71219019Sgabor		    struct iconv_hooks *);				\
72219019Sgaborstatic int	 _citrus_##_e_##_stdenc_wctomb				\
73219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
74219019Sgabor		    char * __restrict, size_t, _citrus_wc_t,		\
75219019Sgabor		    void * __restrict, size_t * __restrict,		\
76219019Sgabor		    struct iconv_hooks *);				\
77219019Sgaborstatic int	 _citrus_##_e_##_stdenc_put_state_reset			\
78219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
79219019Sgabor		    char * __restrict, size_t, void * __restrict,	\
80219019Sgabor		    size_t * __restrict);				\
81219019Sgaborstatic int	 _citrus_##_e_##_stdenc_get_state_desc			\
82219019Sgabor		    (struct _citrus_stdenc * __restrict,		\
83219019Sgabor		    void * __restrict, int,				\
84219019Sgabor		    struct _citrus_stdenc_state_desc * __restrict)
85219019Sgabor
86219019Sgabor#define _CITRUS_STDENC_DEF_OPS(_e_)					\
87219019Sgaborstruct _citrus_stdenc_ops _citrus_##_e_##_stdenc_ops = {		\
88219019Sgabor	/* eo_init */		&_citrus_##_e_##_stdenc_init,		\
89219019Sgabor	/* eo_uninit */		&_citrus_##_e_##_stdenc_uninit,		\
90219019Sgabor	/* eo_init_state */	&_citrus_##_e_##_stdenc_init_state,	\
91219019Sgabor	/* eo_mbtocs */		&_citrus_##_e_##_stdenc_mbtocs,		\
92219019Sgabor	/* eo_cstomb */		&_citrus_##_e_##_stdenc_cstomb,		\
93219019Sgabor	/* eo_mbtowc */		&_citrus_##_e_##_stdenc_mbtowc,		\
94219019Sgabor	/* eo_wctomb */		&_citrus_##_e_##_stdenc_wctomb,		\
95219019Sgabor	/* eo_put_state_reset */&_citrus_##_e_##_stdenc_put_state_reset,\
96219019Sgabor	/* eo_get_state_desc */	&_citrus_##_e_##_stdenc_get_state_desc	\
97219019Sgabor}
98219019Sgabor
99219019Sgabortypedef int (*_citrus_stdenc_init_t)
100219019Sgabor    (struct _citrus_stdenc * __reatrict, const void * __restrict , size_t,
101219019Sgabor    struct _citrus_stdenc_traits * __restrict);
102219019Sgabortypedef void (*_citrus_stdenc_uninit_t)(struct _citrus_stdenc * __restrict);
103219019Sgabortypedef int (*_citrus_stdenc_init_state_t)
104219019Sgabor    (struct _citrus_stdenc * __restrict, void * __restrict);
105219019Sgabortypedef int (*_citrus_stdenc_mbtocs_t)
106219019Sgabor    (struct _citrus_stdenc * __restrict,
107219019Sgabor    _citrus_csid_t * __restrict, _citrus_index_t * __restrict,
108219019Sgabor    char ** __restrict, size_t,
109219019Sgabor    void * __restrict, size_t * __restrict,
110219019Sgabor    struct iconv_hooks *);
111219019Sgabortypedef int (*_citrus_stdenc_cstomb_t)
112219019Sgabor    (struct _citrus_stdenc *__restrict, char * __restrict, size_t,
113219019Sgabor    _citrus_csid_t, _citrus_index_t, void * __restrict,
114219019Sgabor    size_t * __restrict, struct iconv_hooks *);
115219019Sgabortypedef int (*_citrus_stdenc_mbtowc_t)
116219019Sgabor    (struct _citrus_stdenc * __restrict,
117219019Sgabor    _citrus_wc_t * __restrict,
118219019Sgabor    char ** __restrict, size_t,
119219019Sgabor    void * __restrict, size_t * __restrict,
120219019Sgabor    struct iconv_hooks *);
121219019Sgabortypedef int (*_citrus_stdenc_wctomb_t)
122219019Sgabor    (struct _citrus_stdenc *__restrict, char * __restrict, size_t,
123219019Sgabor    _citrus_wc_t, void * __restrict, size_t * __restrict,
124219019Sgabor    struct iconv_hooks *);
125219019Sgabortypedef int (*_citrus_stdenc_put_state_reset_t)
126219019Sgabor    (struct _citrus_stdenc *__restrict, char * __restrict, size_t,
127219019Sgabor    void * __restrict, size_t * __restrict);
128219019Sgabortypedef int (*_citrus_stdenc_get_state_desc_t)
129219019Sgabor    (struct _citrus_stdenc * __restrict, void * __restrict, int,
130219019Sgabor    struct _citrus_stdenc_state_desc * __restrict);
131219019Sgabor
132219019Sgaborstruct _citrus_stdenc_ops {
133219019Sgabor	_citrus_stdenc_init_t		eo_init;
134219019Sgabor	_citrus_stdenc_uninit_t		eo_uninit;
135219019Sgabor	_citrus_stdenc_init_state_t	eo_init_state;
136219019Sgabor	_citrus_stdenc_mbtocs_t		eo_mbtocs;
137219019Sgabor	_citrus_stdenc_cstomb_t		eo_cstomb;
138219019Sgabor	_citrus_stdenc_mbtowc_t		eo_mbtowc;
139219019Sgabor	_citrus_stdenc_wctomb_t		eo_wctomb;
140219019Sgabor	_citrus_stdenc_put_state_reset_t eo_put_state_reset;
141219019Sgabor	/* version 0x00000002 */
142219019Sgabor	_citrus_stdenc_get_state_desc_t	eo_get_state_desc;
143219019Sgabor};
144219019Sgabor
145219019Sgaborstruct _citrus_stdenc_traits {
146219019Sgabor	/* version 0x00000001 */
147219019Sgabor	size_t				 et_state_size;
148219019Sgabor	size_t				 et_mb_cur_max;
149219019Sgabor};
150219019Sgabor
151219019Sgaborstruct _citrus_stdenc {
152219019Sgabor	/* version 0x00000001 */
153219019Sgabor	struct _citrus_stdenc_ops	*ce_ops;
154219019Sgabor	void				*ce_closure;
155219019Sgabor	_citrus_module_t		 ce_module;
156219019Sgabor	struct _citrus_stdenc_traits	*ce_traits;
157219019Sgabor};
158219019Sgabor
159219019Sgabor#define _CITRUS_DEFAULT_STDENC_NAME		"NONE"
160219019Sgabor
161219019Sgabor#endif
162