1219019Sgabor/* $FreeBSD$ */
2219019Sgabor/* $NetBSD: citrus_stdenc.h,v 1.4 2005/10/29 18:02:04 tshiozak 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_H_
32219019Sgabor#define _CITRUS_STDENC_H_
33219019Sgabor
34219019Sgaborstruct _citrus_stdenc;
35219019Sgaborstruct _citrus_stdenc_ops;
36219019Sgaborstruct _citrus_stdenc_traits;
37219019Sgabor
38219019Sgabor#define _CITRUS_STDENC_SDID_GENERIC		0
39219019Sgaborstruct _citrus_stdenc_state_desc
40219019Sgabor{
41219019Sgabor	union {
42219019Sgabor		struct {
43219019Sgabor			int	state;
44219019Sgabor#define _CITRUS_STDENC_SDGEN_UNKNOWN		0
45219019Sgabor#define _CITRUS_STDENC_SDGEN_INITIAL		1
46219019Sgabor#define _CITRUS_STDENC_SDGEN_STABLE		2
47219019Sgabor#define _CITRUS_STDENC_SDGEN_INCOMPLETE_CHAR	3
48219019Sgabor#define _CITRUS_STDENC_SDGEN_INCOMPLETE_SHIFT	4
49219019Sgabor		} generic;
50219019Sgabor	} u;
51219019Sgabor};
52219019Sgabor
53219019Sgabor#include "citrus_stdenc_local.h"
54219019Sgabor
55219019Sgabor__BEGIN_DECLS
56219019Sgaborint	 _citrus_stdenc_open(struct _citrus_stdenc * __restrict * __restrict,
57219019Sgabor	    char const * __restrict, const void * __restrict, size_t);
58219019Sgaborvoid	 _citrus_stdenc_close(struct _citrus_stdenc *);
59219019Sgabor__END_DECLS
60219019Sgabor
61219019Sgaborstatic __inline int
62219019Sgabor_citrus_stdenc_init_state(struct _citrus_stdenc * __restrict ce,
63219019Sgabor    void * __restrict ps)
64219019Sgabor{
65219019Sgabor
66219019Sgabor	return ((*ce->ce_ops->eo_init_state)(ce, ps));
67219019Sgabor}
68219019Sgabor
69219019Sgaborstatic __inline int
70219019Sgabor_citrus_stdenc_mbtocs(struct _citrus_stdenc * __restrict ce,
71219019Sgabor    _citrus_csid_t * __restrict csid, _citrus_index_t * __restrict idx,
72252583Speter    const char ** __restrict s, size_t n, void * __restrict ps,
73219019Sgabor    size_t * __restrict nresult, struct iconv_hooks *hooks)
74219019Sgabor{
75219019Sgabor
76219019Sgabor	return ((*ce->ce_ops->eo_mbtocs)(ce, csid, idx, s, n, ps, nresult,
77219019Sgabor	    hooks));
78219019Sgabor}
79219019Sgabor
80219019Sgaborstatic __inline int
81219019Sgabor_citrus_stdenc_cstomb(struct _citrus_stdenc * __restrict ce,
82219019Sgabor    char * __restrict s, size_t n, _citrus_csid_t csid, _citrus_index_t idx,
83219019Sgabor    void * __restrict ps, size_t * __restrict nresult,
84219019Sgabor    struct iconv_hooks *hooks)
85219019Sgabor{
86219019Sgabor
87219019Sgabor	return ((*ce->ce_ops->eo_cstomb)(ce, s, n, csid, idx, ps, nresult,
88219019Sgabor	    hooks));
89219019Sgabor}
90219019Sgabor
91219019Sgaborstatic __inline int
92219019Sgabor_citrus_stdenc_wctomb(struct _citrus_stdenc * __restrict ce,
93219019Sgabor    char * __restrict s, size_t n, _citrus_wc_t wc, void * __restrict ps,
94219019Sgabor    size_t * __restrict nresult, struct iconv_hooks *hooks)
95219019Sgabor{
96219019Sgabor
97219019Sgabor	return ((*ce->ce_ops->eo_wctomb)(ce, s, n, wc, ps, nresult, hooks));
98219019Sgabor}
99219019Sgabor
100219019Sgaborstatic __inline int
101219019Sgabor_citrus_stdenc_put_state_reset(struct _citrus_stdenc * __restrict ce,
102219019Sgabor    char * __restrict s, size_t n, void * __restrict ps,
103219019Sgabor    size_t * __restrict nresult)
104219019Sgabor{
105219019Sgabor
106219019Sgabor	return ((*ce->ce_ops->eo_put_state_reset)(ce, s, n, ps, nresult));
107219019Sgabor}
108219019Sgabor
109219019Sgaborstatic __inline size_t
110219019Sgabor_citrus_stdenc_get_state_size(struct _citrus_stdenc *ce)
111219019Sgabor{
112219019Sgabor
113219019Sgabor	return (ce->ce_traits->et_state_size);
114219019Sgabor}
115219019Sgabor
116219019Sgaborstatic __inline int
117219019Sgabor_citrus_stdenc_get_state_desc(struct _citrus_stdenc * __restrict ce,
118219019Sgabor    void * __restrict ps, int id,
119219019Sgabor    struct _citrus_stdenc_state_desc * __restrict d)
120219019Sgabor{
121219019Sgabor
122219019Sgabor	return ((*ce->ce_ops->eo_get_state_desc)(ce, ps, id, d));
123219019Sgabor}
124219019Sgabor#endif
125