diff --git a/BasicsC/logging.c b/BasicsC/logging.c index 68e517d9b0..4a53ca18c2 100644 --- a/BasicsC/logging.c +++ b/BasicsC/logging.c @@ -1221,7 +1221,7 @@ static void LogAppenderFile_Log (TRI_log_appender_t* appender, return; } - escaped = TRI_EscapeCString(msg, length, &escapedLength); + escaped = TRI_EscapeControlsCString(msg, length, &escapedLength); WriteLogFile(fd, escaped, escapedLength); WriteLogFile(fd, "\n", 1); diff --git a/BasicsC/strings.c b/BasicsC/strings.c index 3cc3e862f8..a017459b91 100644 --- a/BasicsC/strings.c +++ b/BasicsC/strings.c @@ -710,7 +710,7 @@ int TRI_IntHex (char ch, int errorValue) { } //////////////////////////////////////////////////////////////////////////////// -/// @brief escapes special characters using C escapes +/// @brief escapes constrol characters using C escapes //////////////////////////////////////////////////////////////////////////////// char* TRI_EscapeCString (char const* in, size_t inLength, size_t* outLength) { @@ -782,6 +782,68 @@ char* TRI_EscapeCString (char const* in, size_t inLength, size_t* outLength) { return qtr; } +//////////////////////////////////////////////////////////////////////////////// +/// @brief escapes special characters using C escapes +//////////////////////////////////////////////////////////////////////////////// + +char* TRI_EscapeControlsCString (char const* in, size_t inLength, size_t* outLength) { + char * buffer; + char * qtr; + char const * ptr; + char const * end; + + buffer = TRI_Allocate(4 * inLength + 1); + if (!buffer) { + return NULL; + } + + qtr = buffer; + + for (ptr = in, end = ptr + inLength; ptr < end; ptr++, qtr++) { + uint8_t n; + + switch (*ptr) { + case '\n': + *qtr++ = '\\'; + *qtr = 'n'; + break; + + case '\r': + *qtr++ = '\\'; + *qtr = 'r'; + break; + + default: + n = (uint8_t)(*ptr); + + if (n < 32 || n > 127) { + uint8_t n1 = n >> 4; + uint8_t n2 = n & 0x0F; + + *qtr++ = '\\'; + *qtr++ = 'x'; + *qtr++ = (n1 < 10) ? ('0' + n1) : ('A' + n1 - 10); + *qtr = (n2 < 10) ? ('0' + n2) : ('A' + n2 - 10); + } + else { + *qtr = *ptr; + } + + break; + } + } + + *qtr = '\0'; + *outLength = qtr - buffer; + + qtr = TRI_Allocate(*outLength + 1); + memcpy(qtr, buffer, *outLength + 1); + + TRI_Free(buffer); + + return qtr; +} + //////////////////////////////////////////////////////////////////////////////// /// @brief escapes special characters using unicode escapes //////////////////////////////////////////////////////////////////////////////// diff --git a/BasicsC/strings.h b/BasicsC/strings.h index e92afcf1d0..50d3eef2fa 100644 --- a/BasicsC/strings.h +++ b/BasicsC/strings.h @@ -166,6 +166,12 @@ void TRI_FreeString (char*); int TRI_IntHex (char ch, int errorValue); +//////////////////////////////////////////////////////////////////////////////// +/// @brief escapes special characters using C escapes +//////////////////////////////////////////////////////////////////////////////// + +char* TRI_EscapeControlsCString (char const* in, size_t inLength, size_t* outLength); + //////////////////////////////////////////////////////////////////////////////// /// @brief escapes special characters using C escapes ///