1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00

FlatBuffer implementation

This commit is contained in:
stefanocasazza 2017-11-30 16:54:08 +01:00
parent 350944c675
commit 2eb6736227
48 changed files with 7503 additions and 1485 deletions

View File

@ -7,7 +7,7 @@ configfiles = userver.service
EXTRA_DIST = $(configfiles:%=%.in) \
cdb configure.help TODO LICENSE* README* *.spec* \
doc/Doxyfile doc/readme.txt shtool *.awk .travis.yml autogen.sh nativejson-benchmark \
doc/Doxyfile doc/readme.txt doc/style.css shtool *.awk .travis.yml autogen.sh nativejson-benchmark \
ULib.m4 rpm.sh rpmpkgreq.lst rpmpkgreq.lst.suse openwrt CODE_OF_CONDUCT.md CONTRIBUTING.md \
fuzz/http1-corpus fuzz/http2-corpus fuzz/build_libFuzzer.sh fuzz/Makefile.in fuzz/Makefile.am fuzz/*.cpp fuzz/uclient.cfg

View File

@ -452,7 +452,7 @@ ACLOCAL_AMFLAGS = -I m4
configfiles = userver.service
EXTRA_DIST = $(configfiles:%=%.in) \
cdb configure.help TODO LICENSE* README* *.spec* \
doc/Doxyfile doc/readme.txt shtool *.awk .travis.yml autogen.sh nativejson-benchmark \
doc/Doxyfile doc/readme.txt doc/style.css shtool *.awk .travis.yml autogen.sh nativejson-benchmark \
ULib.m4 rpm.sh rpmpkgreq.lst rpmpkgreq.lst.suse openwrt CODE_OF_CONDUCT.md CONTRIBUTING.md \
fuzz/http1-corpus fuzz/http2-corpus fuzz/build_libFuzzer.sh fuzz/Makefile.in fuzz/Makefile.am fuzz/*.cpp fuzz/uclient.cfg

View File

@ -18,7 +18,7 @@ The current version offers the following features :
* Browser cache management (headers: If-Modified-Since/Last-modified).
* Chunk-encoding transfers support.
* HTTP multi-range request support.
* Memory caching of document root for (small) static pages with smart gzip compression and CSS/JS reduction.
* Memory caching of document root for (small) static pages with smart (gzip-zopfli,brotli) compression and CSS/JS reduction.
* Support for automatic update of caching document root with inotify (on Linux).
* Support for pipelining.
* Support for virtual hosts (also with SSL).
@ -43,6 +43,7 @@ The current version offers the following features :
* Support for running Ruby on Rails applications natively (experimental).
* Support for running natively PHP applications whith a php (embedded) library (experimental).
* Support for load balance between physical server via udp brodcast (experimental).
* Support for serialize object by [FlatBuffer schema-less](http://google.github.io/flatbuffers/index.html) like implementation.
* Preforking mode to improve concurrency with dedicated process for long-time request.
* Support for Windows (without preforking).
* Customizable builds (you can remove unneeded functionality).

6
configure vendored
View File

@ -26849,6 +26849,8 @@ main ()
if (*(data + i) != *(data3 + i))
return 14;
close (fd);
free (data);
free (data3);
return 0;
}
_ACEOF
@ -30476,7 +30478,7 @@ $as_echo_n "checking for PostgreSQL client libraries... " >&6; }
POSTGRESQL_CPPFLAGS="-I`$PG_CONFIG --includedir` -I`$PG_CONFIG --includedir-server`"
POSTGRESQL_VERSION=`$PG_CONFIG --version | sed -e 's#PostgreSQL ##'`
if test -f "$postgresql_libdir/libpgport.a" -o -f "$postgresql_libdir/libpgport.so" -o -f "/usr/lib/libpgport.a" -o -f "/usr/lib/libpgport.so"; then
if test -f "$postgresql_libdir/libpgport.so" -o -f "/usr/lib/libpgport.so"; then
POSTGRESQL_LIBS="-lpq -lpgport"
else
POSTGRESQL_LIBS="-lpq"
@ -34202,7 +34204,7 @@ fi
## -------------------------------------------------------------------------------------
if test "$enable_debug" != "yes"; then
MAYBE_FLAGS="$MAYBE_FLAGS -Winline -Wno-unused-parameter -Wno-unused-variable"
MAYBE_FLAGS="$MAYBE_FLAGS -Wno-unused-parameter -Wno-unused-variable" # -Winline
else
## _FORTIFY_SOURCE is enabled by default from g++ 4.7.2
MAYBE_FLAGS="$MAYBE_FLAGS -Wunsafe-loop-optimizations -Wno-unused-parameter -rdynamic -fdiagnostics-color=auto -Wmisleading-indentation"

View File

@ -2433,7 +2433,7 @@ if test "$ac_cv_c_compiler_gnu" = "yes" -a "x$OPERATINGSYSTEM" = xlinux; then
## -------------------------------------------------------------------------------------
if test "$enable_debug" != "yes"; then
MAYBE_FLAGS="$MAYBE_FLAGS -Winline -Wno-unused-parameter -Wno-unused-variable"
MAYBE_FLAGS="$MAYBE_FLAGS -Wno-unused-parameter -Wno-unused-variable" # -Winline
else
## _FORTIFY_SOURCE is enabled by default from g++ 4.7.2
MAYBE_FLAGS="$MAYBE_FLAGS -Wunsafe-loop-optimizations -Wno-unused-parameter -rdynamic -fdiagnostics-color=auto -Wmisleading-indentation"

View File

@ -1059,7 +1059,7 @@ HTML_STYLESHEET =
# see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_STYLESHEET = style.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note

396
doc/style.css Normal file
View File

@ -0,0 +1,396 @@
body,
#projectname,
table,
div,
p,
dl,
.title,
.tabs,
.tabs2,
.tabs3,
#nav-tree .label {
font-family: roboto, sans-serif;
}
#commonprojectlogo {
padding: 5px 0px 5px 15px;
}
#projectname {
color: #00bcd4;
font-size: 280%;
padding: 15px 0px;
font-weight: 300;
}
#titlearea {
border-bottom: 2px solid #e5e5e5;
}
.title {
color: #212121;
font: 300 34px/40px Roboto,sans-serif;
}
#nav-tree {
background-color: #fff;
}
#navrow1, #navrow2 {
border-bottom: 2px solid #e7e7e7;
}
.tabs, .tabs2, .tabs3 {
font-size: 14px;
}
.tabs,
.tabs2,
.tabs3,
.tablist li,
.tablist li.current a {
background-image: none;
}
.tablist {
list-style: none;
}
.tablist li, .tablist li p {
margin: 0;
}
.tablist li a,
.tablist li.current a {
color: #757575;
text-shadow: none;
}
.tablist li.current a {
background: #00bcd4;
color: #fff;
}
.tablist a {
background-image: none;
border-right: 2px solid #e5e5e5;
font-weight: normal;
}
.tablist a:hover,
.tablist li.current a:hover {
background-image: none;
text-decoration: underline;
text-shadow: none;
}
.tablist a:hover {
color: #00bcd4;
}
.tablist li.current a:hover {
color: #fff;
}
div.header {
background-color: #f7f7f7;
background-image: none;
border-bottom: none;
}
#MSearchBox {
border: 1px solid #ccc;
border-radius: 5px;
display: inline-block;
height: 20px;
right: 10px;
}
#MSearchBox .left,
#MSearchBox .right,
#MSearchField {
background: none;
}
a.SelectItem:hover {
background-color: #00bcd4;
}
#nav-tree {
background-image: none;
}
#nav-tree .selected {
background-image: none;
text-shadow: none;
background-color: #f7f7f7;
}
#nav-tree a {
color: #212121;
}
#nav-tree .selected a {
color: #0288d1;
}
#nav-tree .item:hover {
background-color: #f7f7f7;
}
#nav-tree .item:hover a {
color: #0288d1;
}
#nav-tree .label {
font-size: 13px;
}
#nav-sync {
display: none;
}
.ui-resizable-e {
background: #ebebeb;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
.contents tr td .image {
margin-top: 24px;
}
.image {
text-align: left;
margin-bottom: 8px;
}
a:link,
a:visited,
.contents a:link,
.contents a:visited,
a.el {
color: #0288d1;
font-weight: normal;
text-decoration: none;
}
div.contents {
margin-right: 12px;
}
.directory tr, .directory tr.even {
background: #7cb342;
border-top: 1px solid #7cb342;
}
.directory td,
.directory td.entry,
.directory td.desc {
background: rgba(255,255,255,.95);
border-left: none;
color: #212121;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 8px;
padding-right: 8px;
}
.directory tr#row_0_ {
border-top-color: #7cb342;
}
.directory tr#row_0_ td {
background: #7cb342;
color: #fff;
font-size: 18px;
}
.memSeparator {
border-bottom: none;
}
.memitem {
background: #7cb342;
}
.memproto, dl.reflist dt {
background: #7cb342;
background-image: none;
border: none;
box-shadow: none;
-webkit-box-shadow: none;
color: #fff;
text-shadow: none;
}
.memproto .memtemplate,
.memproto a.el,
.memproto .paramname {
color: #fff;
}
.memdoc, dl.reflist dd {
border: none;
background-color: rgba(255,255,255,.95);
background-image: none;
box-shadow: none;
-webkit-box-shadow: none;
-webkit-border-bottom-left-radius: 0;
-webkit-border-bottom-right-radius: 0;
}
.memitem, table.doxtable, table.memberdecls {
margin-bottom: 24px;
}
table.doxtable th {
background: #7cb342;
}
table.doxtable tr {
background: #7cb342;
border-top: 1px solid #7cb342;
}
table.doxtable td, table.doxtable th {
border: none;
padding: 10px 8px;
}
table.doxtable td {
background-color: rgba(255,255,255,.95);
}
.memberdecls {
background: #7cb342;
border-top: 1px solid #7cb342;
}
.memberdecls .heading h2 {
border-bottom: none;
color: #fff;
font-size: 110%;
font-weight: bold;
margin: 0 0 0 6px;
}
.memberdecls tr:not(.heading) td {
background-color: rgba(255,255,255,.95);
}
h1, h2, h2.groupheader, h3, h4, h5, h6 {
color: #212121;
}
h1 {
border-bottom: 1px solid #ebebeb;
font: 400 28px/32px Roboto,sans-serif;
letter-spacing: -.01em;
margin: 40px 0 20px;
padding-bottom: 3px;
}
h2, h2.groupheader {
border-bottom: 1px solid #ebebeb;
font: 400 23px/32px Roboto,sans-serif;
letter-spacing: -.01em;
margin: 40px 0 20px;
padding-bottom: 3px;
}
h3 {
font: 500 20px/32px Roboto,sans-serif;
margin: 32px 0 16px;
}
h4 {
font: 500 18px/32px Roboto,sans-serif;
margin: 32px 0 16px;
}
ol,
ul {
margin: 0;
padding-left: 40px;
}
ol {
list-style: decimal outside;
}
ol ol {
list-style-type: lower-alpha;
}
ol ol ol {
list-style-type: lower-roman;
}
ul {
list-style: disc outside;
}
li,
li p {
margin: 8px 0;
padding: 0;
}
div.summary
{
float: none;
font-size: 8pt;
padding-left: 5px;
width: calc(100% - 10px);
text-align: left;
display: block;
}
div.ingroups {
margin-top: 8px;
}
div.fragment {
border: 1px solid #ddd;
color: #455a64;
font: 14px/20px Roboto Mono, monospace;
padding: 8px;
}
div.line {
line-height: 1.5;
font-size: inherit;
}
code, pre {
color: #455a64;
background: #f7f7f7;
font: 400 100% Roboto Mono,monospace;
padding: 1px 4px;
}
span.preprocessor, span.comment {
color: #0b8043;
}
span.keywordtype {
color: #0097a7;
}
.paramname {
color: #ef6c00;
}
.memTemplParams {
color: #ef6c00;
}
span.mlabel {
background: rgba(255,255,255,.25);
border: none;
}
blockquote {
border: 1px solid #ddd;
}

View File

@ -40,6 +40,7 @@ TO_INC = ulib/README \
ulib/json/*.h \
ulib/query/*.h \
ulib/replace/*.h \
ulib/serialize/*.h \
ulib/ssh/net/*.h \
ulib/ssl/*.h \
ulib/ssl/mime/*.h \

View File

@ -462,6 +462,7 @@ TO_INC = ulib/README \
ulib/json/*.h \
ulib/query/*.h \
ulib/replace/*.h \
ulib/serialize/*.h \
ulib/ssh/net/*.h \
ulib/ssl/*.h \
ulib/ssl/mime/*.h \

View File

@ -35,6 +35,7 @@
#include <ulib/utility/interrupt.h>
#include <ulib/utility/websocket.h>
#include <ulib/utility/xml_escape.h>
#include <ulib/serialize/flatbuffers.h>
#include <ulib/utility/quoted_printable.h>
#ifdef USE_PARSER

View File

@ -350,6 +350,15 @@ static inline void u_put_unalignedp64( void* p, uint64_t val) { s
# define u_parse_unalignedp32(p) ((uint32_t)(p)[0]<<24|(p)[1]<<16|(ptr)[2]<< 8|(ptr)[3])
#endif
#if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) // __builtin_bswap16 was missing prior to GCC 4.8
# define U_BYTESWAP16(x) (uint16_t)(__builtin_bswap32((uint32_t)(x) << 16))
#else
# define U_BYTESWAP16 __builtin_bswap16
#endif
#define U_BYTESWAP32 __builtin_bswap32
#define U_BYTESWAP64 __builtin_bswap64
/**
* u_get_unaligned - get value from possibly mis-aligned location
*

View File

@ -747,12 +747,12 @@ U_BOOLEAN_VALUE = 10, // bool value
U_LREAL_VALUE = 20 // long double value
} ValueType;
static inline uint32_t u_getTag( uint64_t val) { return (val >> U_VALUE_TAG_SHIFT) & U_VALUE_TAG_MASK; }
static inline uint8_t u_getTag( uint64_t val) { return (val >> U_VALUE_TAG_SHIFT) & U_VALUE_TAG_MASK; }
static inline uint64_t u_getPayload(uint64_t val) { return (val & U_VALUE_PAYLOAD_MASK); }
static inline uint64_t u_getValue(uint16_t tag, void* payload)
static inline uint64_t u_getValue(uint8_t tag, void* payload)
{
U_INTERNAL_TRACE("u_getValue(%hu,%p)", tag, payload)
U_INTERNAL_TRACE("u_getValue(%u,%p)", tag, payload)
U_INTERNAL_ASSERT(payload <= (void*)U_VALUE_PAYLOAD_MASK)
@ -761,7 +761,7 @@ static inline uint64_t u_getValue(uint16_t tag, void* payload)
((uint64_t)(long)payload & U_VALUE_PAYLOAD_MASK);
}
static inline void u_setTag(uint16_t tag, uint64_t* pval) { uint64_t payload = u_getPayload(*pval); *pval = u_getValue(tag, (void*)(long)payload); }
static inline void u_setTag(uint8_t tag, uint64_t* pval) { uint64_t payload = u_getPayload(*pval); *pval = u_getValue(tag, (void*)(long)payload); }
#if defined(USE_PGSQL) && defined(LIBPGPORT_NOT_FOUND)
static inline void pg_qsort(void* a, size_t n, size_t es, int (*cmp)(const void*, const void*)) { qsort(a, n, es, cmp); }

View File

@ -93,8 +93,6 @@ public:
{
U_TRACE_UNREGISTER_OBJECT(0, UHashMap<void*>)
U_INTERNAL_ASSERT_EQUALS(_length, 0)
if (_capacity) _deallocate();
}
@ -216,13 +214,6 @@ public:
void* operator[](const UString& k) { return (lkey = k.rep, at()); }
void* operator[](const UStringRep* k) { return (lkey = k, at()); }
template <typename T> T* get(const UString& k)
{
U_TRACE(0, "UHashMap<void*>::get(%V)", k.rep)
return (T*) operator[](k);
}
// after called find() (don't make the lookup)
void eraseAfterFind();
@ -265,6 +256,8 @@ public:
static void setNodePointer(char* table, uint32_t idx) { node = (UHashMapNode*)(table + (idx * UHashMapNode::size())); }
static void nextNodePointer() { node = (UHashMapNode*)((char*)node + UHashMapNode::size()); }
// traverse the hash table for all entry
bool first()
@ -435,6 +428,7 @@ protected:
U_CHECK_MEMORY
U_INTERNAL_ASSERT_EQUALS(_length, 0)
U_INTERNAL_ASSERT_MAJOR(_capacity, 1)
UMemoryPool::_free(info, _capacity, 1+UHashMapNode::size());

View File

@ -38,6 +38,7 @@ class UNoCatPlugIn;
template <class T> class UVector;
template <class T> class UOrmTypeHandler;
template <class T> class UJsonTypeHandler;
template <class T> class UFlatBufferTypeHandler;
typedef UVector<UString> UVectorUString;
@ -429,6 +430,7 @@ private:
template <class T> friend class UOrmTypeHandler;
template <class T> friend class UJsonTypeHandler;
template <class T> friend class UFlatBufferTypeHandler;
};
template <class T> class U_EXPORT UVector<T*> : public UVector<void*> {

View File

@ -56,7 +56,6 @@
* 32 sizeof(UQueryNode)
* 32 sizeof(USOAPFault)
* 32 sizeof(UTokenizer)
* 32 sizeof(UHashMapNode) <==
* 32 sizeof(UXMLAttribute)
* 32 sizeof(UTree<UString>)
* -------------------------
@ -145,7 +144,6 @@
* 40 sizeof(UStringRep) <==
* 40 sizeof(UTokenizer)
* 40 sizeof(USOAPObject)
* 40 sizeof(UHashMapNode) <==
* 40 sizeof(UTree<UString>)
* -------------------------
* U_STACK_TYPE_1
@ -238,7 +236,6 @@
* 16 sizeof(UTokenizer)
* 16 sizeof(UStringRep) <==
* 16 sizeof(USOAPObject)
* 16 sizeof(UHashMapNode) <==
* -------------------------
* U_STACK_TYPE_1
*
@ -324,7 +321,6 @@
* 20 sizeof(UQueryNode)
* 20 sizeof(USOAPFault)
* 20 sizeof(UTokenizer)
* 20 sizeof(UHashMapNode) <==
* 24 sizeof(USOAPObject)
* 24 sizeof(UTree<UString>)
* 28 sizeof(UStringRep) <==

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -114,6 +114,7 @@ class UPop3Client;
class UHttpPlugIn;
class UProxyPlugIn;
class Application;
class UFlatBuffer;
class UServer_Base;
class UHashMapNode;
class UHashTableNode;
@ -1016,6 +1017,7 @@ private:
friend class UMimeHeader;
friend class UHttpPlugIn;
friend class Application;
friend class UFlatBuffer;
friend class UProxyPlugIn;
friend class UHashMapNode;
friend class UServer_Base;
@ -1918,7 +1920,6 @@ public:
// STREAM
#ifdef U_STDCPP_ENABLE
istream& getline(istream& is, unsigned char delim = '\n');
friend U_EXPORT istream& operator>>(istream& is, UString& str);
@ -2244,6 +2245,20 @@ public:
U_INTERNAL_ASSERT(invariant())
}
void appendData(const char* t, uint32_t tlen)
{
U_TRACE(0, "UString::appendData(%.*S,%u)", tlen, t, tlen)
uint32_t sz = size();
char* ptr = c_pointer(sz);
U_MEMCPY(ptr, t, tlen);
rep->_length = sz + tlen;
U_INTERNAL_ASSERT(invariant())
}
void appendDataQuoted(const char* t, uint32_t tlen)
{
U_TRACE(0, "UString::appendDataQuoted(%.*S,%u)", tlen, t, tlen)

View File

@ -18,6 +18,8 @@
#include <ulib/string.h>
#define U_HEXDUMP(str) UHexDump::decode(U_CONSTANT_TO_PARAM(str))
struct U_EXPORT UHexDump {
static void encode(const char* s, uint32_t n, UString& buffer)
@ -44,6 +46,8 @@ struct U_EXPORT UHexDump {
}
static void decode(const UString& s, UString& buffer) { decode(U_STRING_TO_PARAM(s), buffer); }
static UString decode(const char* s, uint32_t n) { UString tmp(U_CAPACITY); decode(s, n, tmp); return tmp; }
};
#endif

View File

@ -256,6 +256,9 @@ public:
static UString substitute(const char* s, uint32_t n, UVector<UString>& vec);
static UString substitute(const UString& s, UVector<UString>& vec) { return substitute(U_STRING_TO_PARAM(s), vec); }
static UString substituteIds(const char* s, uint32_t n, UVector<UString>& vec);
static UString substituteIds(const UString& s, UVector<UString>& vec) { return substituteIds(U_STRING_TO_PARAM(s), vec); }
// ERASE
static UString erase(const UString& s, char a) { return substitute(U_STRING_TO_PARAM(s), &a, 1, U_NULLPTR, 0); }

View File

@ -31,7 +31,7 @@
PROGRAM=libtool
PACKAGE=libtool
VERSION="2.4.6 Debian-2.4.6-1"
VERSION="2.4.6 Debian-2.4.6-2"
package_revision=2.4.6
@ -1977,7 +1977,7 @@ func_version ()
# End:
# Set a version string.
scriptversion='(GNU libtool) 2.4.6 Debian-2.4.6-1'
scriptversion='(GNU libtool) 2.4.6'
# func_echo ARG...
@ -2068,7 +2068,7 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
version: $progname $scriptversion
version: $progname $scriptversion Debian-2.4.6-2
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`

View File

@ -100,7 +100,7 @@ AC_DEFUN([AX_LIB_POSTGRESQL],
POSTGRESQL_CPPFLAGS="-I`$PG_CONFIG --includedir` -I`$PG_CONFIG --includedir-server`"
POSTGRESQL_VERSION=`$PG_CONFIG --version | sed -e 's#PostgreSQL ##'`
if test -f "$postgresql_libdir/libpgport.a" -o -f "$postgresql_libdir/libpgport.so" -o -f "/usr/lib/libpgport.a" -o -f "/usr/lib/libpgport.so"; then
if test -f "$postgresql_libdir/libpgport.so" -o -f "/usr/lib/libpgport.so"; then
POSTGRESQL_LIBS="-lpq -lpgport"
else
POSTGRESQL_LIBS="-lpq"

View File

@ -38,7 +38,7 @@ SRC_CPP = internal/common.cpp internal/error.cpp \
net/client/smtp.cpp net/client/ftp.cpp net/client/pop3.cpp net/client/imap.cpp \
net/client/http.cpp net/client/client.cpp net/client/redis.cpp net/client/elasticsearch.cpp \
net/ipt_ACCOUNT.cpp \
json/value.cpp \
json/value.cpp serialize/flatbuffers.cpp \
query/query_parser.cpp event/event_time.cpp \
timeval.cpp timer.cpp notifier.cpp string.cpp file.cpp process.cpp file_config.cpp log.cpp \
options.cpp application.cpp cache.cpp date.cpp url.cpp tokenizer.cpp command.cpp

View File

@ -263,21 +263,21 @@ am__lib@ULIB@_la_SOURCES_DIST = base/base.c base/base_error.c \
net/client/smtp.cpp net/client/ftp.cpp net/client/pop3.cpp \
net/client/imap.cpp net/client/http.cpp net/client/client.cpp \
net/client/redis.cpp net/client/elasticsearch.cpp \
net/ipt_ACCOUNT.cpp json/value.cpp query/query_parser.cpp \
event/event_time.cpp timeval.cpp timer.cpp notifier.cpp \
string.cpp file.cpp process.cpp file_config.cpp log.cpp \
options.cpp application.cpp cache.cpp date.cpp url.cpp \
tokenizer.cpp command.cpp db/tdb.cpp net/client/mongodb.cpp \
utility/http2.cpp internal/objectIO.cpp thread.cpp \
debug/debug_common.cpp debug/trace.cpp debug/error_memory.cpp \
debug/error_simulation.cpp debug/objectDB.cpp \
internal/memory_pool.cpp zip/zip.cpp flex/flexer.cpp \
flex/bison.cpp pcre/pcre.cpp ssl/certificate.cpp ssl/pkcs7.cpp \
ssl/crl.cpp ssl/pkcs10.cpp net/client/twilio.cpp \
ssl/mime/mime_pkcs7.cpp ssl/net/sslsocket.cpp \
ssl/net/ssl_session.cpp utility/des3.cpp ssl/timestamp.cpp \
ssh/net/sshsocket.cpp ldap/ldap.cpp curl/curl.cpp \
xml/expat/attribute.cpp xml/expat/element.cpp \
net/ipt_ACCOUNT.cpp json/value.cpp serialize/flatbuffers.cpp \
query/query_parser.cpp event/event_time.cpp timeval.cpp \
timer.cpp notifier.cpp string.cpp file.cpp process.cpp \
file_config.cpp log.cpp options.cpp application.cpp cache.cpp \
date.cpp url.cpp tokenizer.cpp command.cpp db/tdb.cpp \
net/client/mongodb.cpp utility/http2.cpp internal/objectIO.cpp \
thread.cpp debug/debug_common.cpp debug/trace.cpp \
debug/error_memory.cpp debug/error_simulation.cpp \
debug/objectDB.cpp internal/memory_pool.cpp zip/zip.cpp \
flex/flexer.cpp flex/bison.cpp pcre/pcre.cpp \
ssl/certificate.cpp ssl/pkcs7.cpp ssl/crl.cpp ssl/pkcs10.cpp \
net/client/twilio.cpp ssl/mime/mime_pkcs7.cpp \
ssl/net/sslsocket.cpp ssl/net/ssl_session.cpp utility/des3.cpp \
ssl/timestamp.cpp ssh/net/sshsocket.cpp ldap/ldap.cpp \
curl/curl.cpp xml/expat/attribute.cpp xml/expat/element.cpp \
xml/expat/xml_parser.cpp xml/expat/xml2txt.cpp \
xml/soap/soap_fault.cpp xml/soap/soap_gen_method.cpp \
xml/soap/soap_parser.cpp xml/soap/soap_encoder.cpp \
@ -422,23 +422,24 @@ am__objects_67 = internal/common.lo internal/error.lo ui/dialog.lo \
net/client/ftp.lo net/client/pop3.lo net/client/imap.lo \
net/client/http.lo net/client/client.lo net/client/redis.lo \
net/client/elasticsearch.lo net/ipt_ACCOUNT.lo json/value.lo \
query/query_parser.lo event/event_time.lo timeval.lo timer.lo \
notifier.lo string.lo file.lo process.lo file_config.lo log.lo \
options.lo application.lo cache.lo date.lo url.lo tokenizer.lo \
command.lo $(am__objects_27) $(am__objects_28) \
$(am__objects_29) $(am__objects_30) $(am__objects_31) \
$(am__objects_32) $(am__objects_33) $(am__objects_34) \
$(am__objects_35) $(am__objects_36) $(am__objects_37) \
$(am__objects_38) $(am__objects_39) $(am__objects_40) \
$(am__objects_41) $(am__objects_42) $(am__objects_43) \
$(am__objects_44) $(am__objects_45) $(am__objects_46) \
$(am__objects_47) $(am__objects_48) $(am__objects_49) \
$(am__objects_50) $(am__objects_51) $(am__objects_52) \
$(am__objects_53) $(am__objects_54) $(am__objects_55) \
$(am__objects_56) $(am__objects_57) $(am__objects_58) \
$(am__objects_59) $(am__objects_60) $(am__objects_61) \
$(am__objects_62) $(am__objects_63) $(am__objects_64) \
$(am__objects_65) $(am__objects_66)
serialize/flatbuffers.lo query/query_parser.lo \
event/event_time.lo timeval.lo timer.lo notifier.lo string.lo \
file.lo process.lo file_config.lo log.lo options.lo \
application.lo cache.lo date.lo url.lo tokenizer.lo command.lo \
$(am__objects_27) $(am__objects_28) $(am__objects_29) \
$(am__objects_30) $(am__objects_31) $(am__objects_32) \
$(am__objects_33) $(am__objects_34) $(am__objects_35) \
$(am__objects_36) $(am__objects_37) $(am__objects_38) \
$(am__objects_39) $(am__objects_40) $(am__objects_41) \
$(am__objects_42) $(am__objects_43) $(am__objects_44) \
$(am__objects_45) $(am__objects_46) $(am__objects_47) \
$(am__objects_48) $(am__objects_49) $(am__objects_50) \
$(am__objects_51) $(am__objects_52) $(am__objects_53) \
$(am__objects_54) $(am__objects_55) $(am__objects_56) \
$(am__objects_57) $(am__objects_58) $(am__objects_59) \
$(am__objects_60) $(am__objects_61) $(am__objects_62) \
$(am__objects_63) $(am__objects_64) $(am__objects_65) \
$(am__objects_66)
@FINAL_FALSE@am_lib@ULIB@_la_OBJECTS = $(am__objects_26) \
@FINAL_FALSE@ $(am__objects_67)
@FINAL_TRUE@am_lib@ULIB@_la_OBJECTS = all_c.lo base/xxhash/xxhash.lo \
@ -753,24 +754,24 @@ SRC_CPP = internal/common.cpp internal/error.cpp ui/dialog.cpp \
net/client/smtp.cpp net/client/ftp.cpp net/client/pop3.cpp \
net/client/imap.cpp net/client/http.cpp net/client/client.cpp \
net/client/redis.cpp net/client/elasticsearch.cpp \
net/ipt_ACCOUNT.cpp json/value.cpp query/query_parser.cpp \
event/event_time.cpp timeval.cpp timer.cpp notifier.cpp \
string.cpp file.cpp process.cpp file_config.cpp log.cpp \
options.cpp application.cpp cache.cpp date.cpp url.cpp \
tokenizer.cpp command.cpp $(am__append_1) $(am__append_2) \
$(am__append_3) $(am__append_4) $(am__append_5) \
$(am__append_7) $(am__append_8) $(am__append_28) \
$(am__append_31) $(am__append_33) $(am__append_34) \
$(am__append_36) $(am__append_37) $(am__append_38) \
$(am__append_39) $(am__append_40) $(am__append_41) \
$(am__append_42) $(am__append_43) $(am__append_44) \
$(am__append_45) $(am__append_47) $(am__append_48) \
$(am__append_49) $(am__append_50) $(am__append_51) \
$(am__append_52) $(am__append_53) $(am__append_54) \
$(am__append_55) $(am__append_56) $(am__append_57) \
$(am__append_58) $(am__append_59) $(am__append_60) \
$(am__append_61) $(am__append_62) $(am__append_63) \
$(am__append_64) $(am__append_65)
net/ipt_ACCOUNT.cpp json/value.cpp serialize/flatbuffers.cpp \
query/query_parser.cpp event/event_time.cpp timeval.cpp \
timer.cpp notifier.cpp string.cpp file.cpp process.cpp \
file_config.cpp log.cpp options.cpp application.cpp cache.cpp \
date.cpp url.cpp tokenizer.cpp command.cpp $(am__append_1) \
$(am__append_2) $(am__append_3) $(am__append_4) \
$(am__append_5) $(am__append_7) $(am__append_8) \
$(am__append_28) $(am__append_31) $(am__append_33) \
$(am__append_34) $(am__append_36) $(am__append_37) \
$(am__append_38) $(am__append_39) $(am__append_40) \
$(am__append_41) $(am__append_42) $(am__append_43) \
$(am__append_44) $(am__append_45) $(am__append_47) \
$(am__append_48) $(am__append_49) $(am__append_50) \
$(am__append_51) $(am__append_52) $(am__append_53) \
$(am__append_54) $(am__append_55) $(am__append_56) \
$(am__append_57) $(am__append_58) $(am__append_59) \
$(am__append_60) $(am__append_61) $(am__append_62) \
$(am__append_63) $(am__append_64) $(am__append_65)
#lib@ULIB@_la_CXXFLAGS =
lib@ULIB@_la_LDFLAGS = @ULIB_LIBS@ -version-info 1:0:0 -release \
@ -1178,6 +1179,14 @@ json/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) json/$(DEPDIR)
@: > json/$(DEPDIR)/$(am__dirstamp)
json/value.lo: json/$(am__dirstamp) json/$(DEPDIR)/$(am__dirstamp)
serialize/$(am__dirstamp):
@$(MKDIR_P) serialize
@: > serialize/$(am__dirstamp)
serialize/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) serialize/$(DEPDIR)
@: > serialize/$(DEPDIR)/$(am__dirstamp)
serialize/flatbuffers.lo: serialize/$(am__dirstamp) \
serialize/$(DEPDIR)/$(am__dirstamp)
query/$(am__dirstamp):
@$(MKDIR_P) query
@: > query/$(am__dirstamp)
@ -1490,6 +1499,8 @@ mostlyclean-compile:
-rm -f query/*.lo
-rm -f replace/*.$(OBJEXT)
-rm -f replace/*.lo
-rm -f serialize/*.$(OBJEXT)
-rm -f serialize/*.lo
-rm -f ssh/net/*.$(OBJEXT)
-rm -f ssh/net/*.lo
-rm -f ssl/*.$(OBJEXT)
@ -1654,6 +1665,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@replace/$(DEPDIR)/strndup.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@replace/$(DEPDIR)/strptime.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@replace/$(DEPDIR)/timegm.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@serialize/$(DEPDIR)/flatbuffers.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ssh/net/$(DEPDIR)/sshsocket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/certificate.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/crl.Plo@am__quote@
@ -1781,6 +1793,7 @@ clean-libtool:
-rm -rf pcre/.libs pcre/_libs
-rm -rf query/.libs query/_libs
-rm -rf replace/.libs replace/_libs
-rm -rf serialize/.libs serialize/_libs
-rm -rf ssh/net/.libs ssh/net/_libs
-rm -rf ssl/.libs ssl/_libs
-rm -rf ssl/mime/.libs ssl/mime/_libs
@ -1955,6 +1968,8 @@ distclean-generic:
-rm -f query/$(am__dirstamp)
-rm -f replace/$(DEPDIR)/$(am__dirstamp)
-rm -f replace/$(am__dirstamp)
-rm -f serialize/$(DEPDIR)/$(am__dirstamp)
-rm -f serialize/$(am__dirstamp)
-rm -f ssh/net/$(DEPDIR)/$(am__dirstamp)
-rm -f ssh/net/$(am__dirstamp)
-rm -f ssl/$(DEPDIR)/$(am__dirstamp)
@ -1986,7 +2001,7 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR) base/$(DEPDIR) base/apex/$(DEPDIR) base/coder/$(DEPDIR) base/miniz/$(DEPDIR) base/ssl/$(DEPDIR) base/win32/$(DEPDIR) base/xxhash/$(DEPDIR) base/zip/$(DEPDIR) container/$(DEPDIR) curl/$(DEPDIR) db/$(DEPDIR) dbi/$(DEPDIR) debug/$(DEPDIR) dynamic/$(DEPDIR) event/$(DEPDIR) flex/$(DEPDIR) internal/$(DEPDIR) json/$(DEPDIR) ldap/$(DEPDIR) lemon/$(DEPDIR) libevent/$(DEPDIR) magic/$(DEPDIR) mime/$(DEPDIR) net/$(DEPDIR) net/client/$(DEPDIR) net/rpc/$(DEPDIR) net/server/$(DEPDIR) net/server/plugin/$(DEPDIR) net/server/plugin/mod_geoip/$(DEPDIR) net/server/plugin/mod_shib/$(DEPDIR) orm/$(DEPDIR) orm/driver/$(DEPDIR) pcre/$(DEPDIR) query/$(DEPDIR) replace/$(DEPDIR) ssh/net/$(DEPDIR) ssl/$(DEPDIR) ssl/mime/$(DEPDIR) ssl/net/$(DEPDIR) ui/$(DEPDIR) utility/$(DEPDIR) xml/expat/$(DEPDIR) xml/libxml2/$(DEPDIR) xml/soap/$(DEPDIR) zip/$(DEPDIR)
-rm -rf ./$(DEPDIR) base/$(DEPDIR) base/apex/$(DEPDIR) base/coder/$(DEPDIR) base/miniz/$(DEPDIR) base/ssl/$(DEPDIR) base/win32/$(DEPDIR) base/xxhash/$(DEPDIR) base/zip/$(DEPDIR) container/$(DEPDIR) curl/$(DEPDIR) db/$(DEPDIR) dbi/$(DEPDIR) debug/$(DEPDIR) dynamic/$(DEPDIR) event/$(DEPDIR) flex/$(DEPDIR) internal/$(DEPDIR) json/$(DEPDIR) ldap/$(DEPDIR) lemon/$(DEPDIR) libevent/$(DEPDIR) magic/$(DEPDIR) mime/$(DEPDIR) net/$(DEPDIR) net/client/$(DEPDIR) net/rpc/$(DEPDIR) net/server/$(DEPDIR) net/server/plugin/$(DEPDIR) net/server/plugin/mod_geoip/$(DEPDIR) net/server/plugin/mod_shib/$(DEPDIR) orm/$(DEPDIR) orm/driver/$(DEPDIR) pcre/$(DEPDIR) query/$(DEPDIR) replace/$(DEPDIR) serialize/$(DEPDIR) ssh/net/$(DEPDIR) ssl/$(DEPDIR) ssl/mime/$(DEPDIR) ssl/net/$(DEPDIR) ui/$(DEPDIR) utility/$(DEPDIR) xml/expat/$(DEPDIR) xml/libxml2/$(DEPDIR) xml/soap/$(DEPDIR) zip/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic
@ -2031,7 +2046,7 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR) base/$(DEPDIR) base/apex/$(DEPDIR) base/coder/$(DEPDIR) base/miniz/$(DEPDIR) base/ssl/$(DEPDIR) base/win32/$(DEPDIR) base/xxhash/$(DEPDIR) base/zip/$(DEPDIR) container/$(DEPDIR) curl/$(DEPDIR) db/$(DEPDIR) dbi/$(DEPDIR) debug/$(DEPDIR) dynamic/$(DEPDIR) event/$(DEPDIR) flex/$(DEPDIR) internal/$(DEPDIR) json/$(DEPDIR) ldap/$(DEPDIR) lemon/$(DEPDIR) libevent/$(DEPDIR) magic/$(DEPDIR) mime/$(DEPDIR) net/$(DEPDIR) net/client/$(DEPDIR) net/rpc/$(DEPDIR) net/server/$(DEPDIR) net/server/plugin/$(DEPDIR) net/server/plugin/mod_geoip/$(DEPDIR) net/server/plugin/mod_shib/$(DEPDIR) orm/$(DEPDIR) orm/driver/$(DEPDIR) pcre/$(DEPDIR) query/$(DEPDIR) replace/$(DEPDIR) ssh/net/$(DEPDIR) ssl/$(DEPDIR) ssl/mime/$(DEPDIR) ssl/net/$(DEPDIR) ui/$(DEPDIR) utility/$(DEPDIR) xml/expat/$(DEPDIR) xml/libxml2/$(DEPDIR) xml/soap/$(DEPDIR) zip/$(DEPDIR)
-rm -rf ./$(DEPDIR) base/$(DEPDIR) base/apex/$(DEPDIR) base/coder/$(DEPDIR) base/miniz/$(DEPDIR) base/ssl/$(DEPDIR) base/win32/$(DEPDIR) base/xxhash/$(DEPDIR) base/zip/$(DEPDIR) container/$(DEPDIR) curl/$(DEPDIR) db/$(DEPDIR) dbi/$(DEPDIR) debug/$(DEPDIR) dynamic/$(DEPDIR) event/$(DEPDIR) flex/$(DEPDIR) internal/$(DEPDIR) json/$(DEPDIR) ldap/$(DEPDIR) lemon/$(DEPDIR) libevent/$(DEPDIR) magic/$(DEPDIR) mime/$(DEPDIR) net/$(DEPDIR) net/client/$(DEPDIR) net/rpc/$(DEPDIR) net/server/$(DEPDIR) net/server/plugin/$(DEPDIR) net/server/plugin/mod_geoip/$(DEPDIR) net/server/plugin/mod_shib/$(DEPDIR) orm/$(DEPDIR) orm/driver/$(DEPDIR) pcre/$(DEPDIR) query/$(DEPDIR) replace/$(DEPDIR) serialize/$(DEPDIR) ssh/net/$(DEPDIR) ssl/$(DEPDIR) ssl/mime/$(DEPDIR) ssl/net/$(DEPDIR) ui/$(DEPDIR) utility/$(DEPDIR) xml/expat/$(DEPDIR) xml/libxml2/$(DEPDIR) xml/soap/$(DEPDIR) zip/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

View File

@ -51,6 +51,7 @@
#include "utility/string_ext.cpp"
#include "utility/socket_ext.cpp"
#include "utility/data_session.cpp"
#include "serialize/flatbuffers.cpp"
#include "lemon/expression.cpp"
#include "dynamic/dynamic.cpp"
#include "dynamic/plugin.cpp"

View File

@ -1970,11 +1970,12 @@ empty: u_put_unalignedp16(bp, U_MULTICHAR_CONSTANT16('"','"'));
n = 0;
remaining = buffer_size - (bp-buffer);
if ((flags & ALT) != 0) /* NB: # -> force print of all binary string (compatibly with buffer size)... */
if ((flags & ALT) != 0) /* NB: # -> force print of all binary string (compatible with buffer size)... */
{
remaining >>= 1;
if (u__isprint(*cp) == false &&
if (ch != 'V' &&
u__isprint(*cp) == false &&
u__isspace(*cp) == false)
{
sign = 1; /* we want to print buffer as exadecimal... */
@ -1998,7 +1999,7 @@ empty: u_put_unalignedp16(bp, U_MULTICHAR_CONSTANT16('"','"'));
else
{
if (c == '\0' &&
(flags & ALT) == 0) /* NB: # -> force print of all binary string (compatibly with buffer size)... */
(flags & ALT) == 0) /* NB: # -> force print of all binary string (compatible with buffer size)... */
{
break;
}

View File

@ -39,6 +39,7 @@
#include <ulib/json/value.h>
#include <ulib/application.h>
#include <ulib/utility/interrupt.h>
#include <ulib/serialize/flatbuffers.h>
#ifndef HAVE_POLL_H
# include <ulib/notifier.h>
@ -158,8 +159,8 @@ void ULib::init(char** argv, const char* mempool)
// allocation from memory pool
#if defined(ENABLE_MEMPOOL) // check if we want some preallocation for memory pool
const char* ptr = (mempool ? (UValue::jsonParseFlags = 2, mempool) : U_SYSCALL(getenv, "%S", "UMEMPOOL")); // start from 1... (Ex: 768,768,0,1536,2085,0,0,0,121)
#if defined(ENABLE_MEMPOOL) // check if we want some preallocation for memory pool - start from 1... (Ex: 768,768,0,1536,2085,0,0,0,121)
const char* ptr = (mempool ? (UValue::jsonParseFlags = 2, mempool) : U_SYSCALL(getenv, "%S", "UMEMPOOL"));
// coverity[tainted_scalar]
if ( ptr &&
@ -191,6 +192,9 @@ void ULib::init(char** argv, const char* mempool)
# endif
#endif
UFlatBuffer::setStack((uint8_t*)u_err_buffer, 256);
UFlatBuffer::setBuffer((uint8_t*)u_buffer, U_BUFFER_SIZE);
UString::ptrbuf =
UString::appbuf = (char*)UMemoryPool::pop(U_SIZE_TO_STACK_INDEX(1024));
UFile::cwd_save = (char*)UMemoryPool::pop(U_SIZE_TO_STACK_INDEX(1024));

View File

@ -20,6 +20,7 @@ int UValue::jsonParseFlags;
char* UValue::pstringify;
uint32_t UValue::size;
UValue::jval UValue::o;
UFlatBuffer* UValue::pfb;
UValue::parser_stack_data UValue::sd[U_JSON_PARSE_STACK_SIZE];
#ifdef DEBUG
@ -111,7 +112,7 @@ void UValue::clear()
0,/* 9 */
};
uint32_t type = getTag();
uint8_t type = getTag();
U_DUMP("dispatch_table[(%u,%S)] = %d", type, getDataTypeDescription(type), dispatch_table[type])
@ -181,9 +182,9 @@ case_object:
}
}
__pure UValue* UValue::at(uint32_t pos) const
__pure UValue* UValue::at(uint32_t idx) const
{
U_TRACE(0, "UValue::at(%u)", pos)
U_TRACE(0, "UValue::at(%u)", idx)
if (getTag() == U_ARRAY_VALUE)
{
@ -194,7 +195,7 @@ __pure UValue* UValue::at(uint32_t pos) const
{
U_DUMP("element = %p element->next = %p element->type = (%u,%S)", element, element->next, element->getTag(), getDataTypeDescription(element->getTag()))
if (i++ == pos) U_RETURN_POINTER(element, UValue);
if (i++ == idx) U_RETURN_POINTER(element, UValue);
element = element->next;
}
@ -425,7 +426,7 @@ void UValue::stringify() const
(int)((char*)&&case_null-(char*)&&case_double)
};
uint32_t type = getTag();
uint8_t type = getTag();
U_DUMP("dispatch_table[(%u,%S)] = %d", type, getDataTypeDescription(type), dispatch_table[type])
@ -437,12 +438,12 @@ case_double:
return;
case_int:
pstringify = u_num2str32s(getInt(), pstringify);
pstringify = u_num2str64s(getInt64(), pstringify);
return;
case_uint:
pstringify = u_num2str32(getUInt(), pstringify);
pstringify = u_num2str64(getUInt64(), pstringify);
return;
@ -541,24 +542,24 @@ void UValue::prettify(uint32_t indent) const
(int)((char*)&&case_null-(char*)&&case_double)
};
uint32_t type = getTag();
uint8_t type = getTag();
U_DUMP("dispatch_table[(%u,%S)] = %d", type, getDataTypeDescription(type), dispatch_table[type])
goto *((char*)&&case_double + dispatch_table[type]);
case_double:
pstringify = u_dtoa(value.real, pstringify);
pstringify = u_dtoa(value.real, pstringify);
return;
case_int:
pstringify = u_num2str32s(getInt(), pstringify);
pstringify = u_num2str64s(getInt64(), pstringify);
return;
case_uint:
pstringify = u_num2str32(getUInt(), pstringify);
pstringify = u_num2str64(getUInt64(), pstringify);
return;
@ -677,6 +678,371 @@ case_null:
pstringify += U_CONSTANT_SIZE("null");
}
void UValue::toFlatBufferFromJSON() const
{
U_TRACE_NO_PARAM(0, "UValue::toFlatBufferFromJSON()")
static const int dispatch_table[] = {
0,/* 0 */
(int)((char*)&&case_int-(char*)&&case_double),
(int)((char*)&&case_uint-(char*)&&case_double),
(int)((char*)&&case_true-(char*)&&case_double),
(int)((char*)&&case_false-(char*)&&case_double),
(int)((char*)&&case_string-(char*)&&case_double),
(int)((char*)&&case_utf-(char*)&&case_double),
(int)((char*)&&case_array-(char*)&&case_double),
(int)((char*)&&case_object-(char*)&&case_double),
(int)((char*)&&case_null-(char*)&&case_double)
};
uint32_t n;
UStringRep* rep;
uint8_t type = getTag();
U_DUMP("dispatch_table[(%u,%S)] = %d", type, getDataTypeDescription(type), dispatch_table[type])
goto *((char*)&&case_double + dispatch_table[type]);
case_double:
pfb->Add(value.real);
return;
case_int:
pfb->Int(getInt64());
return;
case_uint:
pfb->UInt(getUInt64());
return;
case_true:
pfb->Add(true);
return;
case_false:
pfb->Add(false);
return;
case_string:
case_utf:
rep = (UStringRep*)getPayload();
n = rep->size();
pfb->Add(rep->data(), n);
pstringify += UFlatBuffer::GetByteWidth(n) + n;
return;
case_array:
{
UValue* element = toNode();
if (element == U_NULLPTR) pfb->AddVectorEmpty();
else
{
bool typed, fixed;
uint32_t start = pfb->StartVector();
uint8_t old_type = element->getTag();
n = 1;
fixed = ((typed = (isArrayOrObject(old_type) == false)) ? isNumeric(old_type) : false);
l1: U_DUMP("element = %p element->next = %p element->type = (%u,%S)", element, element->next, element->getTag(), getDataTypeDescription(element->getTag()))
element->toFlatBufferFromJSON();
if ((element = element->next))
{
U_INTERNAL_DUMP("typed = %b fixed = %b old_type = %u n = %u", typed, fixed, old_type, n)
if (typed)
{
if (element->getTag() == old_type)
{
if (fixed &&
++n > 4)
{
fixed = false;
}
}
else if (isBool(old_type) == false ||
element->isBool() == false)
{
typed = fixed = false;
}
}
goto l1;
}
pfb->EndVector(start, typed, fixed);
}
pstringify = (char*)pfb->getPointer();
return;
}
case_object:
{
UValue* element = toNode();
if (element == U_NULLPTR) pfb->AddMapEmpty();
else
{
uint32_t start = pfb->StartMap();
l2: U_DUMP("element = %p element->next = %p element->type = (%u,%S)", element, element->next, element->getTag(), getDataTypeDescription(element->getTag()))
rep = (UStringRep*)u_getPayload(element->pkey.ival);
pfb->Key(U_STRING_TO_PARAM(*rep));
element->toFlatBufferFromJSON();
if ((element = element->next)) goto l2;
pfb->EndMap(start);
}
pstringify = (char*)pfb->getPointer();
return;
}
case_null:
pfb->Add();
}
void UValue::fromFlatBufferToJSON(UFlatBuffer& fb)
{
U_TRACE(0, "UValue::fromFlatBufferToJSON(%p)", &fb)
uint8_t type = fb.GetType();
U_DUMP("fb.GetType() = (%u,%S)", type, UFlatBuffer::getTypeDescription(type))
switch (type)
{
case UFlatBufferValue::TYPE_NULL: setNull(); break;
case UFlatBufferValue::TYPE_BOOL: setBool( fb.AsBool()); break;
case UFlatBufferValue::TYPE_INT: setInt64( fb.AsInt64()); break;
case UFlatBufferValue::TYPE_UINT: setUInt64(fb.AsUInt64()); break;
case UFlatBufferValue::TYPE_INDIRECT_INT: setInt64( fb.AsIndirectInt64()); break;
case UFlatBufferValue::TYPE_INDIRECT_UINT: setUInt64(fb.AsIndirectUInt64()); break;
case UFlatBufferValue::TYPE_FLOAT: setDouble(fb.AsDouble()); break;
case UFlatBufferValue::TYPE_INDIRECT_FLOAT: setDouble(fb.AsIndirectDouble()); break;
case UFlatBufferValue::TYPE_STRING:
{
uint8_t* str = fb.Indirect();
addString((const char*)str, fb.getSize(str));
}
break;
case UFlatBufferValue::TYPE_VECTOR:
case UFlatBufferValue::TYPE_VECTOR_STRING:
case UFlatBufferValue::TYPE_VECTOR_INT:
case UFlatBufferValue::TYPE_VECTOR_UINT:
case UFlatBufferValue::TYPE_VECTOR_FLOAT:
case UFlatBufferValue::TYPE_VECTOR_INT2:
case UFlatBufferValue::TYPE_VECTOR_UINT2:
case UFlatBufferValue::TYPE_VECTOR_FLOAT2:
case UFlatBufferValue::TYPE_VECTOR_INT3:
case UFlatBufferValue::TYPE_VECTOR_UINT3:
case UFlatBufferValue::TYPE_VECTOR_FLOAT3:
case UFlatBufferValue::TYPE_VECTOR_INT4:
case UFlatBufferValue::TYPE_VECTOR_UINT4:
case UFlatBufferValue::TYPE_VECTOR_FLOAT4:
{
UFlatBuffer vec;
uint32_t i = 0, n;
initStackParser(false);
switch (type)
{
case UFlatBufferValue::TYPE_VECTOR:
{
UFlatBuffer fbb;
fb.AsVector(vec);
for (n = vec.GetSize(); i < n; ++i)
{
vec.AsVectorGet(i, fbb);
fromFlatBufferToJSON(fbb);
}
}
break;
case UFlatBufferValue::TYPE_VECTOR_STRING:
{
fb.AsTypedVector(vec);
for (n = vec.GetSize(); i < n; ++i) addStringParser(vec.AsTypedOrFixedVectorGet<UString>(i));
}
break;
default:
{
fb.AsFixedTypedVector(vec);
switch (type)
{
case UFlatBufferValue::TYPE_VECTOR_INT4: setInt64( vec.AsTypedOrFixedVectorGet< int64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_INT3: setInt64( vec.AsTypedOrFixedVectorGet< int64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_INT2: setInt64( vec.AsTypedOrFixedVectorGet< int64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_INT: setInt64( vec.AsTypedOrFixedVectorGet< int64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); break;
case UFlatBufferValue::TYPE_VECTOR_UINT4: setUInt64(vec.AsTypedOrFixedVectorGet<uint64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_UINT3: setUInt64(vec.AsTypedOrFixedVectorGet<uint64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_UINT2: setUInt64(vec.AsTypedOrFixedVectorGet<uint64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_UINT: setUInt64(vec.AsTypedOrFixedVectorGet<uint64_t>(i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); break;
case UFlatBufferValue::TYPE_VECTOR_FLOAT4: setDouble(vec.AsTypedOrFixedVectorGet<double>( i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_FLOAT3: setDouble(vec.AsTypedOrFixedVectorGet<double>( i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_FLOAT2: setDouble(vec.AsTypedOrFixedVectorGet<double>( i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival); /* FALLTHRU */
case UFlatBufferValue::TYPE_VECTOR_FLOAT: setDouble(vec.AsTypedOrFixedVectorGet<double>( i++)); sd[pos].tails = insertAfter(sd[pos].tails, o.ival);
break;
}
}
break;
}
U_INTERNAL_ASSERT_MAJOR(i, 0)
setArray();
}
break;
case UFlatBufferValue::TYPE_VECTOR_BOOL:
{
UFlatBuffer vec;
fb.AsTypedVector(vec);
uint32_t n = vec.GetSize();
if (n == 0) setArrayEmpty();
else
{
initStackParser(false);
for (uint32_t i = 0; i < n; ++i)
{
setBool(vec.AsTypedOrFixedVectorGet<bool>(i));
nextParser();
}
setArray();
}
}
break;
case UFlatBufferValue::TYPE_MAP:
{
UFlatBuffer map;
fb.AsMap(map);
uint32_t n = map.GetSize();
if (n == 0) setObjectEmpty();
else
{
UFlatBuffer keys, values, fbb;
map.AsMapGetKeys(keys);
map.AsMapGetValues(values);
initStackParser(true);
for (uint32_t i = 0; i < n; ++i)
{
addStringParser(keys.AsTypedOrFixedVectorGet<UString>(i));
values.AsVectorGet(i, fbb);
fromFlatBufferToJSON(fbb);
}
setObject();
}
}
break;
default:
{
U_INTERNAL_ASSERT(false)
}
break;
}
if (pos != -1) nextParser();
}
void UValue::toFlatBuffer(UFlatBuffer& fb, UString& result) const
{
U_TRACE(0, "UValue::toFlatBuffer(%p,%p)", &fb, &result)
U_INTERNAL_DUMP("size = %u UFlatBuffer::getBufferMax() = %u UFlatBuffer::getStackMax() = %u", size, UFlatBuffer::getBufferMax(), UFlatBuffer::getStackMax())
uint8_t* prev_stack;
uint8_t* prev_buffer;
uint8_t stack[64 * 1024];
uint32_t end, prev_stack_size, prev_buffer_size;
bool breset1 = (size > UFlatBuffer::getBufferMax()),
breset2 = (sizeof(stack) > UFlatBuffer::getStackMax());
// buffer to serialize json
if (breset1 == false) pstringify = (char*)UFlatBuffer::getBuffer();
else
{
prev_buffer = UFlatBuffer::getBuffer();
prev_buffer_size = UFlatBuffer::getBufferMax();
(void) result.reserve(size+100U);
UFlatBuffer::setBuffer((uint8_t*)(pstringify = result.data()), result.capacity());
}
if (breset2)
{
U_INTERNAL_ASSERT_MINOR(size, sizeof(stack))
prev_stack = UFlatBuffer::getStack();
prev_stack_size = UFlatBuffer::getStackMax();
UFlatBuffer::setStack(stack, sizeof(stack));
}
(pfb = &fb)->StartBuild();
toFlatBufferFromJSON();
end = fb.EndBuild();
if (breset1 == false) result = fb.getResult();
else
{
result.size_adjust(end);
UFlatBuffer::setBuffer(prev_buffer, prev_buffer_size);
}
if (breset2) UFlatBuffer::setStack(prev_stack, prev_stack_size);
}
bool UValue::parse(const UString& document)
{
U_TRACE(0, "UValue::parse(%V)", document.rep)
@ -786,6 +1152,7 @@ bool UValue::parse(const UString& document)
#endif
double val;
uint8_t type;
int gexponent;
const char* p;
unsigned char c;
@ -794,7 +1161,7 @@ bool UValue::parse(const UString& document)
uint64_t integerPart;
const char* s = document.data();
const char* end = s + (size = document.size());
uint32_t type, sz, significandDigit, decimalDigit, exponent;
uint32_t sz, significandDigit, decimalDigit, exponent;
bool minus = false, colon = false, comma = false, separator = true;
initParser();
@ -882,7 +1249,7 @@ dquote_assign:
{
U_NEW(UStringRep, rep, UStringRep(start, sz));
o.ival = getValue(type, rep);
setValue(type, rep);
}
else
{
@ -890,14 +1257,14 @@ dquote_assign:
str.hold();
o.ival = getValue(type, str.rep);
setValue(type, str.rep);
}
}
else
{
UStringRep::string_rep_null->hold();
o.ival = getValue(U_STRING_VALUE, UStringRep::string_rep_null);
setValue(U_STRING_VALUE, UStringRep::string_rep_null);
}
goto next;
@ -985,7 +1352,7 @@ case_zero:
{
zero: if (c == '.') goto case_number;
o.ival = getValue(U_UINT_VALUE, U_NULLPTR);
o.ival = u_getValue(U_UINT_VALUE, U_NULLPTR);
goto next;
}
@ -1162,37 +1529,30 @@ exp: if (u__issign((c = *++s))) ++s;
noreal:
U_INTERNAL_ASSERT_DIFFERS(*start, '.')
if (integerPart > U_VALUE_PAYLOAD_MASK) // U_VALUE_PAYLOAD_MASK => 140737488355327 (15 digit) - UINT_MAX => 4294967295 (9 digit)
{
val = (double)integerPart;
goto mreal1;
}
if (minus == false)
{
if (integerPart > UINT_MAX) // UINT_MAX => 4294967295 (9 digit)
{
val = (double)integerPart;
setValue(U_UINT_VALUE, (void*)integerPart);
goto mreal1;
}
U_INTERNAL_DUMP("value(%.*S) = %llu", s-start, start, integerPart)
o.ival = getValue(U_UINT_VALUE, (void*)(integerPart & 0x00000000FFFFFFFFULL));
U_INTERNAL_DUMP("value(%.*S) = %u", s-start, start, (uint32_t)integerPart)
U_INTERNAL_ASSERT_EQUALS((uint32_t)integerPart, ::strtoul(start, U_NULLPTR, 10))
U_INTERNAL_ASSERT_EQUALS(integerPart, ::strtoull(start, U_NULLPTR, 10))
}
else
{
if (integerPart > 2147483648ULL) // INT_MIN => -2147483648 (9 digit)
{
val = (double)integerPart;
goto mreal1;
}
minus = false;
o.ival = getValue(U_INT_VALUE, (void*)(-integerPart & 0x00000000FFFFFFFFULL));
setValue(U_INT_VALUE, (void*)integerPart);
U_INTERNAL_DUMP("value(%.*S) = %d", s-(start-1), start-1, -(int32_t)integerPart)
U_INTERNAL_DUMP("value(%.*S) = %lld", s-(start-1), start-1, -(int64_t)integerPart)
U_INTERNAL_ASSERT_EQUALS(-(int32_t)integerPart, ::strtol(start-1, U_NULLPTR, 10))
U_INTERNAL_ASSERT_EQUALS(-(int64_t)integerPart, ::strtoll(start-1, U_NULLPTR, 10))
}
goto next;
@ -1261,13 +1621,7 @@ case_svector:
if (*s != ']')
{
++pos;
U_INTERNAL_ASSERT_MINOR(pos, U_JSON_PARSE_STACK_SIZE)
sd[pos].keys = 0;
sd[pos].tails = U_NULLPTR;
sd[pos].obj = false;
initStackParser(false);
comma = false;
separator = true;
@ -1277,7 +1631,7 @@ case_svector:
++s;
o.ival = listToValue(U_ARRAY_VALUE, U_NULLPTR);
setArrayEmpty();
goto next;
@ -1291,14 +1645,14 @@ case_evector:
break;
}
o.ival = listToValue(U_ARRAY_VALUE, sd[pos--].tails);
setArray();
goto next;
case_false:
if (u_get_unalignedp32(s) == U_MULTICHAR_CONSTANT32('a','l','s','e'))
{
o.ival = getValue(U_FALSE_VALUE, U_NULLPTR);
setBool(false);
s = start+U_CONSTANT_SIZE("false");
@ -1310,7 +1664,7 @@ case_false:
case_null:
if (u_get_unalignedp32(start) == U_MULTICHAR_CONSTANT32('n','u','l','l'))
{
o.ival = getValue(U_NULL_VALUE, U_NULLPTR);
setNull();
s = start+U_CONSTANT_SIZE("null");
@ -1322,7 +1676,7 @@ case_null:
case_true:
if (u_get_unalignedp32(start) == U_MULTICHAR_CONSTANT32('t','r','u','e'))
{
o.ival = getValue(U_TRUE_VALUE, U_NULLPTR);
setBool(true);
s = start+U_CONSTANT_SIZE("true");
@ -1336,13 +1690,7 @@ case_sobject:
if (*s != '}')
{
++pos;
U_INTERNAL_ASSERT_MINOR(pos, U_JSON_PARSE_STACK_SIZE)
sd[pos].keys = 0;
sd[pos].tails = U_NULLPTR;
sd[pos].obj = true;
initStackParser(true);
comma = false;
separator = true;
@ -1352,7 +1700,7 @@ case_sobject:
++s;
o.ival = listToValue(U_OBJECT_VALUE, U_NULLPTR);
setObjectEmpty();
goto next;
@ -1367,7 +1715,7 @@ case_eobject:
break;
}
o.ival = listToValue(U_OBJECT_VALUE, sd[pos--].tails);
setObject();
next: U_INTERNAL_DUMP("next: comma = %b pos = %d colon = %b separator = %b s = %.10S", comma, pos, colon, separator, s)
@ -1390,7 +1738,7 @@ next: U_INTERNAL_DUMP("next: comma = %b pos = %d colon = %b separator = %b s = %
comma =
separator = false;
U_DUMP("sd[%d].obj = (%d,%S) sd[%d].tails = %p", pos, (sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE),
U_DUMP("sd[%u].obj = (%d,%S) sd[%u].tails = %p", pos, (sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE),
getDataTypeDescription((sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE)), pos, sd[pos].tails)
if (sd[pos].obj == false) sd[pos].tails = insertAfter(sd[pos].tails, o.ival);
@ -1447,11 +1795,11 @@ void UValue::nextParser()
{
U_TRACE_NO_PARAM(0, "UValue::nextParser()")
U_INTERNAL_DUMP("UValue::pos = %d", UValue::pos)
U_INTERNAL_DUMP("pos = %d", pos)
U_INTERNAL_ASSERT_DIFFERS(UValue::pos, -1)
U_INTERNAL_ASSERT_DIFFERS(pos, -1)
U_DUMP("sd[%d].obj = (%d,%S) sd[%d].tails = %p sd[%d].keys = %#llx", pos, (sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE),
U_DUMP("sd[%u].obj = (%d,%S) sd[%u].tails = %p sd[%u].keys = %#llx", pos, (sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE),
getDataTypeDescription((sd[pos].obj ? U_OBJECT_VALUE : U_ARRAY_VALUE)), pos, sd[pos].tails, pos, sd[pos].keys)
if (sd[pos].obj == false) sd[pos].tails = insertAfter(sd[pos].tails, o.ival);
@ -1461,7 +1809,7 @@ void UValue::nextParser()
{
sd[pos].keys = o.ival;
U_INTERNAL_DUMP("sd[%d].keys = %V", pos, u_getPayload(sd[pos].keys))
U_INTERNAL_DUMP("sd[%u].keys = %V", pos, u_getPayload(sd[pos].keys))
return;
}
@ -2169,13 +2517,13 @@ bool UValue::jfind(const UString& json, const char* query, uint32_t query_len, U
U_ASSERT(result.empty())
U_INTERNAL_ASSERT(u_is_quoted(query, query_len))
uint32_t pos = json.find(query, 0, query_len);
uint32_t idx = json.find(query, 0, query_len);
if (pos == U_NOT_FOUND) U_RETURN(false);
if (idx == U_NOT_FOUND) U_RETURN(false);
pos += query_len;
idx += query_len;
UTokenizer tok(json.substr(pos));
UTokenizer tok(json.substr(idx));
int sTok = jreadFindToken(tok);
@ -2280,7 +2628,7 @@ const char* UValue::getJReadErrorDescription()
U_RETURN(descr);
}
const char* UValue::getDataTypeDescription(uint32_t type)
const char* UValue::getDataTypeDescription(uint8_t type)
{
U_TRACE(0, "UValue::getDataTypeDescription(%u)", type)

View File

@ -208,13 +208,15 @@ int UProxyPlugIn::handlerRequest()
UString body = client_http->getContent(),
content_type = client_http->getResponseHeader()->getContentType();
U_INTERNAL_ASSERT(body)
if (body &&
content_type)
{
if (UHTTP::service->isReplaceResponse()) body = UHTTP::service->replaceResponse(body);
if (UHTTP::service->isReplaceResponse()) body = UHTTP::service->replaceResponse(body);
content_type.rep->_length += 2; // NB: we add "\r\n"...
content_type.rep->_length += 2; // NB: we add "\r\n"...
UHTTP::setDynamicResponse(body, UString::getStringNull(), content_type);
UHTTP::setDynamicResponse(body, UString::getStringNull(), content_type);
}
}
}

View File

@ -35,6 +35,17 @@
#undef snprintf
#endif
#define PHP_MAJOR_VERSION 7
#define PHP_MINOR_VERSION 1
#define PHP_RELEASE_VERSION 8
#define PHP_EXTRA_VERSION "-1ubuntu1"
#define PHP_VERSION "7.1.8-1ubuntu1"
#define PHP_VERSION_ID 70108
#define PHP_VERSION_NUM (PHP_MAJOR_VERSION * 10000 + \
PHP_MINOR_VERSION * 100 + \
PHP_RELEASE_VERSION)
extern "C" {
static void UPHP_set_environment(void* env, char* name, char* value)
@ -103,12 +114,21 @@ static char* read_cookies()
return 0;
}
#if PHP_VERSION_NUM < 70108
static void log_message(char* message)
{
U_TRACE(0, "PHP::log_message(%S)", message)
U_SRV_LOG("%s", message);
}
#else
static void log_message(char* message, int len)
{
U_TRACE(0, "PHP::log_message(%.*S,%u)", len, message, len)
U_SRV_LOG("%.*s", len, message);
}
#endif
extern U_EXPORT bool initPHP();
U_EXPORT bool initPHP()

View File

@ -0,0 +1,17 @@
<!--#args
arg1;
arg2;
-->
<!--#code
double val1 = std::stod(arg1.data());
double check1 = arg1.strtod();
double val2 = std::stod(arg2.data());
double check2 = arg2.strtod();
double result = 0.0;
result = val1 + val2;
USP_PRINTF("<hr>\n%g + %g = %g", val1, val2, result);
result = check1 + check2;
USP_PRINTF("<hr>\n%g + %g = %g", check1, check2, result);
-->

View File

@ -0,0 +1,364 @@
// ============================================================================
//
// = LIBRARY
// ULib - c++ library
//
// = FILENAME
// flatbuffers.cpp
//
// = AUTHOR
// Stefano Casazza
//
// ============================================================================
#include <ulib/serialize/flatbuffers.h>
uint8_t* UFlatBuffer::stack_str;
uint8_t* UFlatBuffer::buffer_str;
uint32_t UFlatBuffer::stack_idx;
uint32_t UFlatBuffer::stack_max;
uint32_t UFlatBuffer::buffer_max;
UFlatBufferValue* UFlatBuffer::pkeys;
UFlatBufferValue* UFlatBuffer::pvalue;
uint32_t UFlatBuffer::AsMapGetKeys(UVector<UString>& members) const
{
U_TRACE(0, "UFlatBuffer::AsMapGetKeys(%p)", &members)
UString key;
UFlatBuffer vec;
uint32_t len = members.size();
AsMapGetKeys(vec);
for (uint32_t i = 0, n = vec.GetSize(); i < n; ++i)
{
# ifndef HAVE_OLD_IOSTREAM
key = vec.AsTypedOrFixedVectorGet<UString>(i);
# endif
U_INTERNAL_DUMP("key = %V", key.rep)
members.push(key);
}
len = members.size() - len;
U_RETURN(len);
}
void UFlatBuffer::WriteAny(uint8_t byte_width)
{
U_TRACE(0, "UFlatBuffer::WriteAny(%u)", byte_width)
U_DUMP("pvalue->type_ = (%u,%S) pvalue->i_ = %llu", pvalue->type_, getTypeDescription(pvalue->type_), pvalue->i_)
switch (pvalue->type_)
{
case UFlatBufferValue::TYPE_NULL:
case UFlatBufferValue::TYPE_INT:
case UFlatBufferValue::TYPE_UINT:
case UFlatBufferValue::TYPE_BOOL: WriteScalar<uint64_t>(pvalue->u_, byte_width); break;
case UFlatBufferValue::TYPE_FLOAT: WriteDouble( pvalue->f_, byte_width); break;
case UFlatBufferValue::TYPE_STRING:
case UFlatBufferValue::TYPE_INDIRECT_INT:
case UFlatBufferValue::TYPE_INDIRECT_UINT:
case UFlatBufferValue::TYPE_INDIRECT_FLOAT:
case UFlatBufferValue::TYPE_MAP:
case UFlatBufferValue::TYPE_VECTOR:
case UFlatBufferValue::TYPE_VECTOR_INT:
case UFlatBufferValue::TYPE_VECTOR_UINT:
case UFlatBufferValue::TYPE_VECTOR_FLOAT:
case UFlatBufferValue::TYPE_VECTOR_BOOL:
case UFlatBufferValue::TYPE_VECTOR_STRING:
case UFlatBufferValue::TYPE_VECTOR_INT2:
case UFlatBufferValue::TYPE_VECTOR_UINT2:
case UFlatBufferValue::TYPE_VECTOR_FLOAT2:
case UFlatBufferValue::TYPE_VECTOR_INT3:
case UFlatBufferValue::TYPE_VECTOR_UINT3:
case UFlatBufferValue::TYPE_VECTOR_FLOAT3:
case UFlatBufferValue::TYPE_VECTOR_INT4:
case UFlatBufferValue::TYPE_VECTOR_UINT4:
case UFlatBufferValue::TYPE_VECTOR_FLOAT4: WriteOffset(pvalue->l_, byte_width);
break;
}
}
uint8_t* UFlatBuffer::AsMapSetIndex(const char* key, uint32_t len)
{
U_TRACE(0, "UFlatBuffer::AsMapSetIndex(%.*S,%u)", len, key, len)
U_INTERNAL_ASSERT(IsMap())
UString item;
UFlatBuffer keys;
AsMapGetKeys(keys);
for (uint32_t i = 0; i < keys.buffer_idx; ++i)
{
# ifndef HAVE_OLD_IOSTREAM
item = keys.AsTypedOrFixedVectorGet<UString>(i);
# endif
U_INTERNAL_DUMP("item[%u] = %V", i, item.rep)
if (item.equal(key, len)) return AsVectorSetIndex(i);
}
U_INTERNAL_ASSERT(false)
return U_NULLPTR;
}
void UFlatBuffer::CreateVector(uint32_t start, uint32_t vec_len, uint32_t step, bool typed, bool fixed, UFlatBufferValue* pval)
{
U_TRACE(0, "UFlatBuffer::CreateVector(%u,%u,%u,%b,%b,%p)", start, vec_len, step, typed, fixed, pval)
U_INTERNAL_ASSERT_MAJOR(vec_len, 0)
// Figure out smallest bit width we can store this vector with
uint32_t i, vloc, prefix_elems = 1;
vPF nextStackPtr = (step == 1 ? nextStackPointer : next2StackPointer);
uint8_t byte_width, bit_width = UFlatBufferValue::WidthL(vec_len), elem_width, vector_type;
if (pkeys)
{
// If this vector is part of a map, we will pre-fix an offset to the keys to this vector
elem_width = pkeys->ElemWidth(buffer_idx, 0);
if (bit_width < elem_width) bit_width = elem_width;
prefix_elems += 2;
}
// Check bit widths and types for all elements
setStackPointer((i = start));
vector_type = pvalue->type_;
loop1:
elem_width = pvalue->ElemWidth(buffer_idx, i + prefix_elems);
U_INTERNAL_DUMP("bit_width = %u elem_width = %u", bit_width, elem_width)
if (bit_width < elem_width) bit_width = elem_width;
#ifdef DEBUG
if (typed)
{
U_INTERNAL_ASSERT_EQUALS(vector_type, pvalue->type_) // you are writing a typed vector with elements that are not all the same type
U_INTERNAL_ASSERT(IsTypedVectorElementType(pvalue->type_)) // your type are not one of: Int / UInt / Float / Bool / String
}
#endif
if ((i += step) < stack_idx)
{
nextStackPtr();
goto loop1;
}
byte_width = Align(bit_width);
U_INTERNAL_DUMP("byte_width = %u vector_type = %u", byte_width, vector_type)
// Write vector. First the keys offset/width if available, and size
if (pkeys)
{
WriteOffset(pkeys->l_, byte_width);
WriteScalar<uint32_t>(1ULL << pkeys->min_bit_width_, byte_width);
}
if (fixed == false) WriteScalar<uint32_t>(vec_len, byte_width);
// Then the actual data
vloc = buffer_idx;
setStackPointer((i = start));
loop2:
WriteAny(byte_width);
if ((i += step) < stack_idx)
{
nextStackPtr();
goto loop2;
}
if (typed == false) // Then the types
{
setStackPointer((i = start));
loop3:
WriteScalar8(pvalue->StoredPackedType(bit_width));
if ((i += step) < stack_idx)
{
nextStackPtr();
goto loop3;
}
}
if (pval)
{
U_INTERNAL_ASSERT(typed)
U_INTERNAL_ASSERT_EQUALS(fixed, false)
U_INTERNAL_ASSERT_EQUALS(pkeys, U_NULLPTR)
U_INTERNAL_ASSERT_EQUALS(vector_type, UFlatBufferValue::TYPE_STRING)
pval->set(vloc, ToTypedVector(vector_type, 0), bit_width);
}
else if (pkeys == U_NULLPTR)
{
stack_idx = start; // Remove temp elements
pushOnStack(vloc, (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0) : (uint8_t)UFlatBufferValue::TYPE_VECTOR), bit_width);
}
else
{
U_INTERNAL_ASSERT_EQUALS(typed, false)
U_INTERNAL_ASSERT_EQUALS(fixed, false)
stack_idx = start-1; // Remove temp elements
pushOnStack(vloc, UFlatBufferValue::TYPE_MAP, bit_width);
}
U_INTERNAL_DUMP("buffer_str+vloc = %#.8S", buffer_str+vloc)
}
void UFlatBuffer::EndMap(uint32_t start)
{
U_TRACE(0, "UFlatBuffer::EndMap(%u)", start)
// We should have interleaved keys and values on the stack
U_INTERNAL_DUMP("stack_idx = %u", stack_idx)
U_INTERNAL_ASSERT_EQUALS((stack_idx-start) & 1, false) // Make sure it is an even number
uint32_t len = (stack_idx-start) / 2;
U_INTERNAL_ASSERT_MAJOR(len, 0)
#ifdef DEBUG // Make sure keys are all strings
int32_t key;
setStackPointer((key = start));
loop:
U_DUMP("key = %u pvalue->type_ = (%u,%S)", key, pvalue->type_, getTypeDescription(pvalue->type_))
// U_INTERNAL_ASSERT_EQUALS(pvalue->type_, UFlatBufferValue::TYPE_STRING)
if ((key += 2) < (int32_t)stack_idx)
{
next2StackPointer();
goto loop;
}
#endif
// First create a vector out of all keys
uint8_t keys[20];
CreateVector(start, len, 2, true, false, (UFlatBufferValue*)keys);
pkeys = (UFlatBufferValue*)keys;
CreateVector(start+1, len, 2, false, false, U_NULLPTR);
pkeys = U_NULLPTR;
}
// DEBUG
#ifdef DEBUG
const char* UFlatBuffer::getTypeDescription(uint8_t type)
{
U_TRACE(0, "UFlatBuffer::getTypeDescription(%u)", type)
struct type_info {
int value; // The numeric value
const char* name; // The equivalent symbolic value
};
static const struct type_info type_table[] = {
U_ENTRY(UFlatBufferValue::TYPE_NULL),
U_ENTRY(UFlatBufferValue::TYPE_INT),
U_ENTRY(UFlatBufferValue::TYPE_UINT),
U_ENTRY(UFlatBufferValue::TYPE_FLOAT),
U_ENTRY(UFlatBufferValue::TYPE_BOOL),
U_ENTRY(UFlatBufferValue::TYPE_STRING),
U_ENTRY(UFlatBufferValue::TYPE_INDIRECT_INT),
U_ENTRY(UFlatBufferValue::TYPE_INDIRECT_UINT),
U_ENTRY(UFlatBufferValue::TYPE_INDIRECT_FLOAT),
U_ENTRY(UFlatBufferValue::TYPE_MAP),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_INT),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_UINT),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_FLOAT),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_BOOL),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_STRING),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_INT2),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_UINT2),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_FLOAT2),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_INT3),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_UINT3),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_FLOAT3),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_INT4),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_UINT4),
U_ENTRY(UFlatBufferValue::TYPE_VECTOR_FLOAT4)
};
const char* descr = (type < (int)U_NUM_ELEMENTS(type_table) ? type_table[type].name : "type unknown");
U_RETURN(descr);
}
const char* UFlatBuffer::dump(bool reset) const
{
#ifdef U_STDCPP_ENABLE
*UObjectIO::os << "type_ " << type_ << '\n'
<< "buffer_idx " << buffer_idx << '\n'
<< "byte_width_ " << (uint32_t)byte_width_ << '\n'
<< "parent_width_ " << (uint32_t)parent_width_;
if (reset)
{
UObjectIO::output();
return UObjectIO::buffer_output;
}
#endif
return U_NULLPTR;
}
const char* UFlatBufferTypeHandler_Base::dump(bool _reset) const
{
#ifdef U_STDCPP_ENABLE
*UObjectIO::os << "pval " << pval;
if (_reset)
{
UObjectIO::output();
return UObjectIO::buffer_output;
}
#endif
return U_NULLPTR;
}
#endif

View File

@ -1952,7 +1952,14 @@ double UString::strtod() const
{
UValue json;
if (json.parse(*this)) return json.getDouble();
if (json.parse(*this))
{
double result = (json.isDouble() ? json.getDouble() : (double)json.getPayload());
U_INTERNAL_DUMP("json.getDouble() = %g", json.getDouble())
U_RETURN(result);
}
}
U_RETURN(.0);

View File

@ -313,6 +313,8 @@ UString UStringExt::substitute(const char* s, uint32_t len, UVector<UString>& ve
uint32_t n = vec.size();
U_INTERNAL_ASSERT_EQUALS(n & 1, 0)
if (n == 2) return substitute(s, len, U_STRING_TO_PARAM(vec[0]), U_STRING_TO_PARAM(vec[1]));
char c;
@ -344,16 +346,13 @@ UString UStringExt::substitute(const char* s, uint32_t len, UVector<UString>& ve
continue;
}
if (u__islower(c)) mask_lower |= maskFirstChar[c-'a'];
if (u__isdigit(c)) bdigit = true;
else if (u__isspace(c)) bspace = true;
else if (u__islower(c)) mask_lower |= maskFirstChar[c-'a'];
else if (u__isupper(c)) mask_upper |= maskFirstChar[c-'A'];
else if (u__isdigit(c)) bdigit = true;
else if (u__isspace(c)) bspace = true;
}
bdollar = (dollar == n);
U_INTERNAL_DUMP("n1 = %u n2 = %u mask_lower = %B mask_upper = %B bdigit = %b bspace = %b dollar = %u bdollar = %b",
n1, n2, mask_lower, mask_upper, bdigit, bspace, dollar, bdollar)
U_INTERNAL_DUMP("n1 = %u n2 = %u", n1, n2)
if (n2 <= n1) capacity = len;
else
@ -369,6 +368,11 @@ UString UStringExt::substitute(const char* s, uint32_t len, UVector<UString>& ve
char* p2 = x.data();
const char* end = s + len;
bdollar = (dollar == n);
U_INTERNAL_DUMP("mask_lower = %B mask_upper = %B bdigit = %b bspace = %b dollar = %u bdollar = %b",
mask_lower, mask_upper, bdigit, bspace, dollar, bdollar)
loop:
for (p1 = s; p1 < end; ++p1)
{
@ -475,6 +479,125 @@ found:
U_RETURN_STRING(x);
}
// The format s uses positional identifiers indicated by a dollar sign ($) and single digit
// positional ids to indicate which substitution arguments to use at that location within the format s
UString UStringExt::substituteIds(const char* s, uint32_t len, UVector<UString>& vec)
{
U_TRACE(1, "UStringExt::substituteIds(%.*S,%u,%p)", len, s, len, &vec)
U_INTERNAL_ASSERT_MAJOR(len, 0)
UString item;
uint32_t len1;
const char* p1;
bool breserve = false;
const char* end = s + len;
uint32_t i, n = vec.size(), n1 = n*2, n2 = 0, capacity, ids, old_ids = U_NOT_FOUND;
for (i = 0; i < n; ++i) n2 += vec[i].size();
if (n2 <= n1) capacity = len;
else
{
capacity = n2*((len+n1)/n1);
if (capacity > (256U * 1024U * 1024U)) capacity = (breserve = true, (256U * 1024U * 1024U)); // worst case...
}
U_INTERNAL_DUMP("n1 = %u n2 = %u breserve = %b", n1, n2, breserve)
UString x(capacity);
char* p2 = x.data();
loop:
for (p1 = s; p1 < end; ++p1)
{
U_INTERNAL_DUMP("p1 = %.10S", p1)
if (*p1 != '$') continue;
if (u__isdigit(p1[2]) == false) ids = (n1 = 2, p1[1] - '0');
else
{
for (i = 3; u__isdigit(p1[i]); ++i) {}
ids = (n1 = i, u__strtoul(p1+1, n1-1));
}
U_INTERNAL_DUMP("n1 = %u ids = %u old_ids = %u", n1, ids, old_ids)
if (ids != old_ids)
{
old_ids = ids;
n2 = (item = vec.at(ids)).size();
U_INTERNAL_DUMP("item(%u) = %V", n2, item.rep)
U_INTERNAL_ASSERT_MAJOR(n2, 0)
}
len1 = (p1-s);
U_INTERNAL_DUMP("len1 = %u", len1)
if (breserve)
{
uint32_t len2 = len1 + n2;
x.rep->_length = x.distance(p2);
if (x.space() < len2)
{
UString::_reserve(x, len2);
p2 = x.pend();
}
}
if (len1)
{
U_MEMCPY(p2, s, len1);
p2 += len1;
s = p1;
len -= len1;
}
len -= n1;
s += n1;
U_MEMCPY(p2, item.data(), n2);
p2 += n2;
goto loop;
}
x.rep->_length = x.distance(p2);
U_INTERNAL_DUMP("len = %u", len)
if (len)
{
if (breserve &&
x.space() < len)
{
UString::_reserve(x, len);
p2 = x.pend();
}
U_MEMCPY(p2, s, len);
x.rep->_length += len;
}
U_INTERNAL_ASSERT(x.invariant())
U_RETURN_STRING(x);
}
// dos2unix: '\n' <=> '\r\n' convertor
UString UStringExt::dos2unix(const UString& s, bool unix2dos)

View File

@ -883,7 +883,7 @@ void UHTTP::init()
#endif
#ifdef USE_LIBSSL
// if (UServer_Base::bssl) enable_caching_by_proxy_servers = true;
// if (UServer_Base::bssl) enable_caching_by_proxy_servers = true;
#endif
#if defined(USE_PAGE_SPEED) || defined(USE_LIBV8) || defined(USE_RUBY) || defined(USE_PHP) || defined(USE_PYTHON)
@ -1135,21 +1135,12 @@ void UHTTP::init()
if (cache_file_store)
{
# ifdef U_STDCPP_ENABLE
content_cache = (UStringExt::endsWith(U_STRING_TO_PARAM(*cache_file_store), U_CONSTANT_TO_PARAM(".gz"))
? UStringExt::gunzip(UFile::contentOf(*cache_file_store))
: UFile::contentOf(*cache_file_store));
# ifdef U_STDCPP_ENABLE
if (content_cache)
{
n += (content_cache.size() / (1024 + 512)); // NB: we assume as medium file size something like ~1.5k...
UString2Object(U_STRING_TO_PARAM(content_cache), *cache_file);
U_ASSERT_MAJOR(cache_file->size(), 0)
U_SRV_LOG("Loaded cache file store: %V", cache_file_store->rep);
}
if (content_cache) n += (content_cache.size() / (1024 + 512)); // NB: we assume as medium file size something like ~1.5k...
# endif
}
@ -1157,6 +1148,17 @@ void UHTTP::init()
if (sz > cache_file->capacity()) cache_file->allocate(u_nextPowerOfTwo(sz));
#ifdef U_STDCPP_ENABLE
if (content_cache)
{
UString2Object(U_STRING_TO_PARAM(content_cache), *cache_file);
U_ASSERT_MAJOR(cache_file->size(), 0)
U_SRV_LOG("Loaded cache file store: %V", cache_file_store->rep);
}
#endif
U_INTERNAL_ASSERT_POINTER(pathname)
for (uint32_t i = 0, j = vec.size(); i < j; ++i)
@ -1177,6 +1179,7 @@ void UHTTP::init()
}
}
#ifdef U_STDCPP_ENABLE
if (cache_file_store &&
content_cache.empty())
{
@ -1188,6 +1191,7 @@ void UHTTP::init()
if (UFile::writeTo(*cache_file_store, buffer, sz)) U_SRV_LOG("Saved (%u bytes) cache file store: %V", sz, cache_file_store->rep);
}
#endif
#ifdef USE_PHP
U_INTERNAL_ASSERT_EQUALS(php_embed, U_NULLPTR)
@ -1226,6 +1230,7 @@ void UHTTP::init()
U_INTERNAL_DUMP("htdigest = %p htpasswd = %p", htdigest, htpasswd)
#ifdef U_STDCPP_ENABLE
if (htdigest ||
htpasswd)
{
@ -1268,7 +1273,7 @@ void UHTTP::init()
U_SRV_LOG("Loaded cache favicon.ico");
}
#ifdef U_HTML_PAGINATION_SUPPORT // manage css for HTML Pagination
# ifdef U_HTML_PAGINATION_SUPPORT // manage css for HTML Pagination
file_data = cache_file->at(U_CONSTANT_TO_PARAM("css/pagination.min.css"));
if (file_data == U_NULLPTR)
@ -1285,6 +1290,7 @@ void UHTTP::init()
U_SRV_LOG("Loaded cache css store for HTML pagination");
}
# endif
#endif
sz = cache_file->size();
@ -7787,6 +7793,15 @@ void UHTTP::manageRequest(service_info* GET_table, uint32_t n1,
U_INTERNAL_ASSERT_EQUALS(target[0], '/')
if (target[1] == '/')
{
do {
++target;
--target_len;
}
while (target[1] == '/');
}
if (high == 0 ||
--target_len == 0)
{

View File

@ -250,10 +250,12 @@ loop:
payload_length = 0;
payload_length_bytes_remaining = 0;
if (block_offset >= block_size) goto next; /* FALLTHRU */
if (block_offset >= block_size) goto next;
U_INTERNAL_DUMP("framing_state = %d", framing_state)
}
U_INTERNAL_DUMP("framing_state = %d", framing_state)
/* FALLTHRU */
case DATA_FRAMING_PAYLOAD_LENGTH: // 2
{
@ -290,10 +292,12 @@ loop:
framing_state = DATA_FRAMING_PAYLOAD_LENGTH_EXT; // 3
if (block_offset >= block_size) goto next; /* FALLTHRU */
if (block_offset >= block_size) goto next;
U_INTERNAL_DUMP("framing_state = %d", framing_state)
}
U_INTERNAL_DUMP("framing_state = %d", framing_state)
/* FALLTHRU */
case DATA_FRAMING_PAYLOAD_LENGTH_EXT: // 3
{
@ -330,10 +334,12 @@ loop:
framing_state = DATA_FRAMING_MASK; // 0
}
if (block_offset >= block_size) goto next; /* FALLTHRU */
if (block_offset >= block_size) goto next;
U_INTERNAL_DUMP("framing_state = %d", framing_state)
}
U_INTERNAL_DUMP("framing_state = %d", framing_state)
/* FALLTHRU */
case DATA_FRAMING_MASK: // 0
{
@ -357,12 +363,10 @@ loop:
masking = 0;
}
U_INTERNAL_DUMP("masking = %d", masking)
/* FALLTHRU */
U_INTERNAL_DUMP("masking = %d framing_state = %d", masking, framing_state)
}
U_INTERNAL_DUMP("framing_state = %d", framing_state)
/* FALLTHRU */
case DATA_FRAMING_EXTENSION_DATA: // 4
{
@ -382,10 +386,10 @@ loop:
framing_state = DATA_FRAMING_APPLICATION_DATA; // 5
}
/* FALLTHRU */
U_INTERNAL_DUMP("framing_state = %d", framing_state)
}
U_INTERNAL_DUMP("framing_state = %d", framing_state)
/* FALLTHRU */
case DATA_FRAMING_APPLICATION_DATA: // 5
{

View File

@ -79,8 +79,8 @@ userver {
#DOCUMENT_ROOT docroot
#PLUGIN_DIR ../../../src/ulib/net/server/plugin/.libs
#ORM_DRIVER_DIR ../../../src/ulib/orm/driver/.libs
DOCUMENT_ROOT JONATHAN/docroot
#DOCUMENT_ROOT benchmark/docroot
#DOCUMENT_ROOT JONATHAN/docroot
DOCUMENT_ROOT benchmark/docroot
PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs
ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs
#DOCUMENT_ROOT .

View File

@ -4,7 +4,7 @@
AUTOMAKE_OPTIONS = ## dist-shar dist-zip
EXTRA_DIST = random.cdb plugin inp ok *.test *.cpp CA private server_rpc.cfg file_config.cf file_config.gperf \
file_config.gperf.sh file_config.key test_bison.h dialog.test redis.test elasticsearch.test twilio.test
file_config.gperf.sh file_config.key test_bison.h dialog.test redis.test elasticsearch.test twilio.test json_obj.h
MAINTAINERCLEANFILES = Makefile.in
@ -18,7 +18,7 @@ PRG = test_timeval test_timer test_notifier test_string \
test_services test_base64 test_header test_entity \
test_ipaddress test_socket test_ftp test_http test_rdb_client \
test_tokenizer test_query_parser test_multipart test_command test_dialog test_json test_redis test_elasticsearch \
test_smtp test_pop3 test_imap test_hash_map
test_smtp test_pop3 test_imap test_hash_map test_serialize
## test_twilio
TST = timeval.test timer.test notifier.test string.test \
@ -26,7 +26,7 @@ TST = timeval.test timer.test notifier.test string.test \
vector.test options.test application.test tree.test compress.test cache.test date.test \
services.test base64.test header.test entity.test \
ipaddress.test socket.test ftp.test http.test \
tokenizer.test query_parser.test multipart.test command.test json.test hash_map.test
tokenizer.test query_parser.test multipart.test command.test json.test hash_map.test serialize.test
## pop3.test imap.test smtp.test dialog.test redis.test elasticsearch.test twilio.test
if ENABLE_SHARED
@ -102,6 +102,7 @@ test_redis_SOURCES = test_redis.cpp
test_mongodb_SOURCES = test_mongodb.cpp
test_elasticsearch_SOURCES = test_elasticsearch.cpp
test_hash_map_SOURCES = test_hash_map.cpp
test_serialize_SOURCES = test_serialize.cpp
if PTHREAD
PRG += test_thread
@ -242,7 +243,7 @@ TESTS = $(TST) ../reset.color
## arping.test event.test curl.test ftp.test imap.test ldap.test pop3.test sigslot.test smtp.test ssh_client.test
test: all-am
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
../make_test.sh application.test base64.test bit_array.test cache.test cdb.test certificate.test command.test compress.test crl.test date.test des3.test dialog.test digest.test entity.test expat.test file.test file_config.test header.test http.test https.test interrupt.test json.test log.test memory_pool.test multipart.test notifier.test options.test pcre.test pkcs10.test pkcs7.test plugin.test process.test query_parser.test rdb.test rdb_client_server.test server.test server_rpc.test services.test soap_client.test soap_server.test ssl_client_server.test string.test timer.test timestamp.test timeval.test tokenizer.test tree.test unixsocket.test url.test vector.test zip.test hash_map.test ../reset.color
../make_test.sh application.test base64.test bit_array.test cache.test cdb.test certificate.test command.test compress.test crl.test date.test des3.test dialog.test digest.test entity.test expat.test file.test file_config.test header.test http.test https.test interrupt.test json.test log.test memory_pool.test multipart.test notifier.test options.test pcre.test pkcs10.test pkcs7.test plugin.test process.test query_parser.test rdb.test rdb_client_server.test server.test server_rpc.test services.test soap_client.test soap_server.test ssl_client_server.test string.test timer.test timestamp.test timeval.test tokenizer.test tree.test unixsocket.test url.test vector.test zip.test hash_map.test serialize.test ../reset.color
clean-local:
-rm -rf out err core .libs *.bb* *.da *.gc* *.log test_log.log* tmp/* \

View File

@ -227,13 +227,13 @@ am__EXEEXT_19 = test_timeval$(EXEEXT) test_timer$(EXEEXT) \
test_dialog$(EXEEXT) test_json$(EXEEXT) test_redis$(EXEEXT) \
test_elasticsearch$(EXEEXT) test_smtp$(EXEEXT) \
test_pop3$(EXEEXT) test_imap$(EXEEXT) test_hash_map$(EXEEXT) \
$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
$(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
$(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
$(am__EXEEXT_10) $(am__EXEEXT_2) $(am__EXEEXT_3) \
$(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13) \
$(am__EXEEXT_14) $(am__EXEEXT_15) $(am__EXEEXT_16) \
$(am__EXEEXT_17) $(am__EXEEXT_18)
test_serialize$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
$(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5) \
$(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8) \
$(am__EXEEXT_9) $(am__EXEEXT_10) $(am__EXEEXT_2) \
$(am__EXEEXT_3) $(am__EXEEXT_11) $(am__EXEEXT_12) \
$(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) \
$(am__EXEEXT_16) $(am__EXEEXT_17) $(am__EXEEXT_18)
am_test_application_OBJECTS = test_application.$(OBJEXT)
test_application_OBJECTS = $(am_test_application_OBJECTS)
test_application_LDADD = $(LDADD)
@ -462,6 +462,10 @@ am_test_redis_OBJECTS = test_redis.$(OBJEXT)
test_redis_OBJECTS = $(am_test_redis_OBJECTS)
test_redis_LDADD = $(LDADD)
test_redis_DEPENDENCIES = $(top_builddir)/src/ulib/lib@ULIB@.la
am_test_serialize_OBJECTS = test_serialize.$(OBJEXT)
test_serialize_OBJECTS = $(am_test_serialize_OBJECTS)
test_serialize_LDADD = $(LDADD)
test_serialize_DEPENDENCIES = $(top_builddir)/src/ulib/lib@ULIB@.la
am_test_server_OBJECTS = test_server.$(OBJEXT)
test_server_OBJECTS = $(am_test_server_OBJECTS)
test_server_LDADD = $(LDADD)
@ -625,16 +629,16 @@ SOURCES = $(product1_la_SOURCES) $(product2_la_SOURCES) \
$(test_pop3_SOURCES) $(test_process_SOURCES) \
$(test_query_parser_SOURCES) $(test_rdb_SOURCES) \
$(test_rdb_client_SOURCES) $(test_rdb_server_SOURCES) \
$(test_redis_SOURCES) $(test_server_SOURCES) \
$(test_services_SOURCES) $(test_smtp_SOURCES) \
$(test_soap_client_SOURCES) $(test_soap_server_SOURCES) \
$(test_socket_SOURCES) $(test_ssh_client_SOURCES) \
$(test_ssl_client_SOURCES) $(test_ssl_server_SOURCES) \
$(test_string_SOURCES) $(test_tdb_SOURCES) \
$(test_thread_SOURCES) $(test_timer_SOURCES) \
$(test_timestamp_SOURCES) $(test_timeval_SOURCES) \
$(test_tokenizer_SOURCES) $(test_tree_SOURCES) \
$(test_unixsocket_client_SOURCES) \
$(test_redis_SOURCES) $(test_serialize_SOURCES) \
$(test_server_SOURCES) $(test_services_SOURCES) \
$(test_smtp_SOURCES) $(test_soap_client_SOURCES) \
$(test_soap_server_SOURCES) $(test_socket_SOURCES) \
$(test_ssh_client_SOURCES) $(test_ssl_client_SOURCES) \
$(test_ssl_server_SOURCES) $(test_string_SOURCES) \
$(test_tdb_SOURCES) $(test_thread_SOURCES) \
$(test_timer_SOURCES) $(test_timestamp_SOURCES) \
$(test_timeval_SOURCES) $(test_tokenizer_SOURCES) \
$(test_tree_SOURCES) $(test_unixsocket_client_SOURCES) \
$(test_unixsocket_server_SOURCES) $(test_url_SOURCES) \
$(test_vector_SOURCES) $(test_zip_SOURCES)
DIST_SOURCES = $(am__product1_la_SOURCES_DIST) \
@ -664,9 +668,9 @@ DIST_SOURCES = $(am__product1_la_SOURCES_DIST) \
$(test_pop3_SOURCES) $(am__test_process_SOURCES_DIST) \
$(test_query_parser_SOURCES) $(test_rdb_SOURCES) \
$(test_rdb_client_SOURCES) $(test_rdb_server_SOURCES) \
$(test_redis_SOURCES) $(test_server_SOURCES) \
$(test_services_SOURCES) $(test_smtp_SOURCES) \
$(am__test_soap_client_SOURCES_DIST) \
$(test_redis_SOURCES) $(test_serialize_SOURCES) \
$(test_server_SOURCES) $(test_services_SOURCES) \
$(test_smtp_SOURCES) $(am__test_soap_client_SOURCES_DIST) \
$(am__test_soap_server_SOURCES_DIST) $(test_socket_SOURCES) \
$(am__test_ssh_client_SOURCES_DIST) \
$(am__test_ssl_client_SOURCES_DIST) \
@ -1105,7 +1109,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = ## dist-shar dist-zip
EXTRA_DIST = random.cdb plugin inp ok *.test *.cpp CA private server_rpc.cfg file_config.cf file_config.gperf \
file_config.gperf.sh file_config.key test_bison.h dialog.test redis.test elasticsearch.test twilio.test
file_config.gperf.sh file_config.key test_bison.h dialog.test redis.test elasticsearch.test twilio.test json_obj.h
MAINTAINERCLEANFILES = Makefile.in
DEFAULT_INCLUDES = -I. -I$(top_builddir)/include
@ -1118,7 +1122,7 @@ PRG = test_timeval test_timer test_notifier test_string test_file \
test_http test_rdb_client test_tokenizer test_query_parser \
test_multipart test_command test_dialog test_json test_redis \
test_elasticsearch test_smtp test_pop3 test_imap test_hash_map \
$(am__append_1) $(am__append_3) $(am__append_4) \
test_serialize $(am__append_1) $(am__append_3) $(am__append_4) \
$(am__append_5) $(am__append_6) $(am__append_8) \
$(am__append_10) $(am__append_12) $(am__append_14) \
$(am__append_16) $(am__append_18) $(am__append_20) \
@ -1131,12 +1135,13 @@ TST = timeval.test timer.test notifier.test string.test file.test \
cache.test date.test services.test base64.test header.test \
entity.test ipaddress.test socket.test ftp.test http.test \
tokenizer.test query_parser.test multipart.test command.test \
json.test hash_map.test $(am__append_2) $(am__append_7) \
$(am__append_9) $(am__append_11) $(am__append_13) \
$(am__append_15) $(am__append_17) $(am__append_19) \
$(am__append_21) $(am__append_23) $(am__append_25) \
$(am__append_27) $(am__append_29) $(am__append_31) \
$(am__append_33) $(am__append_35) $(am__append_37)
json.test hash_map.test serialize.test $(am__append_2) \
$(am__append_7) $(am__append_9) $(am__append_11) \
$(am__append_13) $(am__append_15) $(am__append_17) \
$(am__append_19) $(am__append_21) $(am__append_23) \
$(am__append_25) $(am__append_27) $(am__append_29) \
$(am__append_31) $(am__append_33) $(am__append_35) \
$(am__append_37)
@ENABLE_PLUGINS_TRUE@@ENABLE_SHARED_TRUE@test_plugin_SOURCES = test_plugin.cpp
@ENABLE_PLUGINS_TRUE@@ENABLE_SHARED_TRUE@product1_la_SOURCES = plugin/product1.cpp
@ENABLE_PLUGINS_TRUE@@ENABLE_SHARED_TRUE@product1_la_LIBADD = $(LDADD)
@ -1186,6 +1191,7 @@ test_redis_SOURCES = test_redis.cpp
test_mongodb_SOURCES = test_mongodb.cpp
test_elasticsearch_SOURCES = test_elasticsearch.cpp
test_hash_map_SOURCES = test_hash_map.cpp
test_serialize_SOURCES = test_serialize.cpp
@PTHREAD_TRUE@test_thread_SOURCES = test_thread.cpp
@ZIP_TRUE@test_zip_SOURCES = test_zip.cpp
@LIBTDB_TRUE@test_tdb_SOURCES = test_tdb.cpp
@ -1494,6 +1500,10 @@ test_redis$(EXEEXT): $(test_redis_OBJECTS) $(test_redis_DEPENDENCIES) $(EXTRA_te
@rm -f test_redis$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(test_redis_OBJECTS) $(test_redis_LDADD) $(LIBS)
test_serialize$(EXEEXT): $(test_serialize_OBJECTS) $(test_serialize_DEPENDENCIES) $(EXTRA_test_serialize_DEPENDENCIES)
@rm -f test_serialize$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(test_serialize_OBJECTS) $(test_serialize_LDADD) $(LIBS)
test_server$(EXEEXT): $(test_server_OBJECTS) $(test_server_DEPENDENCIES) $(EXTRA_test_server_DEPENDENCIES)
@rm -f test_server$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(test_server_OBJECTS) $(test_server_LDADD) $(LIBS)
@ -1641,6 +1651,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rdb_client.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rdb_server.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_redis.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_serialize.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_server.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_services.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_smtp.Po@am__quote@
@ -2077,7 +2088,7 @@ uninstall-am:
test: all-am
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
../make_test.sh application.test base64.test bit_array.test cache.test cdb.test certificate.test command.test compress.test crl.test date.test des3.test dialog.test digest.test entity.test expat.test file.test file_config.test header.test http.test https.test interrupt.test json.test log.test memory_pool.test multipart.test notifier.test options.test pcre.test pkcs10.test pkcs7.test plugin.test process.test query_parser.test rdb.test rdb_client_server.test server.test server_rpc.test services.test soap_client.test soap_server.test ssl_client_server.test string.test timer.test timestamp.test timeval.test tokenizer.test tree.test unixsocket.test url.test vector.test zip.test hash_map.test ../reset.color
../make_test.sh application.test base64.test bit_array.test cache.test cdb.test certificate.test command.test compress.test crl.test date.test des3.test dialog.test digest.test entity.test expat.test file.test file_config.test header.test http.test https.test interrupt.test json.test log.test memory_pool.test multipart.test notifier.test options.test pcre.test pkcs10.test pkcs7.test plugin.test process.test query_parser.test rdb.test rdb_client_server.test server.test server_rpc.test services.test soap_client.test soap_server.test ssl_client_server.test string.test timer.test timestamp.test timeval.test tokenizer.test tree.test unixsocket.test url.test vector.test zip.test hash_map.test serialize.test ../reset.color
clean-local:
-rm -rf out err core .libs *.bb* *.da *.gc* *.log test_log.log* tmp/* \

1548
tests/ulib/json_obj.h Normal file

File diff suppressed because it is too large Load Diff

View File

19
tests/ulib/serialize.test Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
. ../.function
## serialize.test -- Test serialize feature
start_msg serialize
#UTRACE="0 30M -1"
#UOBJDUMP="0 100k 10"
#USIMERR="error.sim"
export UTRACE UOBJDUMP USIMERR
#STRACE=$LTRUSS
#VALGRIND=valgrind
start_prg serialize <inp/file_config.input
# Test against expected output
test_output_wc l serialize

View File

@ -6,7 +6,7 @@
start_msg string
#UTRACE="0 50M -1"
#UTRACE="0 50M 0"
#UOBJDUMP="0 100k 10"
#USIMERR="error.sim"
UMEMPOOL=0,0,0,0,0,0,0,0,0:20971520,2097152

View File

@ -70,7 +70,7 @@ int U_EXPORT main(int argc, char* argv[], char* env[])
U_INTERNAL_ASSERT_POINTER(total)
U_ASSERT(total->isNumeric())
cout << "We found " << total->getUInt() << std::endl;
cout << "We found " << total->getNumber() << std::endl;
}
}
@ -133,7 +133,7 @@ int U_EXPORT main(int argc, char* argv[], char* env[])
U_INTERNAL_ASSERT_POINTER(total)
U_ASSERT(total->isNumeric())
cout << "We found " << total->getUInt() << std::endl;
cout << "We found " << total->getNumber() << std::endl;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,6 @@ static void print_size()
U_PRINT_SIZEOF(UFtpClient);
// U_PRINT_SIZEOF(UFuncSlot);
U_PRINT_SIZEOF(UHashMap<UString>);
U_PRINT_SIZEOF(UHashMapNode);
U_PRINT_SIZEOF(UHttpClient<UTCPSocket>);
U_PRINT_SIZEOF(UIPAddress);
#ifdef HAVE_LDAP

View File

@ -0,0 +1,848 @@
// test_serialize.cpp
#include <ulib/file.h>
#include <ulib/utility/hexdump.h>
#include "json_obj.h"
static void check(UFlatBuffer& fb, const UString& to_parse, const UString& expect)
{
U_TRACE(5, "check(%p,%V,%V)", &fb, to_parse.rep, expect.rep)
UString result = fb.getResult();
U_ASSERT_EQUALS(result, expect)
UValue json;
bool ok = json.parse(to_parse);
U_INTERNAL_ASSERT(ok)
result = json.toFlatBuffer();
U_ASSERT_EQUALS(result, expect)
json.clear();
json.fromFlatBuffer(fb);
result = json.output();
U_ASSERT_EQUALS(result, to_parse)
}
int U_EXPORT main(int argc, char* argv[], char* env[])
{
U_ULIB_INIT(argv);
U_TRACE(5, "main(%d)", argc)
uint64_t i, size;
uint8_t stack[1024];
UFlatBuffer fb, vec, vec0, map, map0;
uint64_t vec1[] = {1, 2, 3, 7};
bool vec2[] = {true, false, true};
double vec3[] = {1.0, 0.2, 0.5, 5.6};
UFlatBuffer::setStack(stack, sizeof(stack));
Request().testFlatBuffer();
Response().testFlatBuffer();
ResponseLogin().testFlatBuffer();
ResponseSearch().testFlatBuffer();
// Write the json equivalent of: ""
size = fb.encode([&]() { fb.String(U_CONSTANT_TO_PARAM("")); });
fb.setRoot();
U_ASSERT(fb.AsString().isNull())
check(fb, U_STRING_FROM_CONSTANT("\"\""), U_HEXDUMP("00001401"));
// Write the json equivalent of: []
fb.StartBuild();
fb.AddVectorEmpty();
(void) fb.EndBuild();
fb.setRoot();
fb.AsTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 0)
check(fb, U_STRING_FROM_CONSTANT("[]"), U_HEXDUMP("00003801"));
// Write the json equivalent of: {}
fb.StartBuild();
fb.AddMapEmpty();
(void) fb.EndBuild();
fb.setRoot();
fb.AsMap(map);
U_ASSERT_EQUALS(map.GetSize(), 0)
check(fb, U_STRING_FROM_CONSTANT("{}"), U_HEXDUMP("00010100002401"));
// Write the json equivalent of: 140737488355327
size = fb.encode([&]() { fb.UInt(U_VALUE_PAYLOAD_MASK); });
fb.setRoot();
i = fb.AsUInt64();
U_INTERNAL_ASSERT_EQUALS(i, U_VALUE_PAYLOAD_MASK)
check(fb, U_STRING_FROM_CONSTANT("140737488355327"), U_HEXDUMP("ffffffffff7f00000b08"));
// Write the json equivalent of: "Fred"
size = fb.encode([&]() { fb.String(U_CONSTANT_TO_PARAM("Fred")); });
fb.setRoot();
UString x = fb.AsString();
U_ASSERT_EQUALS(x, "Fred")
check(fb, U_STRING_FROM_CONSTANT("\"Fred\""), U_STRING_FROM_CONSTANT("\004Fred\004\024\001"));
// Write the json equivalent of: [ 1, 2 ]
size = fb.encodeVector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.setRoot();
fb.AsFixedTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 2)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec.AsTypedOrFixedVectorIsEqual(vec1, 2))
check(fb, U_STRING_FROM_CONSTANT("[1,2]"), U_STRING_FROM_CONSTANT("\001\002\002D\001"));
// Write the json equivalent of: [ true, false, true ]
size = fb.encodeVector([&]() {
fb.Bool(true);
fb.Bool(false);
fb.Bool(true);
}, true);
fb.setRoot();
fb.AsTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<bool>(0), true)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<bool>(1), false)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<bool>(2), true)
U_ASSERT(vec.AsTypedOrFixedVectorIsEqual(vec2, 3))
check(fb, U_STRING_FROM_CONSTANT("[true,false,true]"), U_STRING_FROM_CONSTANT("\003\001\000\001\0038\001"));
// Write the json equivalent of: [ 1, 2, 3 ]
size = fb.encodeVector([&]() {
fb.UInt(1);
fb.UInt(2);
fb.UInt(3);
}, true, true);
fb.setRoot();
fb.AsFixedTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<uint64_t>(2), 3)
U_ASSERT(vec.AsTypedOrFixedVectorIsEqual(vec1, 3))
check(fb, U_STRING_FROM_CONSTANT("[1,2,3]"), U_STRING_FROM_CONSTANT("\001\002\003\003P\001"));
// Write the json equivalent of: [ 1.0, 0.2, 0.5, 5.6 ]
size = fb.encodeVector([&]() {
fb.Double(1.0);
fb.Double(0.2);
fb.Double(0.5);
fb.Double(5.6);
}, true, true);
fb.setRoot();
fb.AsFixedTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 4)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<double>(0), 1.0)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<double>(1), 0.2)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<double>(2), 0.5)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<double>(3), 5.6)
U_ASSERT(vec.AsTypedOrFixedVectorIsEqual<double>(vec3, 4))
check(fb, U_STRING_FROM_CONSTANT("[1.0,0.2,0.5,5.6]"), U_HEXDUMP("000000000000f03f9a9999999999c93f000000000000e03f6666666666661640206301"));
// Write the json equivalent of: [ "uno", "due", "tre" ]
size = fb.encodeVector([&]() {
fb.String(U_CONSTANT_TO_PARAM("uno"));
fb.String(U_CONSTANT_TO_PARAM("due"));
fb.String(U_CONSTANT_TO_PARAM("tre"));
}, true);
fb.setRoot();
fb.AsTypedVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "uno")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(1), "due")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(2), "tre")
check(fb, U_STRING_FROM_CONSTANT("[\"uno\",\"due\",\"tre\"]"), U_STRING_FROM_CONSTANT("\003uno\003due\003tre\003\f\t\006\003<\001"));
size = fb.encodeVector([&]() {
fb.String(U_CONSTANT_TO_PARAM("9cvxHmjzuQzzCaw2LMTvjmyMeRXM8mzXY"));
fb.String(U_CONSTANT_TO_PARAM("vLivrQb9dqcRyiRa1LENgBnsSpEbFsOcN"));
fb.String(U_CONSTANT_TO_PARAM("uELEMyIieNW86ruETPaISDBlnn5UOFTZr"));
fb.String(U_CONSTANT_TO_PARAM("pSqtl0fITijC8BbGKvJTaSrqhgNBRDeJX"));
fb.String(U_CONSTANT_TO_PARAM("sreDFtqY9a3aRU0y4PrnX4VLTJvNJUjh6"));
fb.String(U_CONSTANT_TO_PARAM("1MKsg9wknND12SHLuM3NbXcO2hSxRhck8"));
fb.String(U_CONSTANT_TO_PARAM("akItwhgG2JVXhUldOuSgBzrhQydIcBRRq"));
fb.String(U_CONSTANT_TO_PARAM("RYF17ULTOh0l4NLazP9UGYewqLIWJcMk3"));
}, true);
fb.setRoot();
fb.AsTypedVector(vec);
// (void) UFile::writeToTmp(U_STRING_TO_PARAM(fb.getResult()), O_RDWR | O_TRUNC, U_CONSTANT_TO_PARAM("test_serialize.%P"), 0);
U_ASSERT_EQUALS(vec.GetSize(), 8)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "9cvxHmjzuQzzCaw2LMTvjmyMeRXM8mzXY")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(1), "vLivrQb9dqcRyiRa1LENgBnsSpEbFsOcN")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(2), "uELEMyIieNW86ruETPaISDBlnn5UOFTZr")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(3), "pSqtl0fITijC8BbGKvJTaSrqhgNBRDeJX")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(4), "sreDFtqY9a3aRU0y4PrnX4VLTJvNJUjh6")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(5), "1MKsg9wknND12SHLuM3NbXcO2hSxRhck8")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(7), "RYF17ULTOh0l4NLazP9UGYewqLIWJcMk3")
// Write the json equivalent of: [ 100, true, 4.0, "Fred" ]
size = fb.encodeVector([&]() {
fb.UInt(100);
fb.Bool(true);
fb.Double(4.0);
fb.String(U_CONSTANT_TO_PARAM("Fred"));
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 4)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(0), 100)
U_ASSERT_EQUALS(vec.AsVectorGet<bool>(1), true)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(2), 4.0)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(3), "Fred")
check(fb, U_STRING_FROM_CONSTANT("[100,true,4.0,\"Fred\"]"), U_HEXDUMP("044672656404000000640000000100000000008040140000000a120e14142a01"));
// Write the json equivalent of: [ [ 1, 2 ], [ 1, 2 ], [ 1, 2 ] ]
size = fb.encodeVector([&]() {
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
vec.AsVectorGetFixedTypedVector(0, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
vec.AsVectorGetFixedTypedVector(1, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
vec.AsVectorGetFixedTypedVector(2, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
check(fb, U_STRING_FROM_CONSTANT("[[1,2],[1,2],[1,2]]"), U_HEXDUMP("01020102010203070605444444062801"));
// Write the json equivalent of: [ 1.0, [ ], [ 1, 2 ], [ ], [ 1, 2 ], [ ] ]
size = fb.encodeVector([&]() {
fb.Double(1.0);
fb.AddVectorEmpty();
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.AddVectorEmpty();
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.AddVectorEmpty();
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 6)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(0), 1.0)
vec.AsVectorGetFixedTypedVector(2, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
vec.AsVectorGetFixedTypedVector(4, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
check(fb, U_STRING_FROM_CONSTANT("[1.0,[],[1,2],[],[1,2],[]]"), U_HEXDUMP("00010200010200060000000000803f0e000000120000001300000017000000180000000e38443844381e2a01"));
// Write the json equivalent of: [ 1.0, [], [], [ "uno", "due", "tre" ] ]
size = fb.encodeVector([&]() {
fb.Double(1.0);
fb.AddVectorEmpty();
fb.AddVectorEmpty();
fb.Vector([&]() {
fb.String(U_CONSTANT_TO_PARAM("uno"));
fb.String(U_CONSTANT_TO_PARAM("due"));
fb.String(U_CONSTANT_TO_PARAM("tre"));
}, true);
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 4)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(0), 1.0)
vec.AsVectorGetTypedVector(1, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 0)
vec.AsVectorGetTypedVector(2, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 0)
vec.AsVectorGetTypedVector(3, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(0), "uno")
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(1), "due")
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(2), "tre")
check(fb, U_STRING_FROM_CONSTANT("[1.0,[],[],[\"uno\",\"due\",\"tre\"]]"), U_HEXDUMP("000003756e6f0364756503747265030c0906040000000000803f190000001c000000130000000e38383c142a01"));
// Write the json equivalent of: [ 1.0, {}, [ 1, 2 ], {}, [ 1, 2 ], {} ]
size = fb.encodeVector([&]() {
fb.Double(1.0);
fb.AddMapEmpty();
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.AddMapEmpty();
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(2);
}, true, true);
fb.AddMapEmpty();
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 6)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(0), 1.0)
vec.AsVectorGetFixedTypedVector(2, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
vec.AsVectorGetFixedTypedVector(4, vec0);
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
U_ASSERT(vec0.AsTypedOrFixedVectorIsEqual(vec1, 2))
check(fb, U_STRING_FROM_CONSTANT("[1.0,{},[1,2],{},[1,2],{}]"), U_HEXDUMP("00010100010200010100010200010100060000000000803f1400000018000000160000001a000000180000000e24442444241e2a01"));
// Write the json equivalent of: { foo: 13, bar: 14 }
size = fb.encodeMap([&]() {
fb.UInt(U_CONSTANT_TO_PARAM("foo"), 13);
fb.UInt(U_CONSTANT_TO_PARAM("bar"), 14);
});
fb.setRoot();
fb.AsMap(map);
U_ASSERT_EQUALS(map.GetSize(), 2)
map.AsMapGetKeys(vec);
U_ASSERT_EQUALS(vec.GetSize(), 2)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "foo")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(1), "bar")
UVector<UString> v;
U_ASSERT_EQUALS(map.AsMapGetKeys(v), 2)
U_ASSERT_EQUALS(v[0], "foo")
U_ASSERT_EQUALS(v[1], "bar")
map.AsMapGetValues(vec);
U_ASSERT_EQUALS(vec.GetSize(), 2)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(0), 13)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(1), 14)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(0), 13)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(1), 14)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(U_CONSTANT_TO_PARAM("foo")), 13)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(U_CONSTANT_TO_PARAM("bar")), 14)
check(fb, U_STRING_FROM_CONSTANT("{\"foo\":13,\"bar\":14}"), U_HEXDUMP("03666f6f036261720208050201020d0e0808042401"));
// Write the json equivalent of: { vec: [ -100, "Fred", 4.0 ], foo: 100 }
size = fb.encodeMap([&]() {
fb.Key(U_CONSTANT_TO_PARAM("vec"));
fb.Vector([&]() {
fb.Int(-100);
fb.String(U_CONSTANT_TO_PARAM("Fred"));
fb.Double(4.0);
});
fb.UInt(U_CONSTANT_TO_PARAM("foo"), 100);
});
fb.setRoot();
fb.AsMap(map);
U_ASSERT_EQUALS(map.GetSize(), 2)
map.AsMapGetKeys(vec);
U_ASSERT_EQUALS(vec.GetSize(), 2)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "vec")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(1), "foo")
map.AsMapGetValues(vec);
U_ASSERT_EQUALS(vec.GetSize(), 2)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(1), 100)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(1), 100)
U_ASSERT_EQUALS(map.AsMapGet<uint64_t>(U_CONSTANT_TO_PARAM("foo")), 100)
map.AsMapGetVector(0, vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<int8_t>(0), -100)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(1), "Fred")
U_ASSERT_EQUALS(vec.AsVectorGet<double>(2), 4.0)
map.AsMapGetVector(U_CONSTANT_TO_PARAM("vec"), vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<int8_t>(0), -100)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(1), "Fred")
U_ASSERT_EQUALS(vec.AsVectorGet<double>(2), 4.0)
check(fb, U_STRING_FROM_CONSTANT("{\"vec\":[-100,\"Fred\",4.0],\"foo\":100}"), U_HEXDUMP("03766563044672656403000000640000000c0000000000804006140e03666f6f02200502010219642a08042401"));
size = fb.encodeVector([&]() {
fb.String(U_CONSTANT_TO_PARAM("hello"));
fb.Map([&]() {
fb.UInt(U_CONSTANT_TO_PARAM("a"), 12);
fb.UInt(U_CONSTANT_TO_PARAM("b"), 4);
});
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(3);
});
fb.Map([&]() {
fb.UInt(U_CONSTANT_TO_PARAM("a"), 12);
fb.UInt(U_CONSTANT_TO_PARAM("b"), 4);
});
});
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 4)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(0), "hello")
vec.AsVectorGetVector(2, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(1), 3)
vec.AsVectorGetMap(1, map0);
U_ASSERT_EQUALS(map0.GetSize(), 2)
map0.AsMapGetKeys(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(0), "a")
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(1), "b")
map0.AsMapGetValues(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(0), 12)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(1), 4)
vec.AsVectorGetMap(3, map0);
U_ASSERT_EQUALS(map0.GetSize(), 2)
map0.AsMapGetKeys(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(0), "a")
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(1), "b")
map0.AsMapGetValues(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(0), 12)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(1), 4)
size = fb.encodeVector([&]() {
fb.UInt(1);
fb.Int(INT_MIN);
fb.UInt(2);
fb.UInt(UINT_MAX);
fb.Add(3.0);
fb.Add(true);
fb.String(U_CONSTANT_TO_PARAM("Hello"));
fb.String(U_CONSTANT_TO_PARAM("Hello!"));
fb.Add();
fb.String(U_CONSTANT_TO_PARAM("a"));
fb.String(U_CONSTANT_TO_PARAM("b"));
fb.String(U_CONSTANT_TO_PARAM("a!"));
fb.String(U_CONSTANT_TO_PARAM("b!"));
fb.FixedTypedVector(vec1, 3);
fb.FixedTypedVector(vec1, 3);
fb.TypedVector(vec2, 2);
fb.TypedVector(vec3, 3);
vec3[1] = 2.3;
vec3[2] = 4.5;
fb.TypedVector(vec3, 2);
fb.TypedVector(vec3, 3);
fb.TypedVector(vec3, 4);
fb.FixedTypedVector(vec1, 2);
vec1[2] = 4;
fb.FixedTypedVector(vec1, 3);
fb.FixedTypedVector(vec1, 4);
fb.FixedTypedVector(vec1, 2);
fb.FixedTypedVector(vec1, 3);
fb.FixedTypedVector(vec1, 4);
fb.String(U_CONSTANT_TO_PARAM("hello"));
fb.Map([&]() {
fb.UInt(U_CONSTANT_TO_PARAM("a"), 12);
fb.UInt(U_CONSTANT_TO_PARAM("b"), 4);
});
fb.Vector([&]() {
fb.UInt(1);
fb.UInt(3);
});
vec1[0] = INT_MIN;
vec1[1] = INT_MAX;
fb.FixedTypedVector(vec1, 2);
vec1[0] = 0ULL;
vec1[1] = UINT_MAX;
fb.FixedTypedVector(vec1, 2);
fb.IndirectUInt(23);
fb.IndirectUInt(UINT_MAX);
fb.IndirectUInt(INT_MAX);
fb.IndirectUInt(UINT_MAX);
fb.IndirectFloat(3.5);
});
U_INTERNAL_ASSERT_EQUALS(size, 607)
fb.setRoot();
fb.AsVector(vec);
U_ASSERT_EQUALS(vec.GetSize(), 36)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<int64_t>(1), INT_MIN)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(2), 2)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(3), UINT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(4), 3.0)
U_ASSERT_EQUALS(vec.AsVectorGet<bool>(5), true)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(6), "Hello")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(7), "Hello!")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(9), "a")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(10), "b")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(11), "a!")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(12), "b!")
vec.AsVectorGetFixedTypedVector(13, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 3)
vec.AsVectorGetFixedTypedVector(14, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 3)
vec.AsVectorGetTypedVector(15, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<bool>(1), false)
vec.AsVectorGetTypedVector(16, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<double>(2), 0.5)
vec.AsVectorGetTypedVector(17, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<double>(1), 2.3)
vec.AsVectorGetTypedVector(18, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<double>(2), 4.5)
vec.AsVectorGetTypedVector(19, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 4)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<double>(3), 5.6)
vec.AsVectorGetFixedTypedVector(20, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
vec.AsVectorGetFixedTypedVector(21, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 4)
vec.AsVectorGetFixedTypedVector(22, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 4)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 4)
vec.AsVectorGetFixedTypedVector(23, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), 2)
vec.AsVectorGetFixedTypedVector(24, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 3)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 4)
vec.AsVectorGetFixedTypedVector(25, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 4)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(2), 4)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(26), "hello")
vec.AsVectorGetMap(27, map0);
U_ASSERT_EQUALS(map0.GetSize(), 2)
map0.AsMapGetKeys(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(0), "a")
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<UString>(1), "b")
map0.AsMapGetValues(vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(0), 12)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(1), 4)
vec.AsVectorGetVector(28, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec0.AsVectorGet<uint64_t>(1), 3)
vec.AsVectorGetFixedTypedVector(29, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(1), INT_MAX)
vec.AsVectorGetFixedTypedVector(30, vec0);
U_ASSERT_EQUALS(vec0.GetSize(), 2)
U_ASSERT_EQUALS(vec0.AsTypedOrFixedVectorGet<uint64_t>(0), 0)
U_ASSERT_EQUALS(vec.AsVectorGetIndirect<uint64_t>(31), 23)
U_ASSERT_EQUALS(vec.AsVectorGetIndirect<uint64_t>(32), UINT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGetIndirect<uint64_t>(33), INT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGetIndirect<uint64_t>(34), UINT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGetIndirect<double>(35), 3.5)
size = fb.encodeMap([&]() {
fb.UInt(U_CONSTANT_TO_PARAM("a"), 1);
fb.UInt(U_CONSTANT_TO_PARAM("b"), 2);
fb.UInt(U_CONSTANT_TO_PARAM("c"), (uint64_t)UINT_MAX);
fb.Int(U_CONSTANT_TO_PARAM("d"), (uint64_t)INT_MIN);
fb.UInt(U_CONSTANT_TO_PARAM("e"), 1);
fb.UInt(U_CONSTANT_TO_PARAM("f"), 2);
fb.UInt(U_CONSTANT_TO_PARAM("g"), (uint64_t)UINT_MAX);
fb.UInt(U_CONSTANT_TO_PARAM("h"), 0);
fb.Add(U_CONSTANT_TO_PARAM("i"), 1.1);
fb.Add(U_CONSTANT_TO_PARAM("j"), 2.2);
fb.Add(U_CONSTANT_TO_PARAM("k"), U_CONSTANT_TO_PARAM("Hello"));
fb.Add(U_CONSTANT_TO_PARAM("l"), U_CONSTANT_TO_PARAM("Hello2"));
fb.Add(U_CONSTANT_TO_PARAM("m"), U_CONSTANT_TO_PARAM("Hello3"));
fb.Add(U_CONSTANT_TO_PARAM("n"), U_CONSTANT_TO_PARAM("Hello4"));
fb.Add(U_CONSTANT_TO_PARAM("o"), true);
fb.Add(U_CONSTANT_TO_PARAM("p"), false);
fb.Add(U_CONSTANT_TO_PARAM("q"), U_CONSTANT_TO_PARAM("Bla"));
fb.Add(U_CONSTANT_TO_PARAM("r"), U_CONSTANT_TO_PARAM("BlaBla"));
fb.IndirectInt(U_CONSTANT_TO_PARAM("u"), (uint64_t)INT_MAX);
fb.IndirectInt(U_CONSTANT_TO_PARAM("v"), (uint64_t)INT_MIN);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("w"), 1);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("x"), 2);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("y"), (uint64_t)UINT_MAX);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("z"), 0);
fb.IndirectFloat(U_CONSTANT_TO_PARAM("aa"), 1.1f);
fb.IndirectFloat(U_CONSTANT_TO_PARAM("ab"), 2.2f);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("ac"), 1);
fb.IndirectUInt(U_CONSTANT_TO_PARAM("ad"), 2);
fb.FixedTypedVector(U_CONSTANT_TO_PARAM("ae"), vec1, 3);
fb.TypedVector(U_CONSTANT_TO_PARAM("af"), vec2, 2);
fb.FixedTypedVector(U_CONSTANT_TO_PARAM("ag"), vec3, 3);
fb.Add(U_CONSTANT_TO_PARAM("bk"), U_CONSTANT_TO_PARAM("ef"));
fb.Vector(U_CONSTANT_TO_PARAM("bm"), [&]() {
fb.UInt(1);
fb.UInt(3);
fb.UInt(4);
});
fb.Vector(U_CONSTANT_TO_PARAM("bn"), [&]() {
fb.UInt(1);
fb.UInt(3);
fb.UInt(5);
});
fb.Key(U_CONSTANT_TO_PARAM("map1"));
fb.Map(U_CONSTANT_TO_PARAM("bo"), [&]() {
fb.UInt(12);
});
fb.Key(U_CONSTANT_TO_PARAM("map2"));
fb.Map(U_CONSTANT_TO_PARAM("bp"), [&]() {
fb.Add(true);
});
});
U_INTERNAL_ASSERT_EQUALS(size, 632)
fb.setRoot();
fb.AsMap(map);
U_ASSERT_EQUALS(map.GetSize(), 36)
map.AsMapGetKeys(vec);
U_ASSERT_EQUALS(vec.GetSize(), 36)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "a")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(1), "b")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(32), "bm")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(33), "bn")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(34), "map1")
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(35), "map2")
map.AsMapGetValues(vec);
U_ASSERT_EQUALS(vec.GetSize(), 36)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(0), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(1), 2)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(2), UINT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGet<int64_t>(3), INT_MIN)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(4), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(5), 2)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(6), UINT_MAX)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(7), 0)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(8), 1.1)
U_ASSERT_EQUALS(vec.AsVectorGet<double>(9), 2.2)
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(10), "Hello")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(11), "Hello2")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(12), "Hello3")
U_ASSERT_EQUALS(vec.AsVectorGet<UString>(13), "Hello4")
map.AsMapGetVector(U_CONSTANT_TO_PARAM("bm"), vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(0), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(1), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(2), 4)
map.AsMapGetVector(U_CONSTANT_TO_PARAM("bn"), vec);
U_ASSERT_EQUALS(vec.GetSize(), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(0), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(1), 3)
U_ASSERT_EQUALS(vec.AsVectorGet<uint8_t>(2), 5)
map.AsMapGetMap(U_CONSTANT_TO_PARAM("map1"), map0);
U_ASSERT_EQUALS(map0.GetSize(), 1)
map0.AsMapGetKeys(vec);
U_ASSERT_EQUALS(vec.GetSize(), 1)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "bo")
map0.AsMapGetValues(vec);
U_ASSERT_EQUALS(vec.GetSize(), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<uint64_t>(0), 12)
map.AsMapGetMap(U_CONSTANT_TO_PARAM("map2"), map0);
U_ASSERT_EQUALS(map0.GetSize(), 1)
map0.AsMapGetKeys(vec);
U_ASSERT_EQUALS(vec.GetSize(), 1)
U_ASSERT_EQUALS(vec.AsTypedOrFixedVectorGet<UString>(0), "bp")
map0.AsMapGetValues(vec);
U_ASSERT_EQUALS(vec.GetSize(), 1)
U_ASSERT_EQUALS(vec.AsVectorGet<bool>(0), true)
Multiple().testFlatBuffer();
}

View File

@ -1515,6 +1515,7 @@ U_EXPORT main(int argc, char* argv[])
U_ASSERT( U_STRING_FROM_CONSTANT("-0.0").strtod() == -0.0 )
U_ASSERT( U_STRING_FROM_CONSTANT("1.89").strtod() == 1.89 )
U_ASSERT( U_STRING_FROM_CONSTANT("1e30").strtod() == 1e30 )
U_ASSERT( U_STRING_FROM_CONSTANT("1000").strtod() == 1000.0 )
U_ASSERT( U_STRING_FROM_CONSTANT("1.2345").strtod() == 1.2345 )
U_ASSERT( U_STRING_FROM_CONSTANT("5e-324").strtod() == 5e-324 ) // Min subnormal positive double
U_ASSERT( U_STRING_FROM_CONSTANT("-1E-10").strtod() == -1e-10 )
@ -1967,11 +1968,11 @@ U_EXPORT main(int argc, char* argv[])
z = UStringExt::substitute(y, U_CONSTANT_TO_PARAM("uno"), U_CONSTANT_TO_PARAM("primo"));
U_ASSERT( z == " primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n")
U_ASSERT(z == " primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n"
" primo due tre quattro cinque \n")
z = U_STRING_FROM_CONSTANT("uno primo due secondo tre terzo quattro quarto cinque quinto");
@ -1983,11 +1984,31 @@ U_EXPORT main(int argc, char* argv[])
vec.clear();
U_ASSERT( y == " primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n")
U_ASSERT(y == " primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n"
" primo secondo terzo quarto quinto \n")
z = U_STRING_FROM_CONSTANT("5 Bob Apples");
(void) vec.split(z);
y = UStringExt::substituteIds(U_CONSTANT_TO_PARAM("$1 purchased $0 $2. Thanks $1!"), vec);
vec.clear();
U_ASSERT_EQUALS(y, "Bob purchased 5 Apples. Thanks Bob!")
z = U_STRING_FROM_CONSTANT("0 1 2 3 4 5 6 7 8 9 5 Bob Apples");
(void) vec.split(z);
y = UStringExt::substituteIds(U_CONSTANT_TO_PARAM("$11 purchased $10 $12. Thanks $11!"), vec);
vec.clear();
U_ASSERT_EQUALS(y, "Bob purchased 5 Apples. Thanks Bob!")
y = U_STRING_FROM_CONSTANT("Hello\n\n");