1/* $FreeBSD$ */
2/* $NetBSD: citrus_region.h,v 1.7 2008/02/09 14:56:20 junyoung Exp $ */
3
4/*-
5 * SPDX-License-Identifier: BSD-2-Clause
6 *
7 * Copyright (c)2003 Citrus Project,
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 */
32
33#ifndef _CITRUS_REGION_H_
34#define _CITRUS_REGION_H_
35
36#include <sys/types.h>
37
38struct _citrus_region {
39	void	*r_head;
40	size_t	 r_size;
41};
42
43static __inline void
44_citrus_region_init(struct _citrus_region *r, void *h, size_t sz)
45{
46
47	r->r_head = h;
48	r->r_size = sz;
49}
50
51static __inline void *
52_citrus_region_head(const struct _citrus_region *r)
53{
54
55	return (r->r_head);
56}
57
58static __inline size_t
59_citrus_region_size(const struct _citrus_region *r)
60{
61
62	return (r->r_size);
63}
64
65static __inline int
66_citrus_region_check(const struct _citrus_region *r, size_t ofs, size_t sz)
67{
68
69	return (r->r_size >= ofs + sz ? 0 : -1);
70}
71
72static __inline void *
73_citrus_region_offset(const struct _citrus_region *r, size_t pos)
74{
75
76	return ((void *)((uint8_t *)r->r_head + pos));
77}
78
79static __inline uint8_t
80_citrus_region_peek8(const struct _citrus_region *r, size_t pos)
81{
82
83	return (*(uint8_t *)_citrus_region_offset(r, pos));
84}
85
86static __inline uint16_t
87_citrus_region_peek16(const struct _citrus_region *r, size_t pos)
88{
89	uint16_t val;
90
91	memcpy(&val, _citrus_region_offset(r, pos), (size_t)2);
92	return (val);
93}
94
95static __inline uint32_t
96_citrus_region_peek32(const struct _citrus_region *r, size_t pos)
97{
98	uint32_t val;
99
100	memcpy(&val, _citrus_region_offset(r, pos), (size_t)4);
101	return (val);
102}
103
104static __inline int
105_citrus_region_get_subregion(struct _citrus_region *subr,
106    const struct _citrus_region *r, size_t ofs, size_t sz)
107{
108
109	if (_citrus_region_check(r, ofs, sz))
110		return (-1);
111	_citrus_region_init(subr, _citrus_region_offset(r, ofs), sz);
112	return (0);
113}
114
115#endif
116