X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Fbinarybuffer.c;h=3cadabdb1ade990ddcad858a67c592b44fb76042;hp=74af53a95a9694ab36fba50462cd00d8cd7821fc;hb=48a681c741993e61f2a9404b75b73d011b9e184e;hpb=7719e2188e89a93813caf2ac8cfd7457cb605631 diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c index 74af53a95a..3cadabdb1a 100644 --- a/src/helper/binarybuffer.c +++ b/src/helper/binarybuffer.c @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -148,7 +148,7 @@ void *buf_set_buf(const void *_src, unsigned src_start, if ((sq == 0) && (dq == 0) && (lq == 0)) { for (i = 0; i < lb; i++) *dst++ = *src++; - return (uint8_t *)_dst; + return _dst; } /* fallback to slow bit copy */ @@ -167,7 +167,7 @@ void *buf_set_buf(const void *_src, unsigned src_start, } } - return (uint8_t *)_dst; + return _dst; } uint32_t flip_u32(uint32_t value, unsigned int num) @@ -231,7 +231,7 @@ char *buf_to_str(const void *_buf, unsigned buf_len, unsigned radix) } } - const char *DIGITS = "0123456789ABCDEF"; + const char * const DIGITS = "0123456789ABCDEF"; for (unsigned j = 0; j < str_len; j++) str[j] = DIGITS[(int)str[j]]; @@ -327,3 +327,94 @@ int str_to_buf(const char *str, unsigned str_len, return i; } + +void bit_copy_queue_init(struct bit_copy_queue *q) +{ + INIT_LIST_HEAD(&q->list); +} + +int bit_copy_queued(struct bit_copy_queue *q, uint8_t *dst, unsigned dst_offset, const uint8_t *src, + unsigned src_offset, unsigned bit_count) +{ + struct bit_copy_queue_entry *qe = malloc(sizeof(*qe)); + if (!qe) + return ERROR_FAIL; + + qe->dst = dst; + qe->dst_offset = dst_offset; + qe->src = src; + qe->src_offset = src_offset; + qe->bit_count = bit_count; + list_add_tail(&qe->list, &q->list); + + return ERROR_OK; +} + +void bit_copy_execute(struct bit_copy_queue *q) +{ + struct bit_copy_queue_entry *qe; + struct bit_copy_queue_entry *tmp; + list_for_each_entry_safe(qe, tmp, &q->list, list) { + bit_copy(qe->dst, qe->dst_offset, qe->src, qe->src_offset, qe->bit_count); + list_del(&qe->list); + free(qe); + } +} + +void bit_copy_discard(struct bit_copy_queue *q) +{ + struct bit_copy_queue_entry *qe; + struct bit_copy_queue_entry *tmp; + list_for_each_entry_safe(qe, tmp, &q->list, list) { + list_del(&qe->list); + free(qe); + } +} + +int unhexify(char *bin, const char *hex, int count) +{ + int i, tmp; + + for (i = 0; i < count; i++) { + if (sscanf(hex + (2 * i), "%02x", &tmp) != 1) + return i; + bin[i] = tmp; + } + + return i; +} + +int hexify(char *hex, const char *bin, int count, int out_maxlen) +{ + int i, cmd_len = 0; + + /* May use a length, or a null-terminated string as input. */ + if (count == 0) + count = strlen(bin); + + for (i = 0; i < count; i++) + cmd_len += snprintf(hex + cmd_len, out_maxlen - cmd_len, "%02x", bin[i] & 0xff); + + return cmd_len; +} + +void buffer_shr(void *_buf, unsigned buf_len, unsigned count) +{ + unsigned i; + unsigned char *buf = _buf; + unsigned bytes_to_remove; + unsigned shift; + + bytes_to_remove = count / 8; + shift = count - (bytes_to_remove * 8); + + for (i = 0; i < (buf_len - 1); i++) + buf[i] = (buf[i] >> shift) | ((buf[i+1] << (8 - shift)) & 0xff); + + buf[(buf_len - 1)] = buf[(buf_len - 1)] >> shift; + + if (bytes_to_remove) { + memmove(buf, &buf[bytes_to_remove], buf_len - bytes_to_remove); + memset(&buf[buf_len - bytes_to_remove], 0, bytes_to_remove); + } +}