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:
parent
1dad2ee602
commit
33fc60befc
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue