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:
parent
c10b0276da
commit
a019bc48fd
|
@ -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);
|
struct sr_scpi_hw_info **scpi_response);
|
||||||
SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info);
|
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_vendor_alias(const char *raw_vendor);
|
||||||
SR_PRIV const char *sr_scpi_cmd_get(const struct scpi_command *cmdtable,
|
SR_PRIV const char *sr_scpi_cmd_get(const struct scpi_command *cmdtable,
|
||||||
int command);
|
int command);
|
||||||
|
|
|
@ -1139,6 +1139,48 @@ SR_PRIV void sr_scpi_hw_info_free(struct sr_scpi_hw_info *hw_info)
|
||||||
g_free(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)
|
SR_PRIV const char *sr_vendor_alias(const char *raw_vendor)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
Loading…
Reference in New Issue