mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
FlatBuffer implementation
This commit is contained in:
parent
350944c675
commit
2eb6736227
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
6
configure
vendored
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
396
doc/style.css
Normal 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;
|
||||
}
|
||||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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*> {
|
||||
|
|
|
|||
|
|
@ -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
3112
include/ulib/serialize/flatbuffers.h
Normal file
3112
include/ulib/serialize/flatbuffers.h
Normal file
File diff suppressed because it is too large
Load Diff
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
17
src/ulib/net/server/plugin/usp/docalc1.usp
Normal file
17
src/ulib/net/server/plugin/usp/docalc1.usp
Normal 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);
|
||||
-->
|
||||
364
src/ulib/serialize/flatbuffers.cpp
Normal file
364
src/ulib/serialize/flatbuffers.cpp
Normal 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
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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 .
|
||||
|
|
|
|||
|
|
@ -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/* \
|
||||
|
|
|
|||
|
|
@ -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
1548
tests/ulib/json_obj.h
Normal file
File diff suppressed because it is too large
Load Diff
0
tests/ulib/ok/serialize.ok
Normal file
0
tests/ulib/ok/serialize.ok
Normal file
19
tests/ulib/serialize.test
Executable file
19
tests/ulib/serialize.test
Executable 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
848
tests/ulib/test_serialize.cpp
Normal file
848
tests/ulib/test_serialize.cpp
Normal 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();
|
||||
}
|
||||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user