1*0d5acd74SJohn Marino /* $FreeBSD: head/lib/libc/iconv/citrus_mapper.h 219019 2011-02-25 00:04:39Z gabor $ */
2*0d5acd74SJohn Marino /* $NetBSD: citrus_mapper.h,v 1.3 2003/07/12 15:39:19 tshiozak Exp $ */
32180e8afSJoerg Sonnenberger
42180e8afSJoerg Sonnenberger /*-
52180e8afSJoerg Sonnenberger * Copyright (c)2003 Citrus Project,
62180e8afSJoerg Sonnenberger * All rights reserved.
72180e8afSJoerg Sonnenberger *
82180e8afSJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without
92180e8afSJoerg Sonnenberger * modification, are permitted provided that the following conditions
102180e8afSJoerg Sonnenberger * are met:
112180e8afSJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright
122180e8afSJoerg Sonnenberger * notice, this list of conditions and the following disclaimer.
132180e8afSJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright
142180e8afSJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the
152180e8afSJoerg Sonnenberger * documentation and/or other materials provided with the distribution.
162180e8afSJoerg Sonnenberger *
172180e8afSJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
182180e8afSJoerg Sonnenberger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192180e8afSJoerg Sonnenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202180e8afSJoerg Sonnenberger * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
212180e8afSJoerg Sonnenberger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222180e8afSJoerg Sonnenberger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232180e8afSJoerg Sonnenberger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242180e8afSJoerg Sonnenberger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252180e8afSJoerg Sonnenberger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262180e8afSJoerg Sonnenberger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272180e8afSJoerg Sonnenberger * SUCH DAMAGE.
282180e8afSJoerg Sonnenberger */
292180e8afSJoerg Sonnenberger
302180e8afSJoerg Sonnenberger #ifndef _CITRUS_MAPPER_H_
312180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_H_
322180e8afSJoerg Sonnenberger
332180e8afSJoerg Sonnenberger struct _citrus_mapper_area;
342180e8afSJoerg Sonnenberger struct _citrus_mapper;
352180e8afSJoerg Sonnenberger struct _citrus_mapper_ops;
362180e8afSJoerg Sonnenberger struct _citrus_mapper_traits;
372180e8afSJoerg Sonnenberger
382180e8afSJoerg Sonnenberger __BEGIN_DECLS
392180e8afSJoerg Sonnenberger int _citrus_mapper_create_area(
402180e8afSJoerg Sonnenberger struct _citrus_mapper_area *__restrict *__restrict,
412180e8afSJoerg Sonnenberger const char *__restrict);
422180e8afSJoerg Sonnenberger int _citrus_mapper_open(struct _citrus_mapper_area *__restrict,
432180e8afSJoerg Sonnenberger struct _citrus_mapper *__restrict *__restrict,
442180e8afSJoerg Sonnenberger const char *__restrict);
452180e8afSJoerg Sonnenberger int _citrus_mapper_open_direct(
462180e8afSJoerg Sonnenberger struct _citrus_mapper_area *__restrict,
472180e8afSJoerg Sonnenberger struct _citrus_mapper *__restrict *__restrict,
482180e8afSJoerg Sonnenberger const char *__restrict, const char *__restrict);
492180e8afSJoerg Sonnenberger void _citrus_mapper_close(struct _citrus_mapper *);
502180e8afSJoerg Sonnenberger void _citrus_mapper_set_persistent(struct _citrus_mapper * __restrict);
512180e8afSJoerg Sonnenberger __END_DECLS
522180e8afSJoerg Sonnenberger
532180e8afSJoerg Sonnenberger #include "citrus_mapper_local.h"
542180e8afSJoerg Sonnenberger
552180e8afSJoerg Sonnenberger /* return values of _citrus_mapper_convert */
562180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_SUCCESS (0)
572180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_NONIDENTICAL (1)
582180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_SRC_MORE (2)
592180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_DST_MORE (3)
602180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_ILSEQ (4)
612180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_CONVERT_FATAL (5)
622180e8afSJoerg Sonnenberger
632180e8afSJoerg Sonnenberger /*
642180e8afSJoerg Sonnenberger * _citrus_mapper_convert:
652180e8afSJoerg Sonnenberger * convert an index.
662180e8afSJoerg Sonnenberger * - if the converter supports M:1 converter, the function may return
672180e8afSJoerg Sonnenberger * _CITRUS_MAPPER_CONVERT_SRC_MORE and the storage pointed by dst
682180e8afSJoerg Sonnenberger * may be unchanged in this case, although the internal status of
692180e8afSJoerg Sonnenberger * the mapper is affected.
702180e8afSJoerg Sonnenberger * - if the converter supports 1:N converter, the function may return
712180e8afSJoerg Sonnenberger * _CITRUS_MAPPER_CONVERT_DST_MORE. In this case, the contiguous
722180e8afSJoerg Sonnenberger * call of this function ignores src and changes the storage pointed
732180e8afSJoerg Sonnenberger * by dst.
742180e8afSJoerg Sonnenberger * - if the converter supports M:N converter, the function may behave
752180e8afSJoerg Sonnenberger * the combination of the above.
762180e8afSJoerg Sonnenberger *
772180e8afSJoerg Sonnenberger */
782180e8afSJoerg Sonnenberger static __inline int
_citrus_mapper_convert(struct _citrus_mapper * __restrict cm,_citrus_index_t * __restrict dst,_citrus_index_t src,void * __restrict ps)792180e8afSJoerg Sonnenberger _citrus_mapper_convert(struct _citrus_mapper * __restrict cm,
80*0d5acd74SJohn Marino _citrus_index_t * __restrict dst, _citrus_index_t src,
812180e8afSJoerg Sonnenberger void * __restrict ps)
822180e8afSJoerg Sonnenberger {
832180e8afSJoerg Sonnenberger
84*0d5acd74SJohn Marino return ((*cm->cm_ops->mo_convert)(cm, dst, src, ps));
852180e8afSJoerg Sonnenberger }
862180e8afSJoerg Sonnenberger
872180e8afSJoerg Sonnenberger /*
882180e8afSJoerg Sonnenberger * _citrus_mapper_init_state:
892180e8afSJoerg Sonnenberger * initialize the state.
902180e8afSJoerg Sonnenberger */
912180e8afSJoerg Sonnenberger static __inline void
_citrus_mapper_init_state(struct _citrus_mapper * __restrict cm)92*0d5acd74SJohn Marino _citrus_mapper_init_state(struct _citrus_mapper * __restrict cm)
932180e8afSJoerg Sonnenberger {
942180e8afSJoerg Sonnenberger
95*0d5acd74SJohn Marino (*cm->cm_ops->mo_init_state)();
962180e8afSJoerg Sonnenberger }
972180e8afSJoerg Sonnenberger
982180e8afSJoerg Sonnenberger /*
992180e8afSJoerg Sonnenberger * _citrus_mapper_get_state_size:
1002180e8afSJoerg Sonnenberger * get the size of state storage.
1012180e8afSJoerg Sonnenberger */
1022180e8afSJoerg Sonnenberger static __inline size_t
_citrus_mapper_get_state_size(struct _citrus_mapper * __restrict cm)1032180e8afSJoerg Sonnenberger _citrus_mapper_get_state_size(struct _citrus_mapper * __restrict cm)
1042180e8afSJoerg Sonnenberger {
1052180e8afSJoerg Sonnenberger
106*0d5acd74SJohn Marino return (cm->cm_traits->mt_state_size);
1072180e8afSJoerg Sonnenberger }
1082180e8afSJoerg Sonnenberger
1092180e8afSJoerg Sonnenberger /*
1102180e8afSJoerg Sonnenberger * _citrus_mapper_get_src_max:
1112180e8afSJoerg Sonnenberger * get the maximum number of suspended sources.
1122180e8afSJoerg Sonnenberger */
1132180e8afSJoerg Sonnenberger static __inline size_t
_citrus_mapper_get_src_max(struct _citrus_mapper * __restrict cm)1142180e8afSJoerg Sonnenberger _citrus_mapper_get_src_max(struct _citrus_mapper * __restrict cm)
1152180e8afSJoerg Sonnenberger {
1162180e8afSJoerg Sonnenberger
117*0d5acd74SJohn Marino return (cm->cm_traits->mt_src_max);
1182180e8afSJoerg Sonnenberger }
1192180e8afSJoerg Sonnenberger
1202180e8afSJoerg Sonnenberger /*
1212180e8afSJoerg Sonnenberger * _citrus_mapper_get_dst_max:
1222180e8afSJoerg Sonnenberger * get the maximum number of suspended destinations.
1232180e8afSJoerg Sonnenberger */
1242180e8afSJoerg Sonnenberger static __inline size_t
_citrus_mapper_get_dst_max(struct _citrus_mapper * __restrict cm)1252180e8afSJoerg Sonnenberger _citrus_mapper_get_dst_max(struct _citrus_mapper * __restrict cm)
1262180e8afSJoerg Sonnenberger {
1272180e8afSJoerg Sonnenberger
128*0d5acd74SJohn Marino return (cm->cm_traits->mt_dst_max);
1292180e8afSJoerg Sonnenberger }
1302180e8afSJoerg Sonnenberger
1312180e8afSJoerg Sonnenberger #endif
132