mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
optimizations + bug fixing
This commit is contained in:
parent
01a9d05b5b
commit
1cc10c952b
|
@ -319,8 +319,10 @@ extern U_EXPORT int32_t u_printf_string_max_length;
|
|||
|
||||
/* NB: u_printf(), u_vsnprintf and u_snprintf conflit with /usr/include/unicode/urename.h */
|
||||
|
||||
U_EXPORT void u__printf(int fd, const char* restrict format, ...);
|
||||
U_EXPORT void u_internal_print(bool abrt, const char* restrict format, ...);
|
||||
U_EXPORT void u__printf(int fd, const char* restrict format, ...);
|
||||
U_EXPORT void u_internal_print(bool abrt, const char* restrict format, ...);
|
||||
|
||||
U_EXPORT uint32_t u_sprintc( char* restrict buffer, unsigned char c);
|
||||
U_EXPORT uint32_t u__snprintf( char* restrict buffer, uint32_t buffer_size, const char* restrict format, ...);
|
||||
U_EXPORT uint32_t u__vsnprintf(char* restrict buffer, uint32_t buffer_size, const char* restrict format, va_list argp);
|
||||
|
||||
|
|
|
@ -24,27 +24,23 @@ extern "C" {
|
|||
* ---------------------------------------------------------------------------
|
||||
* Encode-Decode escape sequences into a buffer, the following are recognized:
|
||||
* ---------------------------------------------------------------------------
|
||||
* \0 NUL
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \a BEL (\007 7 7)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \e ESC character (\033 27 1B)
|
||||
*
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
U_EXPORT uint32_t u_sprintc(char* restrict buffer, unsigned char c);
|
||||
U_EXPORT unsigned char u_escape_decode_ptr(const char** restrict s);
|
||||
|
||||
U_EXPORT uint32_t u_escape_encode(const unsigned char* restrict s, uint32_t n, char* restrict result, uint32_t max_length, bool json);
|
||||
U_EXPORT uint32_t u_escape_encode(const unsigned char* restrict s, uint32_t n, char* restrict result, uint32_t max_length);
|
||||
U_EXPORT uint32_t u_escape_decode(const char* restrict s, uint32_t n, unsigned char* restrict result);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -495,6 +495,7 @@ protected:
|
|||
private:
|
||||
static void appendNode(UValue* parent, UValue* child);
|
||||
static bool readValue(UTokenizer& tok, UValue* value) U_NO_EXPORT;
|
||||
static uint32_t emitString(const unsigned char* ptr, uint32_t sz, char* presult) U_NO_EXPORT;
|
||||
|
||||
template <class T> friend class UVector;
|
||||
template <class T> friend class UHashMap;
|
||||
|
|
|
@ -77,6 +77,7 @@ class UDES3;
|
|||
class UHTTP;
|
||||
class UValue;
|
||||
class UCache;
|
||||
class UValue;
|
||||
class UString;
|
||||
class UBase64;
|
||||
class UEscape;
|
||||
|
@ -612,6 +613,7 @@ private:
|
|||
friend class UDES3;
|
||||
friend class UHTTP;
|
||||
friend class UCache;
|
||||
friend class UValue;
|
||||
friend class UString;
|
||||
friend class UBase64;
|
||||
friend class UEscape;
|
||||
|
|
|
@ -22,40 +22,39 @@
|
|||
* ---------------------------------------------------------------------------
|
||||
* Encode-Decode escape sequences into a buffer, the following are recognized:
|
||||
* ---------------------------------------------------------------------------
|
||||
* \0 NUL
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \a BEL (\007 7 7)
|
||||
* \e ESC character (\033 27 1B)
|
||||
* \a BEL (\007 7 7)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \e ESC character (\033 27 1B)
|
||||
*
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
struct U_EXPORT UEscape {
|
||||
|
||||
static void encode(const char* s, uint32_t n, UString& buffer, bool json = false)
|
||||
static void encode(const char* s, uint32_t n, UString& buffer)
|
||||
{
|
||||
U_TRACE(0, "UEscape::encode(%.*S,%u,%p,%b)", n, s, n, &buffer, json)
|
||||
U_TRACE(0, "UEscape::encode(%.*S,%u,%p)", n, s, n, &buffer)
|
||||
|
||||
U_ASSERT(buffer.uniq())
|
||||
U_ASSERT(buffer.capacity() >= n)
|
||||
|
||||
uint32_t sz = buffer.size();
|
||||
|
||||
buffer.rep->_length = sz + u_escape_encode((const unsigned char*)s, n, buffer.c_pointer(sz), buffer.space(), json);
|
||||
buffer.rep->_length = sz + u_escape_encode((const unsigned char*)s, n, buffer.c_pointer(sz), buffer.space());
|
||||
|
||||
U_INTERNAL_DUMP("buffer(%u) = %#V", buffer.size(), buffer.rep)
|
||||
}
|
||||
|
||||
static void encode(const UString& s, UString& buffer, bool json = false) { encode(U_STRING_TO_PARAM(s), buffer, json); }
|
||||
static void encode(const UString& s, UString& buffer) { encode(U_STRING_TO_PARAM(s), buffer); }
|
||||
|
||||
static void decode(const char* s, uint32_t n, UString& buffer)
|
||||
{
|
||||
|
|
|
@ -1248,6 +1248,129 @@ void u_internal_print(bool abrt, const char* restrict format, ...)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------
|
||||
* Encode escape sequences into a buffer, the following are recognized:
|
||||
* --------------------------------------------------------------------
|
||||
* \a BEL (\007 7 7)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \e ESC character (\033 27 1B)
|
||||
*
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* --------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
uint32_t u_sprintc(char* restrict out, unsigned char c)
|
||||
{
|
||||
char* restrict cp;
|
||||
|
||||
U_INTERNAL_TRACE("u_sprintc(%d)", c)
|
||||
|
||||
if (c < 32)
|
||||
{
|
||||
*out++ = '\\';
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\a': // 0x07
|
||||
{
|
||||
*out = 'a';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\b': // 0x08
|
||||
{
|
||||
*out = 'b';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\t': // 0x09
|
||||
{
|
||||
*out = 't';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\n': // 0x0A
|
||||
{
|
||||
*out = 'n';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\v': // 0x0B
|
||||
{
|
||||
*out = 'v';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\f': // 0x0C
|
||||
{
|
||||
*out = 'f';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\r': // 0x0D
|
||||
{
|
||||
*out = 'r';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\033': // 0x1B
|
||||
{
|
||||
*out = 'e';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
default: goto next;
|
||||
}
|
||||
}
|
||||
|
||||
if (c == '"' || // 0x22
|
||||
c == '\\') // 0x5C
|
||||
{
|
||||
*out++ = '\\';
|
||||
*out = c;
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (c > 126)
|
||||
{
|
||||
*out++ = '\\';
|
||||
|
||||
/* \DDD number formed of 1-3 octal digits */
|
||||
next:
|
||||
cp = out + 3;
|
||||
|
||||
do {
|
||||
*--cp = (c & 7) + '0';
|
||||
|
||||
c >>= 3;
|
||||
}
|
||||
while (c);
|
||||
|
||||
while (--cp >= out) *cp = '0';
|
||||
|
||||
return 4;
|
||||
}
|
||||
|
||||
*out = c;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef _MSWINDOWS_
|
||||
static const char* tab_color[] = { U_RESET_STR,
|
||||
U_BLACK_STR, U_RED_STR, U_GREEN_STR, U_YELLOW_STR,
|
||||
|
|
|
@ -18,120 +18,13 @@
|
|||
#include <ulib/base/utility.h>
|
||||
#include <ulib/base/coder/escape.h>
|
||||
|
||||
/**
|
||||
* ---------------------------------------------------------------------------
|
||||
* Encode-Decode escape sequences into a buffer, the following are recognized:
|
||||
* ---------------------------------------------------------------------------
|
||||
* \0 NUL
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \a BEL (\007 7 7)
|
||||
* \e ESC character (\033 27 1B)
|
||||
*
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
uint32_t u_sprintc(char* restrict _buffer, unsigned char c)
|
||||
uint32_t u_escape_encode(const unsigned char* restrict inptr, uint32_t len, char* restrict out, uint32_t max_output)
|
||||
{
|
||||
U_INTERNAL_TRACE("u_sprintc(%d)", c)
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\r':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = 'r';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\n':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = 'n';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\t':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = 't';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\b':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = 'b';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '\f':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = 'f';
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
case '"':
|
||||
case '\\':
|
||||
{
|
||||
*_buffer++ = '\\';
|
||||
*_buffer = c;
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
if (c < 32 ||
|
||||
c > 126)
|
||||
{
|
||||
/* \DDD number formed of 1-3 octal digits */
|
||||
|
||||
char* restrict cp = _buffer + 4;
|
||||
|
||||
*_buffer = '\\';
|
||||
|
||||
do {
|
||||
*--cp = (c & 7) + '0';
|
||||
|
||||
c >>= 3;
|
||||
}
|
||||
while (c);
|
||||
|
||||
while (--cp > _buffer) *cp = '0';
|
||||
|
||||
return 4;
|
||||
}
|
||||
|
||||
*_buffer = c;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t u_escape_encode(const unsigned char* restrict inptr, uint32_t len, char* restrict out, uint32_t max_output, bool json)
|
||||
{
|
||||
unsigned char c;
|
||||
const unsigned char* restrict inend = inptr + len;
|
||||
char* restrict outptr = out;
|
||||
char* restrict outend = out + (max_output - 4);
|
||||
|
||||
U_INTERNAL_TRACE("u_escape_encode(%.*s,%u,%p,%u,%d)", U_min(len,128), inptr, len, out, max_output, json)
|
||||
U_INTERNAL_TRACE("u_escape_encode(%.*s,%u,%p,%u)", U_min(len,128), inptr, len, out, max_output)
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(out)
|
||||
U_INTERNAL_ASSERT_POINTER(inptr)
|
||||
|
@ -140,59 +33,10 @@ uint32_t u_escape_encode(const unsigned char* restrict inptr, uint32_t len, char
|
|||
|
||||
while (inptr < inend)
|
||||
{
|
||||
c = *inptr++;
|
||||
outptr += u_sprintc(outptr, *inptr++);
|
||||
|
||||
if (c >= 32 &&
|
||||
c <= 126)
|
||||
{
|
||||
if (u__isquote(c))
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
|
||||
/* check for \u four-hex-digits (unicode char) */
|
||||
|
||||
if (json &&
|
||||
c == '\\' &&
|
||||
*inptr == 'u')
|
||||
{
|
||||
c = 'u';
|
||||
|
||||
++inptr;
|
||||
}
|
||||
}
|
||||
|
||||
*outptr++ = c;
|
||||
|
||||
goto check_max_output;
|
||||
}
|
||||
|
||||
if (json)
|
||||
{
|
||||
/* \u four-hex-digits (unicode char) */
|
||||
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 'u';
|
||||
*outptr++ = '0';
|
||||
*outptr++ = '0';
|
||||
*outptr++ = u_hex_upper[((c >> 4) & 0x0F)];
|
||||
*outptr++ = u_hex_upper[( c & 0x0F)];
|
||||
|
||||
# ifdef DEBUG
|
||||
goto check_max_output;
|
||||
# else
|
||||
continue;
|
||||
# endif
|
||||
}
|
||||
|
||||
outptr += u_sprintc(outptr, c);
|
||||
|
||||
check_max_output:
|
||||
if (outptr >= outend)
|
||||
{
|
||||
# ifdef DEBUG
|
||||
if (json) U_INTERNAL_ASSERT_MSG(false, "overflow in encoding json string...")
|
||||
# endif
|
||||
|
||||
*outptr++ = '.';
|
||||
*outptr++ = '.';
|
||||
*outptr++ = '.';
|
||||
|
@ -207,84 +51,29 @@ check_max_output:
|
|||
return (outptr - out);
|
||||
}
|
||||
|
||||
/* the s pointer is advanced past the escape sequence */
|
||||
|
||||
unsigned char u_escape_decode_ptr(const char** restrict s)
|
||||
{
|
||||
const char* restrict t = *s;
|
||||
int c = *t++;
|
||||
|
||||
U_INTERNAL_TRACE("u_escape_decode_ptr(%s)", *s)
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'r': c = '\r'; break;
|
||||
case 'n': c = '\n'; break;
|
||||
case 't': c = '\t'; break;
|
||||
case 'b': c = '\b'; break;
|
||||
case 'f': c = '\f'; break;
|
||||
case 'v': c = '\v'; break;
|
||||
case 'a': c = '\a'; break;
|
||||
case 'e': c = '\033'; break;
|
||||
|
||||
/* check control code */
|
||||
|
||||
case '^': c = u__toupper(*t++) - '@'; break;
|
||||
|
||||
/* check sequenza escape esadecimale */
|
||||
|
||||
case 'x':
|
||||
{
|
||||
if (u__isxdigit(*t))
|
||||
{
|
||||
c = u__hexc2int(*t++);
|
||||
if (u__isxdigit(*t)) c = (c << 4) | u__hexc2int(*t++);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* check sequenza escape ottale */
|
||||
|
||||
case '0': case '1': case '2': case '3':
|
||||
case '4': case '5': case '6': case '7':
|
||||
{
|
||||
c -= '0';
|
||||
|
||||
if (u__isoctal(*t))
|
||||
{
|
||||
c = (c << 3) | u__octc2int(*t++);
|
||||
if (u__isoctal(*t)) c = (c << 3) | u__octc2int(*t++);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* \u four-hex-digits (unicode char) */
|
||||
|
||||
case 'u':
|
||||
{
|
||||
U_INTERNAL_ASSERT_EQUALS(t[0], '0')
|
||||
U_INTERNAL_ASSERT_EQUALS(t[1], '0')
|
||||
|
||||
t += 2;
|
||||
|
||||
U_INTERNAL_ASSERT(u__isxdigit(t[0]))
|
||||
U_INTERNAL_ASSERT(u__isxdigit(t[1]))
|
||||
|
||||
c = ((u__hexc2int(t[0]) & 0x0F) << 4) |
|
||||
(u__hexc2int(t[1]) & 0x0F);
|
||||
|
||||
t += 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
*s = t;
|
||||
|
||||
return (unsigned char)c;
|
||||
}
|
||||
/**
|
||||
* --------------------------------------------------------------------
|
||||
* Decode escape sequences into a buffer, the following are recognized:
|
||||
* --------------------------------------------------------------------
|
||||
* \a BEL (\007 7 7)
|
||||
* \b BS backspace (\010 8 8)
|
||||
* \t HT horizontal tab (\011 9 9)
|
||||
* \n LF newline (\012 10 A)
|
||||
* \v VT vertical tab (\013 11 B)
|
||||
* \f FF formfeed (\014 12 C)
|
||||
* \r CR carriage return (\015 13 D)
|
||||
* \e ESC character (\033 27 1B)
|
||||
*
|
||||
* \u four-hex-digits (unicode char)
|
||||
* \^C C = any letter (Control code)
|
||||
* \xDD number formed of 1-2 hex digits
|
||||
* \DDD number formed of 1-3 octal digits
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
uint32_t u_escape_decode(const char* restrict inptr, uint32_t len, unsigned char* restrict out)
|
||||
{
|
||||
int c;
|
||||
char* p;
|
||||
const char* restrict inend = inptr + len;
|
||||
unsigned char* restrict outptr = out;
|
||||
|
@ -324,14 +113,80 @@ uint32_t u_escape_decode(const char* restrict inptr, uint32_t len, unsigned char
|
|||
{
|
||||
u__memcpy(outptr, p, 6, __PRETTY_FUNCTION__);
|
||||
|
||||
inptr = p + 6;
|
||||
inptr = p+6;
|
||||
outptr += 6;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
inptr = p + 1;
|
||||
*outptr++ = u_escape_decode_ptr((const char** restrict)&inptr);
|
||||
inptr = p+1;
|
||||
c = *inptr++;
|
||||
|
||||
U_INTERNAL_PRINT("c = %d", c)
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'a': c = '\a'; break;
|
||||
case 'b': c = '\b'; break;
|
||||
case 't': c = '\t'; break;
|
||||
case 'n': c = '\n'; break;
|
||||
case 'v': c = '\v'; break;
|
||||
case 'f': c = '\f'; break;
|
||||
case 'r': c = '\r'; break;
|
||||
case 'e': c = '\033'; break;
|
||||
|
||||
/* check control code */
|
||||
|
||||
case '^': c = u__toupper(*inptr++) - '@'; break;
|
||||
|
||||
/* check sequenza escape esadecimale */
|
||||
|
||||
case 'x':
|
||||
{
|
||||
if (u__isxdigit(*inptr))
|
||||
{
|
||||
c = u__hexc2int(*inptr++);
|
||||
if (u__isxdigit(*inptr)) c = (c << 4) | u__hexc2int(*inptr++);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* check sequenza escape ottale */
|
||||
|
||||
case '0': case '1': case '2': case '3':
|
||||
case '4': case '5': case '6': case '7':
|
||||
{
|
||||
c -= '0';
|
||||
|
||||
if (u__isoctal(*inptr))
|
||||
{
|
||||
c = (c << 3) | u__octc2int(*inptr++);
|
||||
if (u__isoctal(*inptr)) c = (c << 3) | u__octc2int(*inptr++);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* \u four-hex-digits (unicode char) */
|
||||
|
||||
case 'u':
|
||||
{
|
||||
U_INTERNAL_ASSERT_EQUALS(inptr[0], '0')
|
||||
U_INTERNAL_ASSERT_EQUALS(inptr[1], '0')
|
||||
|
||||
inptr += 2;
|
||||
|
||||
U_INTERNAL_ASSERT(u__isxdigit(inptr[0]))
|
||||
U_INTERNAL_ASSERT(u__isxdigit(inptr[1]))
|
||||
|
||||
c = ((u__hexc2int(inptr[0]) & 0x0F) << 4) |
|
||||
(u__hexc2int(inptr[1]) & 0x0F);
|
||||
|
||||
inptr += 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
*outptr++ = c;
|
||||
}
|
||||
|
||||
*outptr = 0;
|
||||
|
|
|
@ -212,7 +212,11 @@ void UTrace::trace_sysreturn(bool error, const char* format, ...)
|
|||
u_errno = errno;
|
||||
}
|
||||
|
||||
if (errno != EAGAIN) U_WARNING("%s", buffer_syscall);
|
||||
if (errno != EAGAIN &&
|
||||
strstr(buffer_syscall, "::getenv") == 0)
|
||||
{
|
||||
U_WARNING("%s", buffer_syscall);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -567,6 +567,97 @@ uint32_t UValue::getMemberNames(UVector<UString>& members) const
|
|||
U_RETURN(_size);
|
||||
}
|
||||
|
||||
uint32_t UValue::emitString(const unsigned char* inptr, uint32_t len, char* out)
|
||||
{
|
||||
U_TRACE(0, "UValue::emitString(%.*S,%u,%p)", len, inptr, len, out)
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(out)
|
||||
U_INTERNAL_ASSERT_POINTER(inptr)
|
||||
|
||||
const unsigned char* restrict inend = inptr + len;
|
||||
char* restrict outptr = out;
|
||||
|
||||
*outptr++ = '"';
|
||||
|
||||
while (inptr < inend)
|
||||
{
|
||||
unsigned char c = *inptr++;
|
||||
|
||||
if (c < 32)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '\b': // 0x08
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 'b';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
case '\t': // 0x09
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 't';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
case '\n': // 0x0A
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 'n';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
case '\f': // 0x0C
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 'f';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
case '\r': // 0x0D
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
*outptr++ = 'r';
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
default: goto next;
|
||||
}
|
||||
}
|
||||
else if (c <= 126)
|
||||
{
|
||||
if (c == '"' || // 0x22
|
||||
c == '\\') // 0x5C
|
||||
{
|
||||
*outptr++ = '\\';
|
||||
}
|
||||
|
||||
*outptr++ = c;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
next: // \u four-hex-digits (unicode char)
|
||||
|
||||
*(int32_t*)outptr = U_MULTICHAR_CONSTANT32('\\','u','0','0');
|
||||
|
||||
outptr[4] = u_hex_upper[((c >> 4) & 0x0F)];
|
||||
outptr[5] = u_hex_upper[( c & 0x0F)];
|
||||
|
||||
outptr += 6;
|
||||
}
|
||||
|
||||
*outptr++ = '"';
|
||||
|
||||
U_RETURN(outptr - out);
|
||||
}
|
||||
|
||||
void UValue::stringify(UString& result, UValue& _value)
|
||||
{
|
||||
U_TRACE(0, "UValue::stringify(%V,%p)", result.rep, &_value)
|
||||
|
@ -601,7 +692,6 @@ void UValue::stringify(UString& result, UValue& _value)
|
|||
const char* ch;
|
||||
char buffer[32];
|
||||
UString* pstring;
|
||||
const char* keyptr;
|
||||
const char* last_nonzero;
|
||||
uint32_t n, pos, sz, keysz;
|
||||
|
||||
|
@ -703,7 +793,7 @@ next:
|
|||
continue;
|
||||
}
|
||||
|
||||
if (c == '.') n = last_nonzero - buffer + 2; // Truncate zeroes to save bytes in output, but keep one)
|
||||
if (c == '.') n = last_nonzero - buffer + 2; // Truncate zeroes to save bytes in output, but keep one
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -716,9 +806,11 @@ next:
|
|||
case_string:
|
||||
pstring = _value.getString();
|
||||
|
||||
(void) result.reserve(result.size() + pstring->size() * 6);
|
||||
(void) result.reserve((sz = result.size()) + (keysz = pstring->size()) * 6);
|
||||
|
||||
UEscape::encode(*pstring, result, true);
|
||||
presult = result.c_pointer(sz);
|
||||
|
||||
result.rep->_length = sz + emitString((const unsigned char*)pstring->data(), keysz, presult);
|
||||
|
||||
return;
|
||||
|
||||
|
@ -743,14 +835,9 @@ case_object:
|
|||
|
||||
for (UValue* member = _value.children.head; member; member = member->next)
|
||||
{
|
||||
sz = result.size();
|
||||
|
||||
U_INTERNAL_ASSERT_POINTER(member->key)
|
||||
|
||||
keysz = member->key->size();
|
||||
keyptr = member->key->data();
|
||||
|
||||
(void) result.reserve(sz + keysz * 6);
|
||||
(void) result.reserve((sz = result.size()) + (keysz = member->key->size()) * 6);
|
||||
|
||||
presult = result.c_pointer(sz);
|
||||
|
||||
|
@ -762,11 +849,11 @@ case_object:
|
|||
*presult++ = ',';
|
||||
}
|
||||
|
||||
pos = u_escape_encode((const unsigned char*)keyptr, keysz, presult, result.space(), true);
|
||||
pos = emitString((const unsigned char*)member->key->data(), keysz, presult);
|
||||
|
||||
presult[pos] = ':';
|
||||
|
||||
result.size_adjust(sz + 1 + pos);
|
||||
result.rep->_length = sz + pos + 1;
|
||||
|
||||
stringify(result, *member);
|
||||
}
|
||||
|
|
|
@ -1532,10 +1532,11 @@ void UNoCatPlugIn::addPeerInfo(time_t logout)
|
|||
|
||||
char* ptr;
|
||||
char buffer[64];
|
||||
UString info = (*vinfo_data)[U_peer_index_AUTH];
|
||||
UString info = (*vinfo_data)[U_peer_index_AUTH],
|
||||
str = UStringExt::substitute(peer->mac, ':', U_CONSTANT_TO_PARAM("%3A"));
|
||||
uint32_t sz = info.size();
|
||||
|
||||
U_INTERNAL_DUMP("U_peer_index_AUTH = %u info = %V", U_peer_index_AUTH, info.rep)
|
||||
U_INTERNAL_DUMP("U_peer_index_AUTH = %u info = %V peer->ip = %V", U_peer_index_AUTH, info.rep, peer->ip.rep)
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------------------------
|
||||
// $1 -> mac
|
||||
|
@ -1552,10 +1553,10 @@ void UNoCatPlugIn::addPeerInfo(time_t logout)
|
|||
|
||||
(void) info.reserve(sz + 200);
|
||||
|
||||
info.snprintf_add("%sMac=%.*s&ip=%v&", (sz ? "&" : ""), u_url_encode((const unsigned char*)U_STRING_TO_PARAM(peer->mac), (unsigned char*)buffer), buffer, peer->ip.rep);
|
||||
info.snprintf_add("%sMac=%v&ip=%v&", (sz ? "&" : ""), str.rep, peer->ip.rep);
|
||||
|
||||
info.snprintf_add("gateway=%.*s&ap=%v%%40%v&User=",
|
||||
u_url_encode((const unsigned char*)U_STRING_TO_PARAM(peer->gateway), (unsigned char*)buffer), buffer, peer->label.rep, UServer_Base::IP_address);
|
||||
u_url_encode((const unsigned char*)U_STRING_TO_PARAM(peer->gateway), (unsigned char*)buffer), buffer, peer->label.rep, UServer_Base::IP_address->rep);
|
||||
|
||||
info.snprintf_add("%.*s&logout=", u_url_encode((const unsigned char*)U_STRING_TO_PARAM(peer->user), (unsigned char*)buffer), buffer);
|
||||
|
||||
|
@ -1625,7 +1626,7 @@ bool UModNoCatPeer::checkPeerInfo(bool btraffic)
|
|||
}
|
||||
}
|
||||
|
||||
U_INTERNAL_DUMP("UNoCatPlugIn::peer_present_in_arp_cache = %V peer->ifname = %V", UNoCatPlugIn::peer_present_in_arp_cache, ifname.rep)
|
||||
U_INTERNAL_DUMP("UNoCatPlugIn::peer_present_in_arp_cache = %V peer->ifname = %V", UNoCatPlugIn::peer_present_in_arp_cache->rep, ifname.rep)
|
||||
|
||||
if (ctraffic == 0) time_no_traffic += (u_now->tv_sec - ctime);
|
||||
|
||||
|
@ -2658,7 +2659,7 @@ google: (void) buffer.assign(U_CONSTANT_TO_PARAM("http://www.google.com"));
|
|||
{
|
||||
UString printable(data.size() * 4);
|
||||
|
||||
UEscape::encode(data, printable, false);
|
||||
UEscape::encode(data, printable);
|
||||
|
||||
ULog::log("%sauth message: %v", UServer_Base::mod_name[0], printable.rep);
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ public:
|
|||
|
||||
UString tmp(token.size() * 4);
|
||||
|
||||
UEscape::encode(token, tmp, false);
|
||||
UEscape::encode(token, tmp);
|
||||
|
||||
(void) buffer.reserve(tmp.size() + 100U);
|
||||
|
||||
|
@ -510,7 +510,7 @@ public:
|
|||
|
||||
UString encoded(header.size() * 4);
|
||||
|
||||
UEscape::encode(header, encoded, false);
|
||||
UEscape::encode(header, encoded);
|
||||
|
||||
UString tmp(encoded.size() + 100U);
|
||||
|
||||
|
|
|
@ -10008,7 +10008,7 @@ U_EXPORT ostream& operator<<(ostream& os, const UHTTP::UFileCacheData& d)
|
|||
d.mime_index == U_jpg ||
|
||||
d.mime_index == U_ico
|
||||
? u_base64_encode((const unsigned char*)U_STRING_TO_PARAM(str), (unsigned char*)buffer)
|
||||
: u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer), false));
|
||||
: u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer)));
|
||||
|
||||
os.put('\n');
|
||||
os.write(buffer, pos);
|
||||
|
@ -10016,7 +10016,7 @@ U_EXPORT ostream& operator<<(ostream& os, const UHTTP::UFileCacheData& d)
|
|||
|
||||
str = d.array->at(1); // header
|
||||
|
||||
pos = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer), false);
|
||||
pos = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer));
|
||||
|
||||
os.put('\n');
|
||||
os.write(buffer, pos);
|
||||
|
@ -10035,7 +10035,7 @@ U_EXPORT ostream& operator<<(ostream& os, const UHTTP::UFileCacheData& d)
|
|||
|
||||
str = d.array->at(3); // gzip(header)
|
||||
|
||||
pos = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer), false);
|
||||
pos = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(str), buffer, sizeof(buffer));
|
||||
|
||||
os.put('\n');
|
||||
os.write(buffer, pos);
|
||||
|
|
|
@ -99,7 +99,7 @@ U_EXPORT ostream& operator<<(ostream& os, const UXMLElement& e)
|
|||
(void) os.write(U_CONSTANT_TO_PARAM(" VALUE = "));
|
||||
|
||||
char buffer[4096];
|
||||
uint32_t len = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(e.value), buffer, sizeof(buffer), false);
|
||||
uint32_t len = u_escape_encode((const unsigned char*)U_STRING_TO_PARAM(e.value), buffer, sizeof(buffer));
|
||||
|
||||
(void) os.write(buffer, len);
|
||||
}
|
||||
|
|
|
@ -27,13 +27,16 @@ static int display_char(char* output, int what)
|
|||
{
|
||||
switch (what)
|
||||
{
|
||||
case '\r': return sprintf(output, "\\r");
|
||||
case '\n': return sprintf(output, "\\n");
|
||||
case '\t': return sprintf(output, "\\t");
|
||||
case '\b': return sprintf(output, "\\b");
|
||||
case '\f': return sprintf(output, "\\f");
|
||||
case '\\': return sprintf(output, "\\\\");
|
||||
case '"': return sprintf(output, "\\\"");
|
||||
case '\a': return sprintf(output, "\\a");
|
||||
case '\b': return sprintf(output, "\\b");
|
||||
case '\t': return sprintf(output, "\\t");
|
||||
case '\n': return sprintf(output, "\\n");
|
||||
case '\v': return sprintf(output, "\\v");
|
||||
case '\f': return sprintf(output, "\\f");
|
||||
case '\r': return sprintf(output, "\\r");
|
||||
case '\033': return sprintf(output, "\\e");
|
||||
case '\\': return sprintf(output, "\\\\");
|
||||
case '"': return sprintf(output, "\\\"");
|
||||
default:
|
||||
if ((what<32) || (what>126)) return sprintf(output, "\\%03o", (unsigned char)what);
|
||||
else return sprintf(output, "%c", what);
|
||||
|
@ -145,7 +148,7 @@ int main(int argc, char* argv[])
|
|||
u__snprintf(buffer, 4096, "test - %r", EX_PROTOCOL);
|
||||
if (strcmp(buf, buffer)) goto failed;
|
||||
|
||||
len = u_escape_encode((unsigned char*)U_CONSTANT_TO_PARAM("stringa che continua 01234567890"), buf, 25, false);
|
||||
len = u_escape_encode((unsigned char*)U_CONSTANT_TO_PARAM("stringa che continua 01234567890"), buf, 25);
|
||||
buf[len] = '\0';
|
||||
strcpy(buffer, "\"stringa che continua...\"");
|
||||
if (strcmp(buf, buffer)) goto failed;
|
||||
|
@ -165,8 +168,6 @@ int main(int argc, char* argv[])
|
|||
|
||||
for (c = 0; c < 256; ++c) ptr += u_sprintc(ptr, c);
|
||||
|
||||
/* u_sprintc() = \\000\\001\\002\\003\\004\\005\\006\\007\\b\\t\\n\\013\\f\\r\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037 !\"#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377; */
|
||||
|
||||
if (strcmp(buf, buffer)) goto failed;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,20 +1,19 @@
|
|||
test_memerror: WARNING: 17/05/15 20:15:45 (pid 8956) we are going to allocate 64 MB (pid 8956) - address space usage: 122.45 MBytes - rss usage: 7.90 MBytes
|
||||
test_memerror: WARNING: 17/05/15 20:15:45 (pid 8956) ::getenv("TMPDIR") = (null)
|
||||
{Call main(1,0x7ffd1c0202d8)
|
||||
test_memerror: WARNING: 30/05/15 16:03:57 (pid 19575) we are going to allocate 64 MB (pid 19575) - address space usage: 122.48 MBytes - rss usage: 7.78 MBytes
|
||||
{Call main(1,0x7fffd71b9218)
|
||||
test_memerror: ERROR ON MEMORY
|
||||
-------------------------------------
|
||||
pid: 8956
|
||||
pid: 19575
|
||||
file: test_memerror.cpp
|
||||
line: 26
|
||||
function: UInt::operator int() const
|
||||
assertion: "((this)->memory.invariant())" [pobj = 0x1f627a0 _this = (nil) - FMR]
|
||||
assertion: "((this)->memory.invariant())" [pobj = 0x24717a0 _this = (nil) - FMR]
|
||||
-------------------------------------
|
||||
test_memerror: ERROR ON MEMORY
|
||||
-------------------------------------
|
||||
pid: 8956
|
||||
pid: 19575
|
||||
file: ../../include/ulib/debug/error_memory.h
|
||||
line: 28
|
||||
function: UMemoryError::~UMemoryError()
|
||||
assertion: "(invariant())" [pobj = 0x7ffd1c01f9c0 _this = 0xa1b2c3d000000ff - ABW]
|
||||
assertion: "(invariant())" [pobj = 0x7fffd71b8900 _this = 0xa1b2c3d000000ff - ABW]
|
||||
-------------------------------------
|
||||
}Return main(1,0x7ffd1c0202d8) = 0
|
||||
}Return main(1,0x7fffd71b9218) = 0
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
test_trace: WARNING: (pid 18895) we are going to allocate 64 MB (pid 18895) - address space usage: 115.60 MBytes - rss usage: 7.36 MBytes
|
||||
test_trace: WARNING: (pid 18895) ::getenv("TMPDIR") = (null)
|
||||
test_trace: WARNING: 30/05/15 16:03:58 (pid 19663) we are going to allocate 64 MB (pid 19663) - address space usage: 122.40 MBytes - rss usage: 7.77 MBytes
|
||||
{Call main(2)
|
||||
{Call routine1(2,3)
|
||||
}Return routine1(2,3) = 6
|
||||
c = 6
|
||||
::signal(4,0x401660) = (nil)
|
||||
::signal(4,0x401710) = (nil)
|
||||
{Call manage_sigpipe(4)
|
||||
::open("/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp/tmp"...,2,438) = -1 - ENOENT (2, No such file or directory)
|
||||
::open("tmp/prova",66,438) = 5
|
||||
|
@ -12,10 +11,10 @@ test_trace: WARNING: (pid 18895) ::getenv("TMPDIR") = (null)
|
|||
::raise(4) = 0
|
||||
result raise() = 0
|
||||
test_stat() = -1
|
||||
test_stat() = 0
|
||||
test_stat() = 0
|
||||
test_stat() = 0
|
||||
test_stat() = -1
|
||||
test_stat() = 0
|
||||
test_stat() = 0
|
||||
test_stat() = 0
|
||||
::malloc(1000) = (nil) - ENOMEM (12, Cannot allocate memory)
|
||||
malloc() = (nil)
|
||||
}Return main(2) = 0
|
||||
|
|
|
@ -2,7 +2,7 @@ userver {
|
|||
|
||||
PORT 8080
|
||||
PREFORK_CHILD 4
|
||||
TCP_LINGER_SET -2
|
||||
TCP_LINGER_SET 0
|
||||
LISTEN_BACKLOG 256
|
||||
DOCUMENT_ROOT benchmark/FrameworkBenchmarks/ULib/www
|
||||
PID_FILE benchmark/FrameworkBenchmarks/ULib/userver_tcp.pid
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
start_msg file_config
|
||||
|
||||
#UTRACE="0 10M 0"
|
||||
#UTRACE="0 10M -1"
|
||||
#UOBJDUMP="0 100k 10"
|
||||
#USIMERR="error.sim"
|
||||
export UTRACE UOBJDUMP USIMERR
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
start_msg json
|
||||
|
||||
#UTRACE="0 100M 0"
|
||||
UTRACE="0 100M 0"
|
||||
#UOBJDUMP="0 100k 10"
|
||||
#USIMERR="error.sim"
|
||||
export UTRACE UOBJDUMP USIMERR
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user