-
Notifications
You must be signed in to change notification settings - Fork 118
/
bytestring.h
159 lines (108 loc) · 3.85 KB
/
bytestring.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**********************************************************************
*
* This file is part of Cardpeek, the smart card reader utility.
*
* Copyright 2009-2013 by Alain Pannetrat <[email protected]>
*
* Cardpeek is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cardpeek is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cardpeek. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef BYTESTRING_H
#define BYTESTRING_H
typedef struct {
unsigned len;
unsigned alloc;
unsigned char width;
unsigned char mask;
unsigned char *data;
} bytestring_t;
enum {
BYTESTRING_ERROR=0,
BYTESTRING_OK=1,
BYTESTRING_NPOS=0x7FFFFFFF
};
/* constructors */
int bytestring_init(bytestring_t *bs, unsigned element_width);
bytestring_t* bytestring_new(unsigned element_width);
bytestring_t* bytestring_new_from_string(const char *str);
bytestring_t* bytestring_duplicate(const bytestring_t *bs);
/* assign */
int bytestring_assign_data(bytestring_t* bs,
unsigned len, const unsigned char *data);
int bytestring_assign_element(bytestring_t* bs,
unsigned len, unsigned char c);
int bytestring_assign_digit_string(bytestring_t* bs,
const char* str);
/* copy */
int bytestring_copy(bytestring_t *bs,
const bytestring_t *src);
/* convert */
int bytestring_convert(bytestring_t *bs,
const bytestring_t *src);
/* append data */
int bytestring_append(bytestring_t *bs,
const bytestring_t *extra);
int bytestring_append_data(bytestring_t *bs,
unsigned len, const unsigned char *data);
int bytestring_append_element(bytestring_t* bs,
unsigned len, unsigned char c);
int bytestring_pushback(bytestring_t *bs,
unsigned char c);
/* accessors */
int bytestring_set_element(const bytestring_t *bs,
int pos, unsigned char element);
int bytestring_get_element(unsigned char* element,
const bytestring_t *bs,
int pos);
const unsigned char *bytestring_get_data(const bytestring_t *bs);
/* invert */
int bytestring_invert(bytestring_t *bs);
/* clear */
void bytestring_clear(bytestring_t *bs);
int bytestring_erase(bytestring_t *bs,
unsigned pos,
unsigned len);
/* tests */
int bytestring_is_equal(const bytestring_t *a, const bytestring_t *b);
int bytestring_is_empty(const bytestring_t *bs);
int bytestring_is_printable(const bytestring_t *bs);
/* insertion */
int bytestring_insert_data(bytestring_t *bs,
unsigned pos,
unsigned len, const unsigned char* data);
int bytestring_insert_element(bytestring_t *bs,
unsigned pos,
unsigned len, unsigned char c);
int bytestring_insert(bytestring_t *bs,
unsigned pos,
const bytestring_t *src);
int bytestring_pad_left(bytestring_t *bs,
unsigned block_size, unsigned char c);
int bytestring_pad_right(bytestring_t *bs,
unsigned block_size, unsigned char c);
/* get size / resize */
int bytestring_resize(bytestring_t *bs, unsigned len);
unsigned bytestring_get_size(const bytestring_t *bs);
/* substring */
int bytestring_substr(bytestring_t *dst,
unsigned pos, unsigned len,
const bytestring_t* src);
/* conversion to other types */
char *bytestring_to_format(const char *format, const bytestring_t *bs);
double bytestring_to_number(const bytestring_t *bs);
/* destructors */
void bytestring_release(bytestring_t *bs);
void bytestring_free(bytestring_t *bs);
/* bytestring_release frees data in bs, bytestring_free also frees bs itself. */
#endif