summaryrefslogtreecommitdiff
path: root/src/svf
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-20 08:55:34 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-20 08:55:34 +0000
commitafae28fb2cfaa2da08311e9d17bf9c8057a2f399 (patch)
treef20b1a1e44e8a7736e0d371d3d72b3d7e0c1aeae /src/svf
parentef30f22fd3355f668b23905f50bab4671f803ab1 (diff)
downloadopenocd+libswd-afae28fb2cfaa2da08311e9d17bf9c8057a2f399.tar.gz
openocd+libswd-afae28fb2cfaa2da08311e9d17bf9c8057a2f399.tar.bz2
openocd+libswd-afae28fb2cfaa2da08311e9d17bf9c8057a2f399.tar.xz
openocd+libswd-afae28fb2cfaa2da08311e9d17bf9c8057a2f399.zip
Piotr Ziecik <kosmo@semihalf.com> This patch adds handling blank characters between hex digits in
SVF file, making OpenOCD compatible with files generated by Altera Quatrus II 9.0. git-svn-id: svn://svn.berlios.de/openocd/trunk@2600 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/svf')
-rw-r--r--src/svf/svf.c97
1 files changed, 38 insertions, 59 deletions
diff --git a/src/svf/svf.c b/src/svf/svf.c
index 51edadaf..510b7b0a 100644
--- a/src/svf/svf.c
+++ b/src/svf/svf.c
@@ -655,8 +655,8 @@ static int svf_adjust_array_length(uint8_t **arr, int orig_bit_len, int new_bit_
static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_len, int bit_len)
{
- int i, str_len = strlen(str), str_byte_len = (bit_len + 3) >> 2, loop_cnt;
- uint8_t ch, need_write = 1;
+ int i, str_len = strlen(str), str_hbyte_len = (bit_len + 3) >> 2;
+ uint8_t ch;
if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len))
{
@@ -664,75 +664,54 @@ static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_l
return ERROR_FAIL;
}
- if (str_byte_len > str_len)
+ for (i = 0; i < str_hbyte_len; i++)
{
- loop_cnt = str_byte_len;
- }
- else
- {
- loop_cnt = str_len;
- }
-
- for (i = 0; i < loop_cnt; i++)
- {
- if (i < str_len)
+ ch = 0;
+ while (str_len > 0)
{
- ch = str[str_len - i - 1];
- if ((ch >= '0') && (ch <= '9'))
- {
- ch = ch - '0';
- }
- else if ((ch >= 'A') && (ch <= 'F'))
- {
- ch = ch - 'A' + 10;
- }
- else
+ ch = str[--str_len];
+
+ if (!isblank(ch))
{
- LOG_ERROR("invalid hex string");
- return ERROR_FAIL;
+ if ((ch >= '0') && (ch <= '9'))
+ {
+ ch = ch - '0';
+ break;
+ }
+ else if ((ch >= 'A') && (ch <= 'F'))
+ {
+ ch = ch - 'A' + 10;
+ break;
+ }
+ else
+ {
+ LOG_ERROR("invalid hex string");
+ return ERROR_FAIL;
+ }
}
- }
- else
- {
+
ch = 0;
}
- // check valid
- if (i >= str_byte_len)
+ // write bin
+ if (i % 2)
{
- // all data written, other data should be all '0's and needn't to be written
- need_write = 0;
- if (ch != 0)
- {
- LOG_ERROR("value execede length");
- return ERROR_FAIL;
- }
+ // MSB
+ (*bin)[i / 2] |= ch << 4;
}
- else if (i == (str_byte_len - 1))
+ else
{
- // last data byte, written if valid
- if ((ch & ~((1 << (bit_len - 4 * i)) - 1)) != 0)
- {
- LOG_ERROR("value execede length");
- return ERROR_FAIL;
- }
+ // LSB
+ (*bin)[i / 2] = 0;
+ (*bin)[i / 2] |= ch;
}
+ }
- if (need_write)
- {
- // write bin
- if (i % 2)
- {
- // MSB
- (*bin)[i / 2] |= ch << 4;
- }
- else
- {
- // LSB
- (*bin)[i / 2] = 0;
- (*bin)[i / 2] |= ch;
- }
- }
+ // check valid
+ if (str_len > 0 || (ch & ~((1 << (4 - (bit_len % 4))) - 1)) != 0)
+ {
+ LOG_ERROR("value execede length");
+ return ERROR_FAIL;
}
return ERROR_OK;