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
<2022>
2023
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
<2022>
2023
2024
|