target/adi_v5_swd, cortex_m: properly handle more cases requiring reconnect
[fw/openocd] / src / helper / binarybuffer.c
index a90ec7b01ebab7dc3b928104df4badb77d38e59a..3cadabdb1ade990ddcad858a67c592b44fb76042 100644 (file)
@@ -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]];
 
@@ -393,7 +393,28 @@ int hexify(char *hex, const char *bin, int count, int out_maxlen)
                count = strlen(bin);
 
        for (i = 0; i < count; i++)
-               cmd_len += snprintf(hex + cmd_len, out_maxlen - cmd_len, "%02x", bin[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);
+       }
+}