This patch adds handling blank characters between hex digits in
SVF file, making OpenOCD compatible with files generated by
Altera Quatrus II 9.0.

Signed-off-by: Piotr Ziecik <ko...@semihalf.com>
---
 src/svf/svf.c |   97 ++++++++++++++++++++++----------------------------------
 1 files changed, 38 insertions(+), 59 deletions(-)

diff --git a/src/svf/svf.c b/src/svf/svf.c
index 51edada..510b7b0 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;
-- 
1.6.4

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to