1/* $FreeBSD$ */
2/* $NetBSD: citrus_mapper_local.h,v 1.2 2008/02/09 14:56:20 junyoung Exp $ */
3
4/*-
5 * Copyright (c)2003 Citrus Project,
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _CITRUS_MAPPER_LOCAL_H_
31#define _CITRUS_MAPPER_LOCAL_H_
32
33#define _CITRUS_MAPPER_GETOPS_FUNC_BASE(_n_)				\
34int _n_(struct _citrus_mapper_ops *)
35#define _CITRUS_MAPPER_GETOPS_FUNC(_n_)					\
36_CITRUS_MAPPER_GETOPS_FUNC_BASE(_citrus_##_n_##_mapper_getops)
37
38#define _CITRUS_MAPPER_DECLS(_m_)					\
39static int	 _citrus_##_m_##_mapper_init				\
40		    (struct _citrus_mapper_area *__restrict,		\
41		    struct _citrus_mapper * __restrict,			\
42		    const char * __restrict, const void * __restrict,	\
43		    size_t, struct _citrus_mapper_traits * __restrict,	\
44		    size_t);						\
45static void	 _citrus_##_m_##_mapper_uninit(				\
46		    struct _citrus_mapper *);				\
47static int	 _citrus_##_m_##_mapper_convert				\
48		    (struct _citrus_mapper * __restrict,		\
49		    _citrus_index_t * __restrict, _citrus_index_t,	\
50		    void * __restrict);					\
51static void	 _citrus_##_m_##_mapper_init_state			\
52		    (void);
53
54#define _CITRUS_MAPPER_DEF_OPS(_m_)					\
55struct _citrus_mapper_ops _citrus_##_m_##_mapper_ops = {		\
56	/* mo_init */		&_citrus_##_m_##_mapper_init,		\
57	/* mo_uninit */		&_citrus_##_m_##_mapper_uninit,		\
58	/* mo_convert */	&_citrus_##_m_##_mapper_convert,	\
59	/* mo_init_state */	&_citrus_##_m_##_mapper_init_state	\
60}
61
62typedef _CITRUS_MAPPER_GETOPS_FUNC_BASE((*_citrus_mapper_getops_t));
63typedef	int (*_citrus_mapper_init_t)(
64    struct _citrus_mapper_area *__restrict,
65    struct _citrus_mapper *__restrict, const char *__restrict,
66    const void *__restrict, size_t,
67    struct _citrus_mapper_traits * __restrict, size_t);
68typedef void (*_citrus_mapper_uninit_t)(struct _citrus_mapper *);
69typedef int (*_citrus_mapper_convert_t)(struct _citrus_mapper * __restrict,
70    _citrus_index_t * __restrict, _citrus_index_t, void * __restrict);
71typedef void (*_citrus_mapper_init_state_t)(void);
72
73struct _citrus_mapper_ops {
74	_citrus_mapper_init_t			 mo_init;
75	_citrus_mapper_uninit_t			 mo_uninit;
76	_citrus_mapper_convert_t		 mo_convert;
77	_citrus_mapper_init_state_t		 mo_init_state;
78};
79
80struct _citrus_mapper_traits {
81	/* version 0x00000001 */
82	size_t					 mt_state_size;
83	size_t					 mt_src_max;
84	size_t					 mt_dst_max;
85};
86
87struct _citrus_mapper {
88	struct _citrus_mapper_ops		*cm_ops;
89	void					*cm_closure;
90	_citrus_module_t			 cm_module;
91	struct _citrus_mapper_traits		*cm_traits;
92	_CITRUS_HASH_ENTRY(_citrus_mapper)	 cm_entry;
93	int					 cm_refcount;
94	char					*cm_key;
95};
96#endif
97