Open SCAP Library
Toggle main menu visibility
Loading...
Searching...
No Matches
src
OVAL
probes
SEAP
generic
spb.h
1
/*
2
* Copyright 2009 Red Hat Inc., Durham, North Carolina.
3
* All Rights Reserved.
4
*
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Lesser General Public
7
* License as published by the Free Software Foundation; either
8
* version 2.1 of the License, or (at your option) any later version.
9
*
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Lesser General Public License for more details.
14
*
15
* You should have received a copy of the GNU Lesser General Public
16
* License along with this library; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
*
19
* Authors:
20
* "Daniel Kopecek" <dkopecek@redhat.com>
21
*/
22
23
#pragma once
24
#ifndef SPB_H
25
#define SPB_H
26
27
#include <stddef.h>
28
#include <inttypes.h>
29
#include <common/util.h>
30
31
#define __XC(a, b) OSCAP_CONCAT(a, b)
32
#define _sym(n) __XC(__XC(_sym, __LINE__), n)
33
34
typedef
uint32_t spb_flags_t;
35
36
#define SPB_FLAG_FREE 0x00000001
37
#define SPB_FLAG_JOIN 0x00000002
38
#define SPB_FLAG_FILE 0x00000004
39
40
typedef
uint64_t spb_size_t;
41
#define SPB_SZ_FMT "%"PRIo64
42
43
typedef
struct
{
44
void
*base;
/* buffer base address */
45
spb_size_t gend;
/* sparse buffer index of the last byte of this buffer */
46
}
spb_item_t
;
47
48
typedef
struct
{
49
spb_item_t
*buffer;
/* array of buffers representing the sparse buffer */
50
uint32_t btotal;
/* number of buffer */
51
uint32_t balloc;
/* number of allocated slots */
52
uint32_t bflags;
/* flags - not used at the moment */
53
}
spb_t
;
54
55
#define SPB_DEFAULT_BALLOC 32
/* default number of pre-allocated slots */
56
#define SPB_BALLOC_HIGHTRESH 512
/* the number of new slots is doubled until this limit is reached */
57
#define SPB_BALLOC_ADD 32
/* number of slot to add when we reached the high threshold */
58
67
spb_t
*spb_new (
void
*buffer,
size_t
buflen, uint32_t balloc);
68
69
void
spb_free (
spb_t
*spb, spb_flags_t flags);
70
77
uint32_t spb_bindex (
spb_t
*spb, spb_size_t index);
78
83
spb_size_t spb_size (
spb_t
*spb);
84
93
#define spb_iterate_oct(spb, start, end, name)
/* TODO */
while(0)
94
95
#define spb_iterate(spb, start, name, icode) \
96
do { \
97
spb_size_t _sym(istart) = (start); \
98
spb_t *_sym(ispb) = (spb); \
99
uint32_t _sym(idx) = spb_bindex(_sym(ispb), _sym(istart)); \
100
size_t _sym(l_off) = (size_t)(_sym(idx) > 0 ? start - _sym(ispb)->buffer[_sym(idx) - 1].gend - 1 : start); \
101
\
102
for (; _sym(idx) < _sym(ispb)->btotal; ++_sym(idx)) { \
103
register size_t _sym(l); \
104
register uint8_t *_sym(b); \
105
\
106
_sym(l) = (size_t)(_sym(idx) > 0 ? \
107
_sym(ispb)->buffer[_sym(idx)].gend - _sym(ispb)->buffer[_sym(idx) - 1].gend : \
108
_sym(ispb)->buffer[_sym(idx)].gend + 1) - _sym(l_off); \
109
_sym(b) = ((uint8_t *)(_sym(ispb)->buffer[_sym(idx)].base)) + _sym(l_off); \
110
\
111
for (; _sym(l) > 0; --_sym(l), ++_sym(b)) { \
112
(name) = *_sym(b); \
113
icode; \
114
} \
115
\
116
if (_sym(l) > 0) \
117
break; \
118
\
119
_sym(l_off) = 0; \
120
} \
121
} while (0)
122
129
int
spb_add (
spb_t
*spb,
void
*buffer,
size_t
buflen);
130
138
int
spb_pick (
spb_t
*spb, spb_size_t start, spb_size_t size,
void
*dst);
139
150
int
spb_pick_raw (
spb_t
*spb, uint32_t bindex, spb_size_t start, spb_size_t size,
void
*dst);
151
164
int
spb_pick_cb (
spb_t
*spb, spb_size_t start, spb_size_t size,
void
*cb (
void
*,
void
*,
size_t
),
void
*cbarg);
165
166
spb_size_t spb_drop_head (
spb_t
*spb, spb_size_t size, spb_flags_t flags);
167
168
uint8_t spb_octet (
spb_t
*spb, spb_size_t idx);
169
const
uint8_t *spb_direct (
spb_t
*spb, spb_size_t start, spb_size_t size);
170
171
#endif
/* SPB_H */
spb_item_t
Definition
spb.h:43
spb_t
Definition
spb.h:48
Generated by
1.17.0