Zach Welch <zw@superlucidity.net> fix -Werror warnings
[openocd.git] / src / helper / binarybuffer.c
1 /***************************************************************************
2 * Copyright (C) 2004, 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <stdlib.h>
28 #include <string.h>
29
30 #include "types.h"
31 #include "log.h"
32
33 #include "binarybuffer.h"
34
35 const unsigned char bit_reverse_table256[] =
36 {
37 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
38 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
39 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
40 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
41 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
42 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
43 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
44 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
45 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
46 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
47 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
48 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
49 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
50 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
51 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
52 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
53 };
54
55
56 u8* buf_cpy(u8 *from, u8 *to, int size)
57 {
58 unsigned int num_bytes = CEIL(size, 8);
59 unsigned int i;
60
61 if (from == NULL)
62 return NULL;
63
64 for (i = 0; i < num_bytes; i++)
65 to[i] = from[i];
66
67 /* mask out bits that don't belong to the buffer */
68 if (size % 8)
69 {
70 to[size / 8] &= (0xff >> (8 - (size % 8)));
71 }
72
73 return to;
74 }
75
76 int buf_cmp(u8 *buf1, u8 *buf2, int size)
77 {
78 int num_bytes = CEIL(size, 8);
79 int i;
80
81 if (!buf1 || !buf2)
82 return 1;
83
84 for (i = 0; i < num_bytes; i++)
85 {
86 /* last byte */
87 /* mask out bits that don't really belong to the buffer if size isn't a multiple of 8 bits */
88 if ((size % 8) && (i == num_bytes -1 ))
89 {
90 if ((buf1[i] & ((1 << (size % 8)) - 1)) != (buf2[i] & ((1 << (size % 8)) - 1)))
91 return 1;
92 }
93 else
94 {
95 if (buf1[i] != buf2[i])
96 return 1;
97 }
98 }
99
100 return 0;
101 }
102
103 int buf_cmp_mask(u8 *buf1, u8 *buf2, u8 *mask, int size)
104 {
105 int num_bytes = CEIL(size, 8);
106 int i;
107
108 for (i = 0; i < num_bytes; i++)
109 {
110 /* last byte */
111 /* mask out bits that don't really belong to the buffer if size isn't a multiple of 8 bits */
112 if ((size % 8) && (i == num_bytes -1 ))
113 {
114 if ((buf1[i] & ((1 << (size % 8)) - 1) & mask[i]) !=
115 (buf2[i] & ((1 << (size % 8)) - 1) & mask[i]))
116 return 1;
117 }
118 else
119 {
120 if ((buf1[i] & mask[i]) != (buf2[i] & mask[i]))
121 return 1;
122 }
123 }
124
125 return 0;
126 }
127
128 u8* buf_set_ones(u8 *buf, int count)
129 {
130 int num_bytes = CEIL(count, 8);
131 int i;
132
133 for (i = 0; i < num_bytes; i++)
134 {
135 if (count >= 8)
136 buf[i] = 0xff;
137 else
138 buf[i] = (1 << count) - 1;
139
140 count -= 8;
141 }
142
143 return buf;
144 }
145
146 u8* buf_set_buf(u8 *src, int src_start, u8 *dst, int dst_start, int len)
147 {
148 int src_idx = src_start, dst_idx = dst_start;
149 int i;
150
151 for (i = 0; i < len; i++)
152 {
153 if (((src[src_idx/8] >> (src_idx % 8)) & 1) == 1)
154 dst[dst_idx/8] |= 1 << (dst_idx%8);
155 else
156 dst[dst_idx/8] &= ~(1 << (dst_idx%8));
157 dst_idx++;
158 src_idx++;
159 }
160
161 return dst;
162 }
163
164 u32 flip_u32(u32 value, unsigned int num)
165 {
166 u32 c;
167
168 c = (bit_reverse_table256[value & 0xff] << 24) |
169 (bit_reverse_table256[(value >> 8) & 0xff] << 16) |
170 (bit_reverse_table256[(value >> 16) & 0xff] << 8) |
171 (bit_reverse_table256[(value >> 24) & 0xff]);
172
173 if (num < 32)
174 c = c >> (32 - num);
175
176 return c;
177 }
178
179 int ceil_f_to_u32(float x)
180 {
181 u32 y;
182
183 if (x < 0) /* return zero for negative numbers */
184 return 0;
185
186 y = x; /* cut off fraction */
187
188 if ((x - y) > 0.0) /* if there was a fractional part, increase by one */
189 y++;
190
191 return y;
192 }
193
194 char* buf_to_str(const u8 *buf, int buf_len, int radix)
195 {
196 const char *DIGITS = "0123456789ABCDEF";
197 float factor;
198 char *str;
199 int str_len;
200 int b256_len = CEIL(buf_len, 8);
201 u32 tmp;
202
203 int j; /* base-256 digits */
204 int i; /* output digits (radix) */
205
206 if (radix == 16)
207 {
208 factor = 2.0; /* log(256) / log(16) = 2.0 */
209 }
210 else if (radix == 10)
211 {
212 factor = 2.40824; /* log(256) / log(10) = 2.40824 */
213 }
214 else if (radix == 8)
215 {
216 factor = 2.66667; /* log(256) / log(8) = 2.66667 */
217 }
218 else
219 return NULL;
220
221 str_len = ceil_f_to_u32(CEIL(buf_len, 8) * factor);
222 str = calloc(str_len + 1, 1);
223
224 for (i = b256_len - 1; i >= 0; i--)
225 {
226 tmp = buf[i];
227 if ((i == (buf_len / 8)) && (buf_len % 8))
228 tmp &= (0xff >> (8 - (buf_len % 8)));
229
230 for (j = str_len; j > 0; j--)
231 {
232 tmp += (u32)str[j-1] * 256;
233 str[j-1] = (u8)(tmp % radix);
234 tmp /= radix;
235 }
236 }
237
238 for (j = 0; j < str_len; j++)
239 str[j] = DIGITS[(int)str[j]];
240
241 return str;
242 }
243
244 int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
245 {
246 char *charbuf;
247 char tmp;
248 float factor;
249 u8 *b256_buf;
250 int b256_len;
251
252 int j; /* base-256 digits */
253 int i; /* input digits (ASCII) */
254
255 if (radix == 0)
256 {
257 /* identify radix, and skip radix-prefix (0, 0x or 0X) */
258 if ((str[0] == '0') && (str[1] && ((str[1] == 'x') || (str[1] == 'X'))))
259 {
260 radix = 16;
261 str += 2;
262 str_len -= 2;
263 }
264 else if ((str[0] == '0') && (str_len != 1))
265 {
266 radix = 8;
267 str += 1;
268 str_len -= 1;
269 }
270 else
271 {
272 radix = 10;
273 }
274 }
275
276 if (radix == 16)
277 factor = 0.5; /* log(16) / log(256) = 0.5 */
278 else if (radix == 10)
279 factor = 0.41524; /* log(10) / log(256) = 0.41524 */
280 else if (radix == 8)
281 factor = 0.375; /* log(8) / log(256) = 0.375 */
282 else
283 return 0;
284
285 /* copy to zero-terminated buffer */
286 charbuf = malloc(str_len + 1);
287 memcpy(charbuf, str, str_len);
288 charbuf[str_len] = '\0';
289
290 /* number of digits in base-256 notation */
291 b256_len = ceil_f_to_u32(str_len * factor);
292 b256_buf = calloc(b256_len, 1);
293
294 /* go through zero terminated buffer */
295 for (i = 0; charbuf[i]; i++)
296 {
297 tmp = charbuf[i];
298 if ((tmp >= '0') && (tmp <= '9'))
299 tmp = (tmp - '0');
300 else if ((tmp >= 'a') && (tmp <= 'f'))
301 tmp = (tmp - 'a' + 10);
302 else if ((tmp >= 'A') && (tmp <= 'F'))
303 tmp = (tmp - 'A' + 10);
304 else continue; /* skip characters other than [0-9,a-f,A-F] */
305
306 if (tmp >= radix)
307 continue; /* skip digits invalid for the current radix */
308
309 for (j = 0; j < b256_len; j++)
310 {
311 tmp += (u32)b256_buf[j] * radix;
312 b256_buf[j] = (u8)(tmp & 0xFF);
313 tmp >>= 8;
314 }
315
316 }
317
318 for (j = 0; j < CEIL(buf_len, 8); j++)
319 {
320 if (j < b256_len)
321 buf[j] = b256_buf[j];
322 else
323 buf[j] = 0;
324 }
325
326 /* mask out bits that don't belong to the buffer */
327 if (buf_len % 8)
328 buf[(buf_len / 8)] &= 0xff >> (8 - (buf_len % 8));
329
330 free(b256_buf);
331 free(charbuf);
332
333 return i;
334 }
335
336 int buf_to_u32_handler(u8 *in_buf, void *priv, struct scan_field_s *field)
337 {
338 u32 *dest = priv;
339
340 *dest = buf_get_u32(in_buf, 0, 32);
341
342 return ERROR_OK;
343 }

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)