EPICS Controls Argonne National Laboratory

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 
ANJ, 14 Sep 2022 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·