357d05c377cda0d3d12f4704c6109076bd40c91f
[openocd.git] / src / helper / binarybuffer.c
1 /***************************************************************************
2 * Copyright (C) 2004, 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program 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 *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include "types.h"
25 #include "log.h"
26
27 #include "binarybuffer.h"
28
29 int buf_set_u32(u8* buffer, unsigned int first, unsigned int num, u32 value);
30 u32 buf_get_u32(u8* buffer, unsigned int first, unsigned int num);
31 u32 flip_u32(u32 value, unsigned int num);
32
33 const unsigned char bit_reverse_table256[] =
34 {
35 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
36 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
37 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
38 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
39 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
40 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
41 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
42 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
43 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
44 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
45 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
46 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
47 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
48 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
49 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
50 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
51 };
52
53 int buf_set_u32(u8* buffer, unsigned int first, unsigned int num, u32 value)
54 {
55 unsigned int i;
56
57 if (!buffer)
58 return ERROR_INVALID_ARGUMENTS;
59
60 for (i=first; i<first+num; i++)
61 {
62 if (((value >> (i-first))&1) == 1)
63 buffer[i/8] |= 1 << (i%8);
64 else
65 buffer[i/8] &= ~(1 << (i%8));
66 }
67
68 return ERROR_OK;
69 }
70
71 u32 buf_get_u32(u8* buffer, unsigned int first, unsigned int num)
72 {
73 u32 result = 0;
74 unsigned int i;
75
76 if (!buffer)
77 {
78 ERROR("buffer not initialized");
79 return 0;
80 }
81
82 for (i=first; i<first+num; i++)
83 {
84 if (((buffer[i/8]>>(i%8))&1) == 1)
85 result |= 1 << (i-first);
86 }
87
88 return result;
89 }
90
91 u8* buf_cpy(u8 *from, u8 *to, int size)
92 {
93 int num_bytes = CEIL(size, 8);
94 unsigned int i;
95
96 if (from == NULL)
97 return NULL;
98
99 for (i = 0; i < num_bytes; i++)
100 to[i] = from[i];
101
102 return to;
103 }
104
105 int buf_cmp(u8 *buf1, u8 *buf2, int size)
106 {
107 int num_bytes = CEIL(size, 8);
108 int i;
109
110 if (!buf1 || !buf2)
111 return 1;
112
113 for (i = 0; i < num_bytes; i++)
114 {
115 if (buf1[i] != buf2[i])
116 return 1;
117 }
118
119 return 0;
120 }
121
122 int buf_cmp_mask(u8 *buf1, u8 *buf2, u8 *mask, int size)
123 {
124 int num_bytes = CEIL(size, 8);
125 int i;
126
127 for (i = 0; i < num_bytes; i++)
128 {
129 if ((buf1[i] & mask[i]) != (buf2[i] & mask[i]))
130 return 1;
131 }
132
133 return 0;
134 }
135
136 u8* buf_set_ones(u8 *buf, int count)
137 {
138 int num_bytes = CEIL(count, 8);
139 int i;
140
141 for (i = 0; i < num_bytes; i++)
142 {
143 if (count >= 8)
144 buf[i] = 0xff;
145 else
146 buf[i] = (1 << count) - 1;
147
148 count -= 8;
149 }
150
151 return buf;
152 }
153
154 u8* buf_set_buf(u8 *src, int src_start, u8 *dst, int dst_start, int len)
155 {
156 int src_idx = src_start, dst_idx = dst_start;
157 int i;
158
159 for (i = 0; i < len; i++)
160 {
161 if (((src[src_idx/8] >> (src_idx % 8)) & 1) == 1)
162 dst[dst_idx/8] |= 1 << (dst_idx%8);
163 else
164 dst[dst_idx/8] &= ~(1 << (dst_idx%8));
165 dst_idx++;
166 src_idx++;
167 }
168
169 return dst;
170 }
171
172 u32 flip_u32(u32 value, unsigned int num)
173 {
174 u32 c;
175
176 c = (bit_reverse_table256[value & 0xff] << 24) |
177 (bit_reverse_table256[(value >> 8) & 0xff] << 16) |
178 (bit_reverse_table256[(value >> 16) & 0xff] << 8) |
179 (bit_reverse_table256[(value >> 24) & 0xff]);
180
181 if (num < 32)
182 c = c >> (32 - num);
183
184 return c;
185 }
186
187 char* buf_to_char(u8 *buf, int size)
188 {
189 int char_len = CEIL(size, 8) * 2;
190 char *char_buf = malloc(char_len + 1);
191 int i;
192 int bits_left = size;
193
194 char_buf[char_len] = 0;
195
196 for (i = 0; i < CEIL(size, 8); i++)
197 {
198 if (bits_left < 8)
199 {
200 buf[i] &= ((1 << bits_left) - 1);
201 }
202
203 if (((buf[i] & 0x0f) >= 0) && ((buf[i] & 0x0f) <= 9))
204 char_buf[char_len - 2*i - 1] = '0' + (buf[i] & 0xf);
205 else
206 char_buf[char_len - 2*i - 1] = 'a' + (buf[i] & 0xf) - 10;
207
208 if (((buf[i] & 0xf0) >> 4 >= 0) && ((buf[i] & 0xf0) >> 4 <= 9))
209 char_buf[char_len - 2*i - 2] = '0' + ((buf[i] & 0xf0) >> 4);
210 else
211 char_buf[char_len - 2*i - 2] = 'a' + ((buf[i] & 0xf0) >> 4) - 10;
212
213 }
214
215 return char_buf;
216 }
217
218 int char_to_buf(char *buf, int len, u8 *bin_buf, int buf_size)
219 {
220 int bin_len = CEIL(len, 2);
221 int i;
222
223 if (buf_size < CEIL(bin_len, 8))
224 return 0;
225
226 if (len % 2)
227 return 0;
228
229 for (i = 0; i < strlen(buf); i++)
230 {
231 u32 tmp;
232 sscanf(buf + 2*i, "%2x", &tmp);
233 bin_buf[i] = tmp & 0xff;
234 }
235
236 return bin_len * 8;
237 }
238
239 int buf_to_u32_handler(u8 *in_buf, void *priv)
240 {
241 u32 *dest = priv;
242
243 *dest = buf_get_u32(in_buf, 0, 32);
244
245 return ERROR_OK;
246 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)