Merge JSON5 support into 7.0

This commit is contained in:
Andrew Johnson
2021-01-05 21:39:15 -06:00
38 changed files with 1591 additions and 528 deletions
+25 -45
View File
@@ -66,55 +66,34 @@ int epicsStrnRawFromEscaped(char *dst, size_t dstlen, const char *src,
case '\\': OUT('\\'); break;
case '\'': OUT('\''); break;
case '\"': OUT('\"'); break;
case '0' :case '1' :case '2' :case '3' :
case '4' :case '5' :case '6' :case '7' :
{ /* \ooo */
unsigned int u = c - '0';
if (!srclen-- || !(c = *src++)) {
OUT(u); goto done;
}
if (c < '0' || c > '7') {
OUT(u); goto input;
}
u = u << 3 | (c - '0');
if (!srclen-- || !(c = *src++)) {
OUT(u); goto done;
}
if (c < '0' || c > '7') {
OUT(u); goto input;
}
u = u << 3 | (c - '0');
if (u > 0377) {
/* Undefined behaviour! */
}
OUT(u);
}
break;
case '0': OUT('\0'); break;
case 'x' :
{ /* \xXXX... */
{ /* \xXX */
unsigned int u = 0;
if (!srclen-- || !(c = *src++ & 0xff))
goto done;
while (isxdigit(c)) {
u = u << 4 | ((c > '9') ? toupper(c) - 'A' + 10 : c - '0');
if (u > 0xff) {
/* Undefined behaviour! */
}
if (!srclen-- || !(c = *src++ & 0xff)) {
OUT(u);
goto done;
}
if (!isxdigit(c))
goto input;
u = u << 4 | ((c > '9') ? toupper(c) - 'A' + 10 : c - '0');
if (!srclen-- || !(c = *src++ & 0xff)) {
OUT(u);
goto done;
}
if (!isxdigit(c)) {
OUT(u);
goto input;
}
u = u << 4 | ((c > '9') ? toupper(c) - 'A' + 10 : c - '0');
OUT(u);
goto input;
}
break;
default:
OUT(c);
@@ -137,6 +116,7 @@ int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src,
return -1;
while (srclen--) {
static const char hex[] = "0123456789abcdef";
int c = *src++;
#define OUT(chr) ndst++; if (--rem > 0) *dst++ = chr
@@ -151,15 +131,15 @@ int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src,
case '\\': OUT('\\'); OUT('\\'); break;
case '\'': OUT('\\'); OUT('\''); break;
case '\"': OUT('\\'); OUT('\"'); break;
case '\0': OUT('\\'); OUT('0'); break;
default:
if (isprint(c & 0xff)) {
OUT(c);
break;
}
OUT('\\');
OUT('0' + ((c & 0300) >> 6));
OUT('0' + ((c & 0070) >> 3));
OUT('0' + (c & 0007));
OUT('\\'); OUT('x');
OUT(hex[(c >> 4) & 0x0f]);
OUT(hex[ c & 0x0f]);
}
#undef OUT
}
@@ -178,7 +158,7 @@ size_t epicsStrnEscapedFromRawSize(const char *src, size_t srclen)
switch (c) {
case '\a': case '\b': case '\f': case '\n':
case '\r': case '\t': case '\v': case '\\':
case '\'': case '\"':
case '\'': case '\"': case '\0':
ndst++;
break;
default:
@@ -258,7 +238,7 @@ int epicsStrPrintEscaped(FILE *fp, const char *s, size_t len)
if (isprint(0xff & (int)c))
nout += fprintf(fp, "%c", c);
else
nout += fprintf(fp, "\\%03o", (unsigned char)c);
nout += fprintf(fp, "\\x%02x", (unsigned char)c);
break;
}
}