scpi: introduce string un-quote helper routine

The SCPI protocol may communicate strings in quoted form, enclosed by a
matching pair of single or double quote characters, and occurances of
this very quote character within the string get doubled (escaped). Add a
common routine to undo the quotes.
This commit is contained in:
Gerhard Sittig 2018-11-07 20:22:54 +01:00 committed by user
parent c10b0276da
commit a019bc48fd
2 changed files with 44 additions and 0 deletions

View File

@ -149,6 +149,8 @@ SR_PRIV int sr_scpi_get_hw_id(struct sr_scpi_dev_inst *scpi,
struct sr_scpi_hw_info **scpi_response);
SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
SR_PRIV const char *sr_scpi_unquote_string(char *s);
SR_PRIV const char *sr_vendor_alias(const char *raw_vendor);
SR_PRIV const char *sr_scpi_cmd_get(const struct scpi_command *cmdtable,
int command);

View File

@ -1139,6 +1139,48 @@ SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info)
g_free(hw_info);
}
/**
* Remove potentially enclosing pairs of quotes, un-escape content.
* This implementation modifies the caller's buffer when quotes are found
* and doubled quote characters need to get removed from the content.
*
* @param[in, out] s The SCPI string to check and un-quote.
*
* @return The start of the un-quoted string.
*/
SR_PRIV const char *sr_scpi_unquote_string(char *s)
{
size_t s_len;
char quotes[3];
char *rdptr;
/* Immediately bail out on invalid or short input. */
if (!s || !*s)
return s;
s_len = strlen(s);
if (s_len < 2)
return s;
/* Check for matching quote characters front and back. */
if (s[0] != '\'' && s[0] != '"')
return s;
if (s[0] != s[s_len - 1])
return s;
/* Need to strip quotes, and un-double quote chars inside. */
quotes[0] = quotes[1] = *s;
quotes[2] = '\0';
s[s_len - 1] = '\0';
s++;
rdptr = s;
while ((rdptr = strstr(rdptr, quotes)) != NULL) {
memmove(rdptr, rdptr + 1, strlen(rdptr));
rdptr++;
}
return s;
}
SR_PRIV const char *sr_vendor_alias(const char *raw_vendor)
{
unsigned int i;