diff options
author | simon qian <simonqian.openocd@gmail.com> | 2010-01-24 04:08:47 +0800 |
---|---|---|
committer | David Brownell <dbrownell@users.sourceforge.net> | 2010-01-25 13:06:46 -0800 |
commit | 33fc60befc808b83ab4ef6b1c7a7130c7ccedfc8 (patch) | |
tree | 30f0258a90f60a19cd0519c7a27fb88629fdf851 /src | |
parent | 1dad2ee602674de1b97548913dba2d53267d35a3 (diff) | |
download | riscv-openocd-33fc60befc808b83ab4ef6b1c7a7130c7ccedfc8.zip riscv-openocd-33fc60befc808b83ab4ef6b1c7a7130c7ccedfc8.tar.gz riscv-openocd-33fc60befc808b83ab4ef6b1c7a7130c7ccedfc8.tar.bz2 |
SVF: all content between parentheses is one parameter
More SVF fixes:
* Treat all content between parentheses as part of the same
parameter; don't (wrongly) treat whitespace as a delimiter.
* Use isspace() to catch that whitespace; it's not all single
spaces, newlines etc are also valid.
* When parsing bitstrings, strip leading whitespace too.
So for example, these are equivalent and should (now) be OK:
"TDI( 1234 )"
"TDI( 1 2 3 4 )"
"TDI(00 12 34 )"
"TDI(
00 12
34)"
[dbrownell@users.sourceforge.net: comment updates; trivial cleanup]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/svf/svf.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/src/svf/svf.c b/src/svf/svf.c index 275bced..ea56a88 100644 --- a/src/svf/svf.c +++ b/src/svf/svf.c @@ -500,7 +500,9 @@ static int svf_read_command_from_file(int fd) case '\r': slash = 0; comment = 0; - break; + /* Don't save '\r' and '\n' if no data is parsed */ + if (!cmd_pos) + break; default: if (!comment) { @@ -565,25 +567,30 @@ static int svf_read_command_from_file(int fd) static int svf_parse_cmd_string(char *str, int len, char **argus, int *num_of_argu) { - int pos = 0, num = 0, space_found = 1; + int pos = 0, num = 0, space_found = 1, in_bracket = 0; while (pos < len) { switch (str[pos]) { - case '\n': - case '\r': case '!': case '/': LOG_ERROR("fail to parse svf command"); return ERROR_FAIL; - break; - case ' ': - space_found = 1; - str[pos] = '\0'; - break; + case '(': + in_bracket = 1; + goto parse_char; + case ')': + in_bracket = 0; + goto parse_char; default: - if (space_found) +parse_char: + if (!in_bracket && isspace(str[pos])) + { + space_found = 1; + str[pos] = '\0'; + } + else if (space_found) { argus[num++] = &str[pos]; space_found = 0; @@ -651,6 +658,7 @@ static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_l return ERROR_FAIL; } + /* fill from LSB (end of str) to MSB (beginning of str) */ for (i = 0; i < str_hbyte_len; i++) { ch = 0; @@ -658,7 +666,13 @@ static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_l { ch = str[--str_len]; - if (!isblank(ch)) + /* Skip whitespace. The SVF specification (rev E) is + * deficient in terms of basic lexical issues like + * where whitespace is allowed. Long bitstrings may + * require line ends for correctness, since there is + * a hard limit on line length. + */ + if (!isspace(ch)) { if ((ch >= '0') && (ch <= '9')) { @@ -694,11 +708,12 @@ static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_l } } - // consume optional leading '0' characters - while (str_len > 0 && str[str_len - 1] == '0') + /* consume optional leading '0' MSBs or whitespace */ + while (str_len > 0 && ((str[str_len - 1] == '0') + || isspace(str[str_len - 1]))) str_len--; - // check valid + /* check validity: we must have consumed everything */ if (str_len > 0 || (ch & ~((2 << ((bit_len - 1) % 4)) - 1)) != 0) { LOG_ERROR("value execeeds length"); |