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>
This commit is contained in:
simon qian 2010-01-24 04:08:47 +08:00 committed by David Brownell
parent 1dad2ee602
commit 33fc60befc
1 changed files with 29 additions and 14 deletions

View File

@ -500,6 +500,8 @@ static int svf_read_command_from_file(int fd)
case '\r': case '\r':
slash = 0; slash = 0;
comment = 0; comment = 0;
/* Don't save '\r' and '\n' if no data is parsed */
if (!cmd_pos)
break; break;
default: default:
if (!comment) 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) 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) while (pos < len)
{ {
switch (str[pos]) switch (str[pos])
{ {
case '\n':
case '\r':
case '!': case '!':
case '/': case '/':
LOG_ERROR("fail to parse svf command"); LOG_ERROR("fail to parse svf command");
return ERROR_FAIL; return ERROR_FAIL;
break; case '(':
case ' ': in_bracket = 1;
goto parse_char;
case ')':
in_bracket = 0;
goto parse_char;
default:
parse_char:
if (!in_bracket && isspace(str[pos]))
{
space_found = 1; space_found = 1;
str[pos] = '\0'; str[pos] = '\0';
break; }
default: else if (space_found)
if (space_found)
{ {
argus[num++] = &str[pos]; argus[num++] = &str[pos];
space_found = 0; 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; return ERROR_FAIL;
} }
/* fill from LSB (end of str) to MSB (beginning of str) */
for (i = 0; i < str_hbyte_len; i++) for (i = 0; i < str_hbyte_len; i++)
{ {
ch = 0; 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]; 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')) 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 /* consume optional leading '0' MSBs or whitespace */
while (str_len > 0 && str[str_len - 1] == '0') while (str_len > 0 && ((str[str_len - 1] == '0')
|| isspace(str[str_len - 1])))
str_len--; str_len--;
// check valid /* check validity: we must have consumed everything */
if (str_len > 0 || (ch & ~((2 << ((bit_len - 1) % 4)) - 1)) != 0) if (str_len > 0 || (ch & ~((2 << ((bit_len - 1) % 4)) - 1)) != 0)
{ {
LOG_ERROR("value execeeds length"); LOG_ERROR("value execeeds length");