EPICS Home

Experimental Physics and Industrial Control System


 
2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  <20222023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  <20222023  2024 
<== Date ==> <== Thread ==>

Subject: [Merge] ~dougmurray/epics-base:fix-1943245 into epics-base:7.0
From: Doug Murray via Core-talk <core-talk at aps.anl.gov>
To: mp+422030 at code.launchpad.net
Date: Wed, 11 May 2022 18:45:46 -0000
Doug Murray has proposed merging ~dougmurray/epics-base:fix-1943245 into epics-base:7.0.

Commit message:
Fixes lp: #1943245

Requested reviews:
  EPICS Core Developers (epics-core)

For more details, see:
https://code.launchpad.net/~dougmurray/epics-base/+git/epics-base/+merge/422030
-- 
Your team EPICS Core Developers is requested to review the proposed merge of ~dougmurray/epics-base:fix-1943245 into epics-base:7.0.
diff --git a/modules/libcom/src/misc/epicsString.c b/modules/libcom/src/misc/epicsString.c
index ca61d9b..f2ed928 100644
--- a/modules/libcom/src/misc/epicsString.c
+++ b/modules/libcom/src/misc/epicsString.c
@@ -117,6 +117,82 @@ done:
     return ndst;
 }
 
+/*
+ * expand the given character.
+ * Place the expansion in *dest, which
+ * must be at least 5 characters long
+ *
+ * Returns: number of characters produced.
+ */
+int
+translateEscapedChar( char c, char *dest)
+{
+    static const char hex[] = "0123456789abcdef";
+    char *ptr = dest;
+    int ret = 0;
+
+    if( ptr == NULL)
+        return 0;
+
+    *ptr++ = '\\';
+    switch( c) {
+        default:
+            if( isprint( c & 0xff)) {
+                *--ptr = c;
+                ptr++;
+                ret = 1;
+            } else {
+                *ptr++ = 'x';
+                *ptr++ = hex[(c >> 4) & 0x0f];
+                *ptr++ = hex[ c       & 0x0f];
+                ret = 4;
+            }
+            break;
+
+        case '\a': *ptr++ = 'a';  ret = 2; break;
+        case '\b': *ptr++ = 'b';  ret = 2; break;
+        case '\f': *ptr++ = 'f';  ret = 2; break;
+        case '\n': *ptr++ = 'n';  ret = 2; break;
+        case '\r': *ptr++ = 'r';  ret = 2; break;
+        case '\t': *ptr++ = 't';  ret = 2; break;
+        case '\v': *ptr++ = 'v';  ret = 2; break;
+        case '\\': *ptr++ = '\\'; ret = 2; break;
+        case '\'': *ptr++ = '\''; ret = 2; break;
+        case '\"': *ptr++ = '"';  ret = 2; break;
+        case '\0': *ptr++ = '0';  ret = 2; break;
+    }
+
+    *ptr = 0;
+    return ret;
+}
+
+int
+epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src, size_t srclen)
+{
+    char expanded[6];
+    int remain = dstlen;
+    int cnt = 0;
+
+    if( src == dst)
+            return -1;
+
+    for( int i = 0; i < srclen; i++) {
+        int num = translateEscapedChar( src[i], expanded);
+        if( num < remain) {
+            strcpy( dst, expanded);
+            remain -= num;
+            dst += num;
+        }
+        cnt += num;
+    }
+
+    if( dstlen != 0)
+            *dst = 0;
+    return cnt;
+}
+
+#if 0
+endif /* 0 */
 int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src,
     size_t srclen)
 {
@@ -158,6 +234,8 @@ int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src,
         *dst = '\0';
     return ndst;
 }
+if 0
+#endif /* 0 */
 
 size_t epicsStrnEscapedFromRawSize(const char *src, size_t srclen)
 {
diff --git a/modules/libcom/test/epicsStringTest.c b/modules/libcom/test/epicsStringTest.c
index 7abffa3..185d0b5 100644
--- a/modules/libcom/test/epicsStringTest.c
+++ b/modules/libcom/test/epicsStringTest.c
@@ -155,7 +155,7 @@ MAIN(epicsStringTest)
     char *s;
     int status;
 
-    testPlan(427);
+    testPlan(431);
 
     testChars();
 
@@ -244,10 +244,17 @@ MAIN(epicsStringTest)
 
     memset(result, 'x', sizeof(result));
     status = epicsStrnEscapedFromRaw(result, 4, ABCD, 5);
-    testOk(status == 6,      "esc(\"ABCD\", 5) -> %d (exp. 8)", status);
+    testOk(status == 6,      "esc(\"ABCD\", 5) -> %d (exp. 6)", status);
     testOk(result[3] == 0,   "  0-terminated");
     testOk(result[4] == 'x', "  No overrun");
 
+    memset(result, 'x', sizeof(result));
+    status = epicsStrnEscapedFromRaw(result, 5, "ABC\"DEF", 6);
+    testOk(status == 7,      "esc(\"ABC\\\"DEF\", 5) -> %d (exp. 7)", status);
+    testOk(result[3] != '\\',   "  no partial escape sequence");
+    testOk(result[4] == 0,   "  0-terminated");
+    testOk(result[5] == 'x', "  No overrun");
+
     testDiag("Testing raw = epicsStrnRawFromEscaped(out, 4, ...)");
 
     memset(result, 'x', sizeof(result));

Replies:
Re: [Merge] ~dougmurray/epics-base:fix-1943245 into epics-base:7.0 Andrew Johnson via Core-talk

Navigate by Date:
Prev: Build failed: epics-base base-createImplicit-leak-826 AppVeyor via Core-talk
Next: Re: [Merge] ~dougmurray/epics-base:fix-1943245 into epics-base:7.0 Andrew Johnson via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  <20222023  2024 
Navigate by Thread:
Prev: Build failed: epics-base base-createImplicit-leak-826 AppVeyor via Core-talk
Next: Re: [Merge] ~dougmurray/epics-base:fix-1943245 into epics-base:7.0 Andrew Johnson via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  <20222023  2024