citrus_mapper_local.h revision 256281
1128710Sru/* $FreeBSD: stable/10/lib/libc/iconv/citrus_mapper_local.h 250938 2013-05-23 18:07:01Z ed $ */
2128710Sru/* $NetBSD: citrus_mapper_local.h,v 1.2 2008/02/09 14:56:20 junyoung Exp $ */
3128710Sru
4128710Sru/*-
5128710Sru * Copyright (c)2003 Citrus Project,
6128710Sru * All rights reserved.
7128710Sru *
8128710Sru * Redistribution and use in source and binary forms, with or without
9128710Sru * modification, are permitted provided that the following conditions
10128710Sru * are met:
11128710Sru * 1. Redistributions of source code must retain the above copyright
12128710Sru *    notice, this list of conditions and the following disclaimer.
13128710Sru * 2. Redistributions in binary form must reproduce the above copyright
14128710Sru *    notice, this list of conditions and the following disclaimer in the
15128710Sru *    documentation and/or other materials provided with the distribution.
16128710Sru *
1743561Skato * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18235264Savg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19235264Savg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20128710Sru * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21128710Sru * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22128710Sru * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2343561Skato * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2443561Skato * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2543561Skato * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26200254Snyan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27200254Snyan * SUCH DAMAGE.
28200254Snyan */
29200254Snyan
30200254Snyan#ifndef _CITRUS_MAPPER_LOCAL_H_
3143561Skato#define _CITRUS_MAPPER_LOCAL_H_
3243561Skato
33128710Sru#define _CITRUS_MAPPER_GETOPS_FUNC_BASE(_n_)				\
34128710Sruint _n_(struct _citrus_mapper_ops *)
35128710Sru#define _CITRUS_MAPPER_GETOPS_FUNC(_n_)					\
3643561Skato_CITRUS_MAPPER_GETOPS_FUNC_BASE(_citrus_##_n_##_mapper_getops)
3743561Skato
38128710Sru#define _CITRUS_MAPPER_DECLS(_m_)					\
39200254Snyanstatic int	 _citrus_##_m_##_mapper_init				\
40200254Snyan		    (struct _citrus_mapper_area *__restrict,		\
41200254Snyan		    struct _citrus_mapper * __restrict,			\
42200254Snyan		    const char * __restrict, const void * __restrict,	\
43200254Snyan		    size_t, struct _citrus_mapper_traits * __restrict,	\
44200254Snyan		    size_t);						\
45200254Snyanstatic void	 _citrus_##_m_##_mapper_uninit(				\
46200254Snyan		    struct _citrus_mapper *);				\
47128710Srustatic int	 _citrus_##_m_##_mapper_convert				\
48128710Sru		    (struct _citrus_mapper * __restrict,		\
4943561Skato		    _citrus_index_t * __restrict, _citrus_index_t,	\
5043561Skato		    void * __restrict);					\
5143561Skatostatic void	 _citrus_##_m_##_mapper_init_state			\
5243561Skato		    (void);
5343561Skato
5443561Skato#define _CITRUS_MAPPER_DEF_OPS(_m_)					\
5543561Skatoextern struct _citrus_mapper_ops _citrus_##_m_##_mapper_ops;		\
56128710Srustruct _citrus_mapper_ops _citrus_##_m_##_mapper_ops = {		\
57128710Sru	/* mo_init */		&_citrus_##_m_##_mapper_init,		\
58128710Sru	/* mo_uninit */		&_citrus_##_m_##_mapper_uninit,		\
5943561Skato	/* mo_convert */	&_citrus_##_m_##_mapper_convert,	\
6043561Skato	/* mo_init_state */	&_citrus_##_m_##_mapper_init_state	\
6143561Skato}
62128710Sru
63128710Srutypedef _CITRUS_MAPPER_GETOPS_FUNC_BASE((*_citrus_mapper_getops_t));
64128710Srutypedef	int (*_citrus_mapper_init_t)(
6543561Skato    struct _citrus_mapper_area *__restrict,
6643561Skato    struct _citrus_mapper *__restrict, const char *__restrict,
67128710Sru    const void *__restrict, size_t,
68200254Snyan    struct _citrus_mapper_traits * __restrict, size_t);
69128710Srutypedef void (*_citrus_mapper_uninit_t)(struct _citrus_mapper *);
70200254Snyantypedef int (*_citrus_mapper_convert_t)(struct _citrus_mapper * __restrict,
71200254Snyan    _citrus_index_t * __restrict, _citrus_index_t, void * __restrict);
72200254Snyantypedef void (*_citrus_mapper_init_state_t)(void);
73200254Snyan
74200254Snyanstruct _citrus_mapper_ops {
75200254Snyan	_citrus_mapper_init_t			 mo_init;
76128710Sru	_citrus_mapper_uninit_t			 mo_uninit;
77200254Snyan	_citrus_mapper_convert_t		 mo_convert;
78200254Snyan	_citrus_mapper_init_state_t		 mo_init_state;
79200254Snyan};
80200254Snyan
81200254Snyanstruct _citrus_mapper_traits {
82200254Snyan	/* version 0x00000001 */
83128710Sru	size_t					 mt_state_size;
84128710Sru	size_t					 mt_src_max;
8543561Skato	size_t					 mt_dst_max;
8643561Skato};
8743561Skato
8843561Skatostruct _citrus_mapper {
89128710Sru	struct _citrus_mapper_ops		*cm_ops;
90128710Sru	void					*cm_closure;
91128710Sru	_citrus_module_t			 cm_module;
9243561Skato	struct _citrus_mapper_traits		*cm_traits;
9343561Skato	_CITRUS_HASH_ENTRY(_citrus_mapper)	 cm_entry;
9443561Skato	int					 cm_refcount;
95128710Sru	char					*cm_key;
96128710Sru};
97128710Sru#endif
9858871Skato