]> sigrok.org Git - libsigrok.git/commitdiff
scpi: introduce string un-quote helper routine
authorGerhard Sittig <redacted>
Wed, 7 Nov 2018 19:22:54 +0000 (20:22 +0100)
committeruser <redacted>
Sat, 10 Nov 2018 17:26:30 +0000 (18:26 +0100)
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.

src/scpi.h
src/scpi/scpi.c

index e55d36f1513880d84a8d6119a92c59abc507a0d1..13b2d3011d543149d80ad56cfb45fe1a0e290527 100644 (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);
index 3700478692229e7a78813c4058fe608beac93ab7..a01e13e037da3575b37c42e935dc5cb91e932cdd 100644 (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;