1*0d5acd74SJohn Marino /* $FreeBSD: head/lib/libc/iconv/citrus_mapper_local.h 250938 2013-05-23 18:07:01Z ed $ */
252347f71SHasso Tepper /* $NetBSD: citrus_mapper_local.h,v 1.2 2008/02/09 14:56:20 junyoung 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_LOCAL_H_
312180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_LOCAL_H_
322180e8afSJoerg Sonnenberger 
332180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_GETOPS_FUNC_BASE(_n_)				\
34*0d5acd74SJohn Marino int _n_(struct _citrus_mapper_ops *)
352180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_GETOPS_FUNC(_n_)					\
362180e8afSJoerg Sonnenberger _CITRUS_MAPPER_GETOPS_FUNC_BASE(_citrus_##_n_##_mapper_getops)
372180e8afSJoerg Sonnenberger 
382180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_DECLS(_m_)					\
392180e8afSJoerg Sonnenberger static int	 _citrus_##_m_##_mapper_init				\
402180e8afSJoerg Sonnenberger 		    (struct _citrus_mapper_area *__restrict,		\
41*0d5acd74SJohn Marino 		    struct _citrus_mapper * __restrict,			\
42*0d5acd74SJohn Marino 		    const char * __restrict, const void * __restrict,	\
43*0d5acd74SJohn Marino 		    size_t, struct _citrus_mapper_traits * __restrict,	\
44*0d5acd74SJohn Marino 		    size_t);						\
45*0d5acd74SJohn Marino static void	 _citrus_##_m_##_mapper_uninit(				\
46*0d5acd74SJohn Marino 		    struct _citrus_mapper *);				\
472180e8afSJoerg Sonnenberger static int	 _citrus_##_m_##_mapper_convert				\
482180e8afSJoerg Sonnenberger 		    (struct _citrus_mapper * __restrict,		\
492180e8afSJoerg Sonnenberger 		    _citrus_index_t * __restrict, _citrus_index_t,	\
502180e8afSJoerg Sonnenberger 		    void * __restrict);					\
512180e8afSJoerg Sonnenberger static void	 _citrus_##_m_##_mapper_init_state			\
52*0d5acd74SJohn Marino 		    (void);
532180e8afSJoerg Sonnenberger 
542180e8afSJoerg Sonnenberger #define _CITRUS_MAPPER_DEF_OPS(_m_)					\
55*0d5acd74SJohn Marino extern struct _citrus_mapper_ops _citrus_##_m_##_mapper_ops;		\
562180e8afSJoerg Sonnenberger struct _citrus_mapper_ops _citrus_##_m_##_mapper_ops = {		\
572180e8afSJoerg Sonnenberger 	/* mo_init */		&_citrus_##_m_##_mapper_init,		\
582180e8afSJoerg Sonnenberger 	/* mo_uninit */		&_citrus_##_m_##_mapper_uninit,		\
592180e8afSJoerg Sonnenberger 	/* mo_convert */	&_citrus_##_m_##_mapper_convert,	\
602180e8afSJoerg Sonnenberger 	/* mo_init_state */	&_citrus_##_m_##_mapper_init_state	\
612180e8afSJoerg Sonnenberger }
622180e8afSJoerg Sonnenberger 
632180e8afSJoerg Sonnenberger typedef _CITRUS_MAPPER_GETOPS_FUNC_BASE((*_citrus_mapper_getops_t));
642180e8afSJoerg Sonnenberger typedef	int (*_citrus_mapper_init_t)(
652180e8afSJoerg Sonnenberger     struct _citrus_mapper_area *__restrict,
662180e8afSJoerg Sonnenberger     struct _citrus_mapper *__restrict, const char *__restrict,
672180e8afSJoerg Sonnenberger     const void *__restrict, size_t,
682180e8afSJoerg Sonnenberger     struct _citrus_mapper_traits * __restrict, size_t);
692180e8afSJoerg Sonnenberger typedef void (*_citrus_mapper_uninit_t)(struct _citrus_mapper *);
702180e8afSJoerg Sonnenberger typedef int (*_citrus_mapper_convert_t)(struct _citrus_mapper * __restrict,
71*0d5acd74SJohn Marino     _citrus_index_t * __restrict, _citrus_index_t, void * __restrict);
72*0d5acd74SJohn Marino typedef void (*_citrus_mapper_init_state_t)(void);
732180e8afSJoerg Sonnenberger 
742180e8afSJoerg Sonnenberger struct _citrus_mapper_ops {
752180e8afSJoerg Sonnenberger 	_citrus_mapper_init_t			 mo_init;
762180e8afSJoerg Sonnenberger 	_citrus_mapper_uninit_t			 mo_uninit;
772180e8afSJoerg Sonnenberger 	_citrus_mapper_convert_t		 mo_convert;
782180e8afSJoerg Sonnenberger 	_citrus_mapper_init_state_t		 mo_init_state;
792180e8afSJoerg Sonnenberger };
802180e8afSJoerg Sonnenberger 
812180e8afSJoerg Sonnenberger struct _citrus_mapper_traits {
822180e8afSJoerg Sonnenberger 	/* version 0x00000001 */
832180e8afSJoerg Sonnenberger 	size_t					 mt_state_size;
842180e8afSJoerg Sonnenberger 	size_t					 mt_src_max;
852180e8afSJoerg Sonnenberger 	size_t					 mt_dst_max;
862180e8afSJoerg Sonnenberger };
872180e8afSJoerg Sonnenberger 
882180e8afSJoerg Sonnenberger struct _citrus_mapper {
892180e8afSJoerg Sonnenberger 	struct _citrus_mapper_ops		*cm_ops;
902180e8afSJoerg Sonnenberger 	void					*cm_closure;
912180e8afSJoerg Sonnenberger 	_citrus_module_t			 cm_module;
922180e8afSJoerg Sonnenberger 	struct _citrus_mapper_traits		*cm_traits;
932180e8afSJoerg Sonnenberger 	_CITRUS_HASH_ENTRY(_citrus_mapper)	 cm_entry;
942180e8afSJoerg Sonnenberger 	int					 cm_refcount;
952180e8afSJoerg Sonnenberger 	char					*cm_key;
962180e8afSJoerg Sonnenberger };
972180e8afSJoerg Sonnenberger #endif
98