mirror of https://github.com/vitalif/openscad
Merge pull request #561 from brodykenrick/master
Unicode support for search, length and STRING[] accesses (+ a fix for 3rd Party CGAL lib issue on Ubunti)vector-concat
commit
6987ac9279
|
@ -1,5 +1,6 @@
|
|||
/*.scad
|
||||
*.dmg
|
||||
*~
|
||||
*.tar*
|
||||
Makefile
|
||||
objects
|
||||
|
|
|
@ -95,6 +95,7 @@ Follow the instructions for the platform you're compiling on below.
|
|||
* [OpenCSG (1.3.2)](http://www.opencsg.org/)
|
||||
* [GLEW (1.5.4 ->)](http://glew.sourceforge.net/)
|
||||
* [Eigen (3.0 - 3.2)](http://eigen.tuxfamily.org/)
|
||||
* [glib2 (2.2.0)](https://developer.gnome.org/glib/)
|
||||
* [GCC C++ Compiler (4.2 ->)](http://gcc.gnu.org/)
|
||||
* [Bison (2.4)](http://www.gnu.org/software/bison/)
|
||||
* [Flex (2.5.35)](http://flex.sourceforge.net/)
|
||||
|
|
|
@ -11,3 +11,4 @@ include(opencsg.pri)
|
|||
include(glew.pri)
|
||||
include(eigen.pri)
|
||||
include(boost.pri)
|
||||
include(glib-2.0.pri)
|
|
@ -0,0 +1,38 @@
|
|||
# Detect glib-2.0, then use this priority list to determine
|
||||
# which library to use:
|
||||
#
|
||||
# Priority
|
||||
# 1. GLIB2_INCLUDEPATH / GLIB2_LIBPATH (qmake parameter, not checked it given on commandline)
|
||||
# 2. OPENSCAD_LIBRARIES (environment variable)
|
||||
# 3. system's standard include paths from pkg-config
|
||||
|
||||
glib-2.0 {
|
||||
|
||||
# read environment variables
|
||||
OPENSCAD_LIBRARIES_DIR = $$(OPENSCAD_LIBRARIES)
|
||||
GLIB2_DIR = $$(GLIB2DIR)
|
||||
|
||||
!isEmpty(OPENSCAD_LIBRARIES_DIR) {
|
||||
isEmpty(GLIB2_INCLUDEPATH) {
|
||||
GLIB2_INCLUDEPATH_1 = $$OPENSCAD_LIBRARIES_DIR/include/glib-2.0
|
||||
GLIB2_INCLUDEPATH_2 = $$OPENSCAD_LIBRARIES_DIR/lib/glib-2.0/include
|
||||
GLIB2_LIBPATH = $$OPENSCAD_LIBRARIES_DIR/lib
|
||||
}
|
||||
}
|
||||
|
||||
isEmpty(GLIB2_INCLUDEPATH) {
|
||||
GLIB2_CFLAGS = $$system("pkg-config --cflags glib-2.0")
|
||||
} else {
|
||||
GLIB2_CFLAGS = -I$$GLIB2_INCLUDEPATH_1
|
||||
GLIB2_CFLAGS += -I$$GLIB2_INCLUDEPATH_2
|
||||
}
|
||||
|
||||
isEmpty(GLIB2_LIBPATH) {
|
||||
GLIB2_LIBS = $$system("pkg-config --libs glib-2.0")
|
||||
} else {
|
||||
GLIB2_LIBS = -L$$GLIB2_LIBPATH -lglib-2.0
|
||||
}
|
||||
|
||||
QMAKE_CXXFLAGS += $$GLIB2_CFLAGS
|
||||
LIBS += $$GLIB2_LIBS
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
# OPENCSGDIR
|
||||
# OPENSCAD_LIBRARIES
|
||||
#
|
||||
# Please see the 'Buildling' sections of the OpenSCAD user manual
|
||||
# Please see the 'Building' sections of the OpenSCAD user manual
|
||||
# for updated tips & workarounds.
|
||||
#
|
||||
# http://en.wikibooks.org/wiki/OpenSCAD_User_Manual
|
||||
|
@ -156,6 +156,7 @@ CONFIG += cgal
|
|||
CONFIG += opencsg
|
||||
CONFIG += boost
|
||||
CONFIG += eigen
|
||||
CONFIG += glib-2.0
|
||||
|
||||
#Uncomment the following line to enable QCodeEdit
|
||||
#CONFIG += qcodeedit
|
||||
|
|
|
@ -66,6 +66,21 @@ cgal_sysver()
|
|||
cgal_sysver_result=`grep "define *CGAL_VERSION *[0-9.]*" $cgalpath | awk '{print $3}'`
|
||||
}
|
||||
|
||||
glib2_sysver()
|
||||
{
|
||||
#Get architecture triplet - e.g. x86_64-linux-gnu
|
||||
glib2archtriplet=`gcc -dumpmachine 2>/dev/null`
|
||||
if [ -z "$VAR" ]; then
|
||||
glib2archtriplet=`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`
|
||||
fi
|
||||
glib2path=$1/lib/$glib2archtriplet/glib-2.0/include/glibconfig.h
|
||||
if [ ! -e $glib2path ]; then return; fi
|
||||
glib2major=`grep "define *GLIB_MAJOR_VERSION *[0-9.]*" $glib2path | awk '{print $3}'`
|
||||
glib2minor=`grep "define *GLIB_MINOR_VERSION *[0-9.]*" $glib2path | awk '{print $3}'`
|
||||
glib2micro=`grep "define *GLIB_MICRO_VERSION *[0-9.]*" $glib2path | awk '{print $3}'`
|
||||
glib2_sysver_result="${glib2major}.${glib2minor}.${glib2micro}"
|
||||
}
|
||||
|
||||
boost_sysver()
|
||||
{
|
||||
boostpath=$1/include/boost/version.hpp
|
||||
|
@ -530,7 +545,7 @@ checkargs()
|
|||
|
||||
main()
|
||||
{
|
||||
deps="qt4 cgal gmp mpfr boost opencsg glew eigen gcc bison flex make"
|
||||
deps="qt4 cgal gmp mpfr boost opencsg glew eigen glib2 gcc bison flex make"
|
||||
#deps="$deps curl git" # not technically necessary for build
|
||||
#deps="$deps python cmake imagemagick" # only needed for tests
|
||||
#deps="cgal"
|
||||
|
|
|
@ -294,6 +294,43 @@ build_glew()
|
|||
make GLEW_DEST=$DEPLOYDIR CC=$CC CFLAGS.EXTRA="-no-cpp-precomp -dynamic -fno-common -mmacosx-version-min=$MAC_OSX_VERSION_MIN $GLEW_EXTRA_FLAGS -arch x86_64" LDFLAGS.EXTRA="-mmacosx-version-min=$MAC_OSX_VERSION_MIN $GLEW_EXTRA_FLAGS -arch x86_64" STRIP= install
|
||||
}
|
||||
|
||||
build_gettext()
|
||||
{
|
||||
version=$1
|
||||
echo "Building gettext $version..."
|
||||
|
||||
cd "$BASEDIR"/src
|
||||
rm -rf "gettext-$version"
|
||||
if [ ! -f "glib-$version.tar.xz" ]; then
|
||||
curl --insecure -LO "http://ftpmirror.gnu.org/gettext/gettext-$version.tar.gz"
|
||||
fi
|
||||
tar xzf "gettext-$version.tar.gz"
|
||||
cd "gettext-$version"
|
||||
|
||||
./configure --prefix="$DEPLOYDIR"
|
||||
make -j4
|
||||
make install
|
||||
}
|
||||
|
||||
build_glib2()
|
||||
{
|
||||
version=$1
|
||||
echo "Building glib2 $version..."
|
||||
|
||||
cd "$BASEDIR"/src
|
||||
rm -rf "glib-$version"
|
||||
maj_min_version="${version%.*}" #Drop micro
|
||||
if [ ! -f "glib-$version.tar.xz" ]; then
|
||||
curl --insecure -LO "http://ftp.gnome.org/pub/gnome/sources/glib/$maj_min_version/glib-$version.tar.xz"
|
||||
fi
|
||||
tar xJf "glib-$version.tar.xz"
|
||||
cd "glib-$version"
|
||||
|
||||
./configure --disable-gtk-doc --disable-man --prefix="$DEPLOYDIR" CFLAGS="-I$DEPLOYDIR/include" LDFLAGS="-L$DEPLOYDIR/lib"
|
||||
make -j4
|
||||
make install
|
||||
}
|
||||
|
||||
build_opencsg()
|
||||
{
|
||||
version=$1
|
||||
|
@ -458,6 +495,12 @@ build_boost 1.54.0
|
|||
# NB! For CGAL, also update the actual download URL in the function
|
||||
build_cgal 4.3
|
||||
build_glew 1.10.0
|
||||
<<<<<<< HEAD
|
||||
build_gettext 0.18.3.1
|
||||
build_glib2 2.38.2
|
||||
=======
|
||||
build_glib2 2.38.1
|
||||
>>>>>>> d7d5bea7363703c76b9787598304bfc838e893ee
|
||||
build_opencsg 1.3.2
|
||||
if $OPTION_DEPLOY; then
|
||||
# build_sparkle andymatuschak 0ed83cf9f2eeb425d4fdd141c01a29d843970c20
|
||||
|
|
|
@ -409,6 +409,48 @@ build_glew()
|
|||
GLEW_DEST=$DEPLOYDIR $MAKER install
|
||||
}
|
||||
|
||||
build_gettext()
|
||||
{
|
||||
version=$1
|
||||
echo "Building gettext $version..."
|
||||
|
||||
cd "$BASEDIR"/src
|
||||
rm -rf "gettext-$version"
|
||||
if [ ! -f "glib-$version.tar.xz" ]; then
|
||||
curl --insecure -LO "http://ftpmirror.gnu.org/gettext/gettext-$version.tar.gz"
|
||||
fi
|
||||
tar xzf "gettext-$version.tar.gz"
|
||||
cd "gettext-$version"
|
||||
|
||||
./configure --prefix="$DEPLOYDIR"
|
||||
make -j4
|
||||
make install
|
||||
}
|
||||
|
||||
build_glib2()
|
||||
{
|
||||
version="$1"
|
||||
maj_min_version="${version%.*}" #Drop micro
|
||||
|
||||
if [ -e $DEPLOYDIR/lib/glib-2.0 ]; then
|
||||
echo "glib2 already installed. not building"
|
||||
return
|
||||
fi
|
||||
|
||||
echo "Building glib2 $version..."
|
||||
cd "$BASEDIR"/src
|
||||
rm -rf "glib-$version"
|
||||
if [ ! -f "glib-$version.tar.xz" ]; then
|
||||
curl --insecure -LO "http://ftp.gnome.org/pub/gnome/sources/glib/$maj_min_version/glib-$version.tar.xz"
|
||||
fi
|
||||
tar xJf "glib-$version.tar.xz"
|
||||
cd "glib-$version"
|
||||
|
||||
./configure --disable-gtk-doc --disable-man --prefix="$DEPLOYDIR" CFLAGS="-I$DEPLOYDIR/include" LDFLAGS="-L$DEPLOYDIR/lib"
|
||||
make -j$NUMCPU
|
||||
make install
|
||||
}
|
||||
|
||||
build_opencsg()
|
||||
{
|
||||
if [ -e $DEPLOYDIR/lib/libopencsg.so ]; then
|
||||
|
@ -603,5 +645,7 @@ build_boost 1.53.0
|
|||
build_cgal 4.0.2
|
||||
build_glew 1.9.0
|
||||
build_opencsg 1.3.2
|
||||
build_gettext 0.18.3.1
|
||||
build_glib2 2.38.2
|
||||
|
||||
echo "OpenSCAD dependencies built and installed to " $BASEDIR
|
||||
|
|
|
@ -8,7 +8,7 @@ get_fedora_deps()
|
|||
{
|
||||
sudo yum install qt-devel bison flex eigen3-devel python-paramiko \
|
||||
boost-devel mpfr-devel gmp-devel glew-devel CGAL-devel gcc gcc-c++ pkgconfig \
|
||||
opencsg-devel git libXmu-devel curl imagemagick ImageMagick make \
|
||||
opencsg-devel git libXmu-devel curl imagemagick ImageMagick glib2-devel make \
|
||||
xorg-x11-server-Xvfb
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ get_altlinux_deps()
|
|||
{
|
||||
for i in boost-devel boost-filesystem-devel gcc4.5 gcc4.5-c++ boost-program_options-devel \
|
||||
boost-thread-devel boost-system-devel boost-regex-devel eigen3 libmpfr libgmp libgmp_cxx-devel qt4-devel libcgal-devel git-core \
|
||||
libglew-devel flex bison curl imagemagick; do sudo apt-get install $i; done
|
||||
libglew-devel flex bison curl imagemagick glib2-devel; do sudo apt-get install $i; done
|
||||
}
|
||||
|
||||
get_freebsd_deps()
|
||||
|
@ -29,20 +29,21 @@ get_freebsd_deps()
|
|||
pkg_add -r bison boost-libs cmake git bash eigen3 flex gmake gmp mpfr \
|
||||
xorg libGLU libXmu libXi xorg-vfbserver glew \
|
||||
qt4-corelib qt4-gui qt4-moc qt4-opengl qt4-qmake qt4-rcc qt4-uic \
|
||||
opencsg cgal curl imagemagick
|
||||
opencsg cgal curl imagemagick glib2-devel
|
||||
}
|
||||
|
||||
get_netbsd_deps()
|
||||
{
|
||||
sudo pkgin install bison boost cmake git bash eigen flex gmake gmp mpfr \
|
||||
qt4 glew cgal opencsg modular-xorg python27 py27-paramiko curl \
|
||||
imagemagick ImageMagick
|
||||
imagemagick ImageMagick glib2-devel
|
||||
}
|
||||
|
||||
get_opensuse_deps()
|
||||
{
|
||||
sudo zypper install libeigen3-devel mpfr-devel gmp-devel boost-devel \
|
||||
libqt4-devel glew-devel cmake git bison flex cgal-devel opencsg-devel curl
|
||||
libqt4-devel glew-devel cmake git bison flex cgal-devel opencsg-devel curl \
|
||||
glib2-devel
|
||||
}
|
||||
|
||||
get_mageia_deps()
|
||||
|
@ -50,7 +51,7 @@ get_mageia_deps()
|
|||
sudo urpmi ctags
|
||||
sudo urpmi task-c-devel task-c++-devel libqt4-devel libgmp-devel \
|
||||
libmpfr-devel libboost-devel eigen3-devel libglew-devel bison flex \
|
||||
cmake imagemagick python curl git x11-server-xvfb
|
||||
cmake imagemagick glib2-devel python curl git x11-server-xvfb
|
||||
}
|
||||
|
||||
get_debian_deps()
|
||||
|
@ -59,7 +60,7 @@ get_debian_deps()
|
|||
libxmu-dev cmake bison flex git-core libboost-all-dev \
|
||||
libXi-dev libmpfr-dev libboost-dev libglew-dev \
|
||||
libeigen3-dev libcgal-dev libopencsg-dev libgmp3-dev libgmp-dev \
|
||||
python-paramiko curl imagemagick; do
|
||||
python-paramiko curl imagemagick libglib2.0-dev; do
|
||||
sudo apt-get -y install $pkg;
|
||||
done
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ Please visit this link for a copy of the license: <a href="http://www.gnu.org/li
|
|||
<li><a href="http://www.stroustrup.com/C++.html">C++</a>, <a href="http://gcc.gnu.org/">GCC</a>, <a href="http://clang.llvm.org/">clang</a>
|
||||
<li><a href="http://www.python.org">python</a>
|
||||
<li><a href="http://nsis.sourceforge.net/Main_Page">Nullsoft installer</a>
|
||||
<li><a href="https://developer.gnome.org/glib/">GLib</a>
|
||||
</lu>
|
||||
</p>
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include "PlatformUtils.h"
|
||||
#include "boosty.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
bool PlatformUtils::createLibraryPath()
|
||||
{
|
||||
std::string path = PlatformUtils::libraryPath();
|
||||
|
@ -114,6 +116,7 @@ std::string PlatformUtils::info()
|
|||
<< "\nOpenCSG version: " << OPENCSG_VERSION_STRING
|
||||
<< "\nQt version: " << qtVersion
|
||||
<< "\nMingW build: " << mingwstatus
|
||||
<< "\nGLib version: " << GLIB_MAJOR_VERSION << "." << GLIB_MINOR_VERSION << "." << GLIB_MICRO_VERSION
|
||||
<< "\nOPENSCADPATH: " << getenv("OPENSCADPATH") << "\n"
|
||||
;
|
||||
return s.str();
|
||||
|
|
49
src/func.cc
49
src/func.cc
|
@ -45,6 +45,8 @@
|
|||
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
#include <boost/random/uniform_real.hpp>
|
||||
/*Unicode support for string lengths and array accesses*/
|
||||
#include <glib.h>
|
||||
|
||||
#ifdef __WIN32__
|
||||
#include <process.h>
|
||||
|
@ -306,7 +308,11 @@ Value builtin_length(const Context *, const EvalContext *evalctx)
|
|||
{
|
||||
if (evalctx->numArgs() == 1) {
|
||||
if (evalctx->getArgValue(0).type() == Value::VECTOR) return Value(int(evalctx->getArgValue(0).toVector().size()));
|
||||
if (evalctx->getArgValue(0).type() == Value::STRING) return Value(int(evalctx->getArgValue(0).toString().size()));
|
||||
if (evalctx->getArgValue(0).type() == Value::STRING) {
|
||||
//Unicode glyph count for the length -- rather than the string (num. of bytes) length.
|
||||
std::string text = evalctx->getArgValue(0).toString();
|
||||
return Value(int( g_utf8_strlen( text.c_str(), text.size() ) ));
|
||||
}
|
||||
}
|
||||
return Value();
|
||||
}
|
||||
|
@ -380,10 +386,17 @@ Value builtin_lookup(const Context *, const EvalContext *evalctx)
|
|||
num_returns_per_match : int;
|
||||
index_col_num : int;
|
||||
|
||||
The search string and searched strings can be unicode strings.
|
||||
Examples:
|
||||
Index values return as list:
|
||||
search("a","abcdabcd");
|
||||
- returns [0,4]
|
||||
- returns [0]
|
||||
search("Л","Л"); //A unicode string
|
||||
- returns [0]
|
||||
search("🂡aЛ","a🂡Л🂡a🂡Л🂡a",0);
|
||||
- returns [[1,3,5,7],[0,4,8],[2,6]]
|
||||
search("a","abcdabcd",0); //Search up to all matches
|
||||
- returns [[0,4]]
|
||||
search("a","abcdabcd",1);
|
||||
- returns [0]
|
||||
search("e","abcdabcd",1);
|
||||
|
@ -433,16 +446,25 @@ Value builtin_search(const Context *, const EvalContext *evalctx)
|
|||
}
|
||||
} else if (findThis.type() == Value::STRING) {
|
||||
unsigned int searchTableSize;
|
||||
if (searchTable.type() == Value::STRING) searchTableSize = searchTable.toString().size();
|
||||
else searchTableSize = searchTable.toVector().size();
|
||||
for (size_t i = 0; i < findThis.toString().size(); i++) {
|
||||
//Unicode glyph count for the length
|
||||
unsigned int findThisSize = g_utf8_strlen( findThis.toString().c_str(), findThis.toString().size() );
|
||||
if (searchTable.type() == Value::STRING) {
|
||||
searchTableSize = g_utf8_strlen( searchTable.toString().c_str(), searchTable.toString().size() );
|
||||
} else {
|
||||
searchTableSize = searchTable.toVector().size();
|
||||
}
|
||||
for (size_t i = 0; i < findThisSize; i++) {
|
||||
unsigned int matchCount = 0;
|
||||
Value::VectorType resultvec;
|
||||
for (size_t j = 0; j < searchTableSize; j++) {
|
||||
if ((searchTable.type() == Value::VECTOR &&
|
||||
findThis.toString()[i] == searchTable.toVector()[j].toVector()[index_col_num].toString()[0]) ||
|
||||
(searchTable.type() == Value::STRING &&
|
||||
findThis.toString()[i] == searchTable.toString()[j])) {
|
||||
gchar* ptr_ft = g_utf8_offset_to_pointer(findThis.toString().c_str(), i);
|
||||
gchar* ptr_st = NULL;
|
||||
if(searchTable.type() == Value::VECTOR) {
|
||||
ptr_st = g_utf8_offset_to_pointer(searchTable.toVector()[j].toVector()[index_col_num].toString().c_str(), 0);
|
||||
} else if(searchTable.type() == Value::STRING){
|
||||
ptr_st = g_utf8_offset_to_pointer(searchTable.toString().c_str(), j);
|
||||
}
|
||||
if( (ptr_ft) && (ptr_st) && (g_utf8_get_char(ptr_ft) == g_utf8_get_char(ptr_st)) ) {
|
||||
Value resultValue((double(j)));
|
||||
matchCount++;
|
||||
if (num_returns_per_match == 1) {
|
||||
|
@ -454,7 +476,14 @@ Value builtin_search(const Context *, const EvalContext *evalctx)
|
|||
if (num_returns_per_match > 1 && matchCount >= num_returns_per_match) break;
|
||||
}
|
||||
}
|
||||
if (matchCount == 0) PRINTB(" WARNING: search term not found: \"%s\"", findThis.toString()[i]);
|
||||
if (matchCount == 0) {
|
||||
gchar* ptr_ft = g_utf8_offset_to_pointer(findThis.toString().c_str(), i);
|
||||
gchar utf8_of_cp[6] = ""; //A buffer for a single unicode character to be copied into
|
||||
if(ptr_ft) {
|
||||
g_utf8_strncpy( utf8_of_cp, ptr_ft, 1 );
|
||||
}
|
||||
PRINTB(" WARNING: search term not found: \"%s\"", utf8_of_cp );
|
||||
}
|
||||
if (num_returns_per_match == 0 || num_returns_per_match > 1) {
|
||||
returnvec.push_back(Value(resultvec));
|
||||
}
|
||||
|
|
18
src/value.cc
18
src/value.cc
|
@ -36,6 +36,8 @@
|
|||
#include <boost/format.hpp>
|
||||
#include "boost-utils.h"
|
||||
#include "boosty.h"
|
||||
/*Unicode support for string lengths and array accesses*/
|
||||
#include <glib.h>
|
||||
|
||||
std::ostream &operator<<(std::ostream &stream, const Filename &filename)
|
||||
{
|
||||
|
@ -579,14 +581,28 @@ Value Value::operator-() const
|
|||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* bracket operation [] detecting multi-byte unicode.
|
||||
* If the string is multi-byte unicode then the index will offset to the character (2 or 4 byte) and not to the byte.
|
||||
* A 'normal' string with byte chars are a subset of unicode and still work.
|
||||
*/
|
||||
class bracket_visitor : public boost::static_visitor<Value>
|
||||
{
|
||||
public:
|
||||
Value operator()(const std::string &str, const double &idx) const {
|
||||
int i = int(idx);
|
||||
Value v;
|
||||
//Check that the index is positive and less than the size in bytes
|
||||
if ((i >= 0) && (i < (int)str.size())) {
|
||||
v = Value(str[int(idx)]);
|
||||
//Ensure character (not byte) index is inside the character/glyph array
|
||||
if( (unsigned) i < g_utf8_strlen( str.c_str(), str.size() ) ) {
|
||||
gchar utf8_of_cp[6] = ""; //A buffer for a single unicode character to be copied into
|
||||
gchar* ptr = g_utf8_offset_to_pointer(str.c_str(), i);
|
||||
if(ptr) {
|
||||
g_utf8_strncpy(utf8_of_cp, ptr, 1);
|
||||
}
|
||||
v = std::string(utf8_of_cp);
|
||||
}
|
||||
// std::cout << "bracket_visitor: " << v << "\n";
|
||||
}
|
||||
return v;
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
//Test search with unicode strings
|
||||
|
||||
//Helper function that pretty prints our search test
|
||||
//Expected result is checked against execution of a search() invocation and OK/FAIL is indicated
|
||||
module test_search_and_echo( exp_res, search_to_find, search_to_search, search_up_to_num_matches = undef)
|
||||
{
|
||||
if(undef != search_up_to_num_matches)
|
||||
{
|
||||
assign( test_res = search(search_to_find, search_to_search, search_up_to_num_matches) )
|
||||
echo(str("Expect ", exp_res, " for search(", search_to_find, ", ", search_to_search, ", ", search_up_to_num_matches, ")=", test_res, ". ", (exp_res == test_res)?"OK":"FAIL" ));
|
||||
}
|
||||
else
|
||||
{
|
||||
assign( test_res = search(search_to_find, search_to_search) )
|
||||
echo(str("Expect ", exp_res, " for search(", search_to_find, ", ", search_to_search, ")=", test_res, ". ", (exp_res == test_res)?"OK":"FAIL" ));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//"Normal" text for comparison
|
||||
echo ("----- Lookup of 1 byte into 1 byte");
|
||||
//Hits - up_to_count 1
|
||||
test_search_and_echo( [0], "a","aaaa" );
|
||||
test_search_and_echo( [0], "a","aaaa",1 );
|
||||
test_search_and_echo( [0,0], "aa","aaaa" );
|
||||
test_search_and_echo( [0,0], "aa","aaaa",1 );
|
||||
|
||||
|
||||
//Hits - up to count 1+ (incl 0 == all)
|
||||
test_search_and_echo( [[0,1,2,3]] , "a","aaaa",0 );
|
||||
test_search_and_echo( [[0,1]], "a","aaaa",2 );
|
||||
test_search_and_echo( [[0,1,2]], "a","aaaa",3 );
|
||||
test_search_and_echo( [[0,1,2,3]] , "a","aaaa",4 );
|
||||
test_search_and_echo( [[0,1,2,3],[0,1,2,3]] , "aa","aaaa",0 );
|
||||
//Misses
|
||||
test_search_and_echo( [], "b","aaaa" );
|
||||
test_search_and_echo( [], "b","aaaa",1 );
|
||||
test_search_and_echo( [[]], "b","aaaa",0 );
|
||||
test_search_and_echo( [[]], "b","aaaa",2 );
|
||||
|
||||
test_search_and_echo( [], "bb","aaaa" );
|
||||
test_search_and_echo( [], "bb","aaaa",1 );
|
||||
test_search_and_echo( [[],[]], "bb","aaaa",0 );
|
||||
test_search_and_echo( [[],[]], "bb","aaaa",2 );
|
||||
//Miss - empties
|
||||
test_search_and_echo( [], "","aaaa" );
|
||||
test_search_and_echo( [], "","" );
|
||||
test_search_and_echo( [], "a","" );
|
||||
|
||||
|
||||
//Unicode tests
|
||||
echo ("----- Lookup of multi-byte into 1 byte");
|
||||
test_search_and_echo( [], "Л","aaaa" );
|
||||
test_search_and_echo( [], "🂡","aaaa" );
|
||||
test_search_and_echo( [[]], "Л","aaaa",0 );
|
||||
test_search_and_echo( [[]], "🂡","aaaa",0 );
|
||||
|
||||
test_search_and_echo( [], "ЛЛ","aaaa" );
|
||||
test_search_and_echo( [], "🂡🂡","aaaa" );
|
||||
test_search_and_echo( [[],[]], "ЛЛ","aaaa",0 );
|
||||
test_search_and_echo( [[],[]], "🂡🂡","aaaa",0 );
|
||||
|
||||
echo ("----- Lookup of 1-byte into multi-byte");
|
||||
test_search_and_echo( [] , "a","ЛЛЛЛ" );
|
||||
test_search_and_echo( [] , "a","🂡🂡🂡🂡" );
|
||||
test_search_and_echo( [] , "a","ЛЛЛЛ",1 );
|
||||
|
||||
test_search_and_echo( [[]] , "a","🂡🂡🂡🂡",0 );
|
||||
test_search_and_echo( [[]] , "a","🂡🂡🂡🂡",2 );
|
||||
|
||||
echo ("----- Lookup of 1-byte into mixed multi-byte");
|
||||
test_search_and_echo( [0], "a","aЛaЛaЛaЛa" );
|
||||
test_search_and_echo( [0], "a","a🂡a🂡a🂡a🂡a" );
|
||||
test_search_and_echo( [0], "a","a🂡Л🂡a🂡Л🂡a" );
|
||||
|
||||
test_search_and_echo( [[0,2,4,6,8]], "a","aЛaЛaЛaЛa",0 );
|
||||
test_search_and_echo( [[0,2,4,6,8]], "a","a🂡a🂡a🂡a🂡a", 0 );
|
||||
test_search_and_echo( [[0,4,8]] , "a","a🂡Л🂡a🂡Л🂡a", 0 );
|
||||
|
||||
echo ("----- Lookup of 2-byte into 2-byte");
|
||||
test_search_and_echo( [0] , "Л","ЛЛЛЛ" );
|
||||
test_search_and_echo( [[0,1,2,3]] , "Л","ЛЛЛЛ",0 );
|
||||
|
||||
echo ("----- Lookup of 2-byte into 4-byte");
|
||||
test_search_and_echo( [] , "Л","🂡🂡🂡🂡" );
|
||||
|
||||
echo ("----- Lookup of 4-byte into 4-byte");
|
||||
test_search_and_echo( [0] , "🂡","🂡🂡🂡🂡" );
|
||||
test_search_and_echo( [[0,1,2,3]], "🂡","🂡🂡🂡🂡",0 );
|
||||
|
||||
echo ("----- Lookup of 4-byte into 2-byte");
|
||||
test_search_and_echo( [] , "🂡","ЛЛЛЛ" );
|
||||
|
||||
echo ("----- Lookup of 2-byte into mixed multi-byte");
|
||||
test_search_and_echo( [1] , "Л","aЛaЛaЛaЛa",1 );
|
||||
test_search_and_echo( [] , "Л","a🂡a🂡a🂡a🂡a", 1 );
|
||||
test_search_and_echo( [2] , "Л","a🂡Л🂡a🂡Л🂡a", 1 );
|
||||
|
||||
test_search_and_echo( [[1,3,5,7]] , "Л","aЛaЛaЛaЛa",0 );
|
||||
test_search_and_echo( [[]] , "Л","a🂡a🂡a🂡a🂡a", 0 );
|
||||
test_search_and_echo( [[2,6]] , "Л","a🂡Л🂡a🂡Л🂡a", 0 );
|
||||
|
||||
echo ("----- Lookup of 4-byte into mixed multi-byte");
|
||||
test_search_and_echo( [] , "🂡","aЛaЛaЛaЛa",1 );
|
||||
test_search_and_echo( [1] , "🂡","a🂡a🂡a🂡a🂡a", 1 );
|
||||
|
||||
test_search_and_echo( [[]] , "🂡","aЛaЛaЛaЛa",0 );
|
||||
test_search_and_echo( [[1,3,5,7]] , "🂡","a🂡a🂡a🂡a🂡a", 0 );
|
||||
test_search_and_echo( [[1,3,5,7]] , "🂡","a🂡Л🂡a🂡Л🂡a", 0 );
|
||||
|
||||
echo ("----- Lookup of mixed multi-byte into mixed multi-byte");
|
||||
test_search_and_echo( [[0,2,4,6,8],[1,3,5,7],[]], "aЛ🂡","aЛaЛaЛaЛa",0 );
|
||||
test_search_and_echo( [[0,2,4,6,8],[],[1,3,5,7]], "aЛ🂡","a🂡a🂡a🂡a🂡a", 0 );
|
||||
test_search_and_echo( [[0,4,8],[2,6],[1,3,5,7]] , "aЛ🂡","a🂡Л🂡a🂡Л🂡a", 0 );
|
||||
test_search_and_echo( [[1,3,5,7],[0,4,8],[2,6]] , "🂡aЛ","a🂡Л🂡a🂡Л🂡a", 0 );
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
//Test length reporting
|
||||
text_1bytes_len = "1234";
|
||||
text_2bytes_len = "ЛЛЛЛ";
|
||||
text_4bytes_len = "🂡🂱🃁🃑";
|
||||
|
||||
echo( "text_1bytes_len = ", text_1bytes_len, " len = ", len(text_1bytes_len) );
|
||||
echo( "text_2bytes_len = ", text_2bytes_len, " len = ", len(text_2bytes_len) );
|
||||
echo( "text_4bytes_len = ", text_4bytes_len, " len = ", len(text_4bytes_len) );
|
||||
|
||||
//Test how well arrays of unicode string are accessed.
|
||||
|
||||
texts_array = [
|
||||
"DEADBEEF",
|
||||
"Ленивый рыжий кот",
|
||||
"كسول الزنجبيل القط",
|
||||
"懶惰的姜貓",
|
||||
"äöü ÄÖÜ ß",
|
||||
"😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐",
|
||||
"⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏",
|
||||
"🂡🂱🃁🃑",
|
||||
];
|
||||
|
||||
text_2bytes = "Ленивый рыжий кот";
|
||||
text_4bytes = "🂡🂱🃁🃑";
|
||||
|
||||
|
||||
//Test all the normal accesses
|
||||
for (text_array_idx = [0:(len(texts_array)-1)])
|
||||
{
|
||||
echo( "[", text_array_idx, "] = ", texts_array[text_array_idx], " of len=", len(texts_array[text_array_idx]), ":" );
|
||||
for (text_idx = [0:(len(texts_array[text_array_idx])-1)])
|
||||
{
|
||||
echo( " [", text_idx, ,"]=", texts_array[text_array_idx][text_idx] );
|
||||
}
|
||||
}
|
||||
|
||||
//Test one past the last element of (x-byte unicode). This will be one past the length but inside the char length of the string
|
||||
echo( "Past end of unicode only 2-byte ", text_2bytes[len(text_2bytes)] );
|
||||
echo( "Past end of unicode only 4-byte ", text_4bytes[len(text_4bytes)] );
|
||||
|
||||
//Test past the last element of (x-byte unicode). Outside both lengths.
|
||||
echo( "Past end of both 2-byte ", text_2bytes[ len(text_2bytes) * 2 ] );
|
||||
echo( "Past end of both 4-byte ", text_4bytes[ len(text_4bytes) * 4 ] );
|
||||
|
|
@ -366,10 +366,10 @@ if (NOT $ENV{CGALDIR} STREQUAL "")
|
|||
elseif (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "")
|
||||
if (EXISTS "$ENV{OPENSCAD_LIBRARIES}/lib/CGAL")
|
||||
set(CGAL_DIR "$ENV{OPENSCAD_LIBRARIES}/lib/CGAL")
|
||||
set(CMAKE_MODULE_PATH "${CGAL_DIR}")
|
||||
set(CMAKE_MODULE_PATH "${CGAL_DIR}" ${CMAKE_MODULE_PATH})
|
||||
elseif (EXISTS "$ENV{OPENSCAD_LIBRARIES}/include/CGAL")
|
||||
set(CGAL_DIR "$ENV{OPENSCAD_LIBRARIES}")
|
||||
set(CMAKE_MODULE_PATH "${CGAL_DIR}")
|
||||
set(CMAKE_MODULE_PATH "${CGAL_DIR}" ${CMAKE_MODULE_PATH})
|
||||
endif()
|
||||
endif()
|
||||
message(STATUS "CGAL_DIR: " ${CGAL_DIR})
|
||||
|
@ -383,12 +383,40 @@ if("${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}" VERSION_LESS 3.6)
|
|||
message(FATAL_ERROR "CGAL >= 3.6 required")
|
||||
endif()
|
||||
inclusion(CGAL_DIR CGAL_INCLUDE_DIRS)
|
||||
#Remove bad BOOST libraries from CGAL 3rd party dependencies when they don't exist (such as on 64-bit Ubuntu 13.10).
|
||||
#Libs of concern are /usr/lib/libboost_thread.so;/usr/lib/libboost_system.so;
|
||||
#Confirmed bug in CGAL @ https://bugs.launchpad.net/ubuntu/+source/cgal/+bug/1242111
|
||||
string(FIND "${CGAL_3RD_PARTY_LIBRARIES}" "/usr/lib/libboost_system.so" FIND_POSITION )
|
||||
if(NOT "-1" STREQUAL ${FIND_POSITION} )
|
||||
if(NOT EXISTS "/usr/lib/libboost_system.so")
|
||||
MESSAGE( STATUS "CGAL_3RD_PARTY_LIBRARIES:Removing non-existent /usr/lib/libboost_system.so" )
|
||||
string(REPLACE "/usr/lib/libboost_system.so" "" CGAL_3RD_PARTY_LIBRARIES ${CGAL_3RD_PARTY_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
string(FIND "${CGAL_3RD_PARTY_LIBRARIES}" "/usr/lib/libboost_thread.so" FIND_POSITION )
|
||||
if(NOT "-1" STREQUAL ${FIND_POSITION} )
|
||||
if(NOT EXISTS "/usr/lib/libboost_thread.so")
|
||||
MESSAGE( STATUS "CGAL_3RD_PARTY_LIBRARIES:Removing non-existent /usr/lib/libboost_thread.so" )
|
||||
string(REPLACE "/usr/lib/libboost_thread.so" "" CGAL_3RD_PARTY_LIBRARIES ${CGAL_3RD_PARTY_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(${CMAKE_CXX_COMPILER} MATCHES ".*clang.*" AND NOT ${CGAL_CXX_FLAGS_INIT} STREQUAL "" )
|
||||
string(REPLACE "-frounding-math" "" CGAL_CXX_FLAGS_INIT ${CGAL_CXX_FLAGS_INIT})
|
||||
string(REPLACE "--param=ssp-buffer-size=4" "" CGAL_CXX_FLAGS_INIT ${CGAL_CXX_FLAGS_INIT})
|
||||
endif()
|
||||
|
||||
if (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "")
|
||||
# Force pkg-config to look _only_ in the local library folder
|
||||
# in case OPENSCAD_LIBRARIES is set.
|
||||
set(ENV{PKG_CONFIG_PATH} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig")
|
||||
set(ENV{PKG_CONFIG_LIBDIR} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig")
|
||||
endif()
|
||||
|
||||
find_package(GLIB2 2.2.0 REQUIRED)
|
||||
add_definitions(${GLIB2_DEFINITIONS})
|
||||
inclusion(GLIB2_DIR GLIB2_INCLUDE_DIRS)
|
||||
|
||||
# Imagemagick
|
||||
|
||||
if (SKIP_IMAGEMAGICK)
|
||||
|
@ -560,8 +588,8 @@ set(OFFSCREEN_SOURCES
|
|||
../src/OpenCSGRenderer.cc)
|
||||
|
||||
add_library(tests-core STATIC ${CORE_SOURCES})
|
||||
target_link_libraries(tests-core ${OPENGL_LIBRARIES})
|
||||
set(TESTS-CORE-LIBRARIES ${OPENGL_LIBRARIES} ${Boost_LIBRARIES})
|
||||
target_link_libraries(tests-core ${OPENGL_LIBRARIES} ${GLIB2_LIBRARIES} )
|
||||
set(TESTS-CORE-LIBRARIES ${OPENGL_LIBRARIES} ${GLIB2_LIBRARIES} ${Boost_LIBRARIES} )
|
||||
|
||||
add_library(tests-common STATIC ${COMMON_SOURCES})
|
||||
target_link_libraries(tests-common tests-core)
|
||||
|
@ -581,7 +609,7 @@ set(TESTS-NOCGAL-LIBRARIES ${TESTS-CORE-LIBRARIES})
|
|||
# modulecachetest
|
||||
#
|
||||
add_executable(modulecachetest modulecachetest.cc)
|
||||
target_link_libraries(modulecachetest tests-nocgal ${TESTS-NOCGAL-LIBRARIES} ${Boost_LIBRARIES})
|
||||
target_link_libraries(modulecachetest tests-nocgal ${TESTS-NOCGAL-LIBRARIES})
|
||||
|
||||
#
|
||||
# csgtexttest
|
||||
|
@ -601,7 +629,7 @@ target_link_libraries(cgalcachetest tests-cgal ${TESTS-CGAL-LIBRARIES} ${GLEW_LI
|
|||
#
|
||||
add_executable(openscad_nogui ../src/openscad.cc)
|
||||
set_target_properties(openscad_nogui PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -DEIGEN_DONT_ALIGN -DENABLE_CGAL -DENABLE_OPENCSG ${CGAL_CXX_FLAGS_INIT}")
|
||||
target_link_libraries(openscad_nogui tests-offscreen tests-cgal tests-nocgal ${TESTS-CORE-LIBRARIES} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${Boost_LIBRARIES} ${OPENCSG_LIBRARY} ${COCOA_LIBRARY} )
|
||||
target_link_libraries(openscad_nogui tests-offscreen tests-cgal tests-nocgal ${TESTS-CORE-LIBRARIES} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${OPENCSG_LIBRARY} ${COCOA_LIBRARY} )
|
||||
|
||||
#
|
||||
# GUI binary tests
|
||||
|
@ -781,8 +809,10 @@ list(APPEND ECHO_FILES ${FUNCTION_FILES}
|
|||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/dim-all.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-test.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-indexing.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-unicode.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/vector-values.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/search-tests.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/search-tests-unicode.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/recursion-tests.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/value-reassignment-tests.scad
|
||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/value-reassignment-tests2.scad
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
find_package(PkgConfig REQUIRED)
|
||||
|
||||
pkg_search_module(GLIB2 REQUIRED glib-2.0)
|
||||
#message("GLIB2_LIBRARIES ${GLIB2_LIBRARIES}")
|
||||
message("GLIB2_LIBRARY_DIRS ${GLIB2_LIBRARY_DIRS}")
|
||||
#message("GLIB2_LDFLAGS ${GLIB2_LDFLAGS}")
|
||||
#message("GLIB2_LDFLAGS_OTHER ${GLIB2_LDFLAGS_OTHER}")
|
||||
message("GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS}")
|
||||
#message("GLIB2_CFLAGS ${GLIB2_CFLAGS}")
|
||||
#message("GLIB2_CFLAGS_OTHER ${GLIB2_CFLAGS_OTHER}")
|
||||
message("GLIB2_LIBDIR ${GLIB2_LIBDIR}")
|
||||
|
||||
set(GLIB2_DEFINITIONS ${GLIB2_CFLAGS_OTHER})
|
||||
#message("GLIB2_DEFINITIONS ${GLIB2_DEFINITIONS}")
|
||||
|
||||
set(GLIB2_LIBRARY_NAMES ${GLIB2_LIBRARIES})
|
||||
set(GLIB2_LIBRARIES "")
|
||||
foreach(GLIB2_LIB ${GLIB2_LIBRARY_NAMES})
|
||||
# message("lib: ${GLIB2_LIB}")
|
||||
set(TMP TMP-NOTFOUND)
|
||||
find_library(TMP NAMES ${GLIB2_LIB}
|
||||
PATHS ${GLIB2_LIBRARY_DIRS}
|
||||
PATHS ${GLIB2_LIBDIR}
|
||||
NO_DEFAULT_PATH)
|
||||
# message("TMP: ${TMP}")
|
||||
list(APPEND GLIB2_LIBRARIES "${TMP}")
|
||||
endforeach()
|
||||
message("GLIB2_LIBRARIES: ${GLIB2_LIBRARIES}")
|
|
@ -0,0 +1,109 @@
|
|||
ECHO: "----- Lookup of 1 byte into 1 byte"
|
||||
ECHO: "Expect [0] for search(a, aaaa)=[0]. OK"
|
||||
ECHO: "Expect [0] for search(a, aaaa, 1)=[0]. OK"
|
||||
ECHO: "Expect [0, 0] for search(aa, aaaa)=[0, 0]. OK"
|
||||
ECHO: "Expect [0, 0] for search(aa, aaaa, 1)=[0, 0]. OK"
|
||||
ECHO: "Expect [[0, 1, 2, 3]] for search(a, aaaa, 0)=[[0, 1, 2, 3]]. OK"
|
||||
ECHO: "Expect [[0, 1]] for search(a, aaaa, 2)=[[0, 1]]. OK"
|
||||
ECHO: "Expect [[0, 1, 2]] for search(a, aaaa, 3)=[[0, 1, 2]]. OK"
|
||||
ECHO: "Expect [[0, 1, 2, 3]] for search(a, aaaa, 4)=[[0, 1, 2, 3]]. OK"
|
||||
ECHO: "Expect [[0, 1, 2, 3], [0, 1, 2, 3]] for search(aa, aaaa, 0)=[[0, 1, 2, 3], [0, 1, 2, 3]]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [] for search(b, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [] for search(b, aaaa, 1)=[]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [[]] for search(b, aaaa, 0)=[[]]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [[]] for search(b, aaaa, 2)=[[]]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [] for search(bb, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [] for search(bb, aaaa, 1)=[]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [[], []] for search(bb, aaaa, 0)=[[], []]. OK"
|
||||
WARNING: search term not found: "b"
|
||||
WARNING: search term not found: "b"
|
||||
ECHO: "Expect [[], []] for search(bb, aaaa, 2)=[[], []]. OK"
|
||||
ECHO: "Expect [] for search(, aaaa)=[]. OK"
|
||||
ECHO: "Expect [] for search(, )=[]. OK"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [] for search(a, )=[]. OK"
|
||||
ECHO: "----- Lookup of multi-byte into 1 byte"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [] for search(Л, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [] for search(🂡, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [[]] for search(Л, aaaa, 0)=[[]]. OK"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [[]] for search(🂡, aaaa, 0)=[[]]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [] for search(ЛЛ, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "🂡"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [] for search(🂡🂡, aaaa)=[]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [[], []] for search(ЛЛ, aaaa, 0)=[[], []]. OK"
|
||||
WARNING: search term not found: "🂡"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [[], []] for search(🂡🂡, aaaa, 0)=[[], []]. OK"
|
||||
ECHO: "----- Lookup of 1-byte into multi-byte"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [] for search(a, ЛЛЛЛ)=[]. OK"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [] for search(a, 🂡🂡🂡🂡)=[]. OK"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [] for search(a, ЛЛЛЛ, 1)=[]. OK"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [[]] for search(a, 🂡🂡🂡🂡, 0)=[[]]. OK"
|
||||
WARNING: search term not found: "a"
|
||||
ECHO: "Expect [[]] for search(a, 🂡🂡🂡🂡, 2)=[[]]. OK"
|
||||
ECHO: "----- Lookup of 1-byte into mixed multi-byte"
|
||||
ECHO: "Expect [0] for search(a, aЛaЛaЛaЛa)=[0]. OK"
|
||||
ECHO: "Expect [0] for search(a, a🂡a🂡a🂡a🂡a)=[0]. OK"
|
||||
ECHO: "Expect [0] for search(a, a🂡Л🂡a🂡Л🂡a)=[0]. OK"
|
||||
ECHO: "Expect [[0, 2, 4, 6, 8]] for search(a, aЛaЛaЛaЛa, 0)=[[0, 2, 4, 6, 8]]. OK"
|
||||
ECHO: "Expect [[0, 2, 4, 6, 8]] for search(a, a🂡a🂡a🂡a🂡a, 0)=[[0, 2, 4, 6, 8]]. OK"
|
||||
ECHO: "Expect [[0, 4, 8]] for search(a, a🂡Л🂡a🂡Л🂡a, 0)=[[0, 4, 8]]. OK"
|
||||
ECHO: "----- Lookup of 2-byte into 2-byte"
|
||||
ECHO: "Expect [0] for search(Л, ЛЛЛЛ)=[0]. OK"
|
||||
ECHO: "Expect [[0, 1, 2, 3]] for search(Л, ЛЛЛЛ, 0)=[[0, 1, 2, 3]]. OK"
|
||||
ECHO: "----- Lookup of 2-byte into 4-byte"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [] for search(Л, 🂡🂡🂡🂡)=[]. OK"
|
||||
ECHO: "----- Lookup of 4-byte into 4-byte"
|
||||
ECHO: "Expect [0] for search(🂡, 🂡🂡🂡🂡)=[0]. OK"
|
||||
ECHO: "Expect [[0, 1, 2, 3]] for search(🂡, 🂡🂡🂡🂡, 0)=[[0, 1, 2, 3]]. OK"
|
||||
ECHO: "----- Lookup of 4-byte into 2-byte"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [] for search(🂡, ЛЛЛЛ)=[]. OK"
|
||||
ECHO: "----- Lookup of 2-byte into mixed multi-byte"
|
||||
ECHO: "Expect [1] for search(Л, aЛaЛaЛaЛa, 1)=[1]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [] for search(Л, a🂡a🂡a🂡a🂡a, 1)=[]. OK"
|
||||
ECHO: "Expect [2] for search(Л, a🂡Л🂡a🂡Л🂡a, 1)=[2]. OK"
|
||||
ECHO: "Expect [[1, 3, 5, 7]] for search(Л, aЛaЛaЛaЛa, 0)=[[1, 3, 5, 7]]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [[]] for search(Л, a🂡a🂡a🂡a🂡a, 0)=[[]]. OK"
|
||||
ECHO: "Expect [[2, 6]] for search(Л, a🂡Л🂡a🂡Л🂡a, 0)=[[2, 6]]. OK"
|
||||
ECHO: "----- Lookup of 4-byte into mixed multi-byte"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [] for search(🂡, aЛaЛaЛaЛa, 1)=[]. OK"
|
||||
ECHO: "Expect [1] for search(🂡, a🂡a🂡a🂡a🂡a, 1)=[1]. OK"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [[]] for search(🂡, aЛaЛaЛaЛa, 0)=[[]]. OK"
|
||||
ECHO: "Expect [[1, 3, 5, 7]] for search(🂡, a🂡a🂡a🂡a🂡a, 0)=[[1, 3, 5, 7]]. OK"
|
||||
ECHO: "Expect [[1, 3, 5, 7]] for search(🂡, a🂡Л🂡a🂡Л🂡a, 0)=[[1, 3, 5, 7]]. OK"
|
||||
ECHO: "----- Lookup of mixed multi-byte into mixed multi-byte"
|
||||
WARNING: search term not found: "🂡"
|
||||
ECHO: "Expect [[0, 2, 4, 6, 8], [1, 3, 5, 7], []] for search(aЛ🂡, aЛaЛaЛaЛa, 0)=[[0, 2, 4, 6, 8], [1, 3, 5, 7], []]. OK"
|
||||
WARNING: search term not found: "Л"
|
||||
ECHO: "Expect [[0, 2, 4, 6, 8], [], [1, 3, 5, 7]] for search(aЛ🂡, a🂡a🂡a🂡a🂡a, 0)=[[0, 2, 4, 6, 8], [], [1, 3, 5, 7]]. OK"
|
||||
ECHO: "Expect [[0, 4, 8], [2, 6], [1, 3, 5, 7]] for search(aЛ🂡, a🂡Л🂡a🂡Л🂡a, 0)=[[0, 4, 8], [2, 6], [1, 3, 5, 7]]. OK"
|
||||
ECHO: "Expect [[1, 3, 5, 7], [0, 4, 8], [2, 6]] for search(🂡aЛ, a🂡Л🂡a🂡Л🂡a, 0)=[[1, 3, 5, 7], [0, 4, 8], [2, 6]]. OK"
|
|
@ -0,0 +1,107 @@
|
|||
ECHO: "text_1bytes_len = ", "1234", " len = ", 4
|
||||
ECHO: "text_2bytes_len = ", "ЛЛЛЛ", " len = ", 4
|
||||
ECHO: "text_4bytes_len = ", "🂡🂱🃁🃑", " len = ", 4
|
||||
ECHO: "[", 0, "] = ", "DEADBEEF", " of len=", 8, ":"
|
||||
ECHO: " [", 0, "]=", "D"
|
||||
ECHO: " [", 1, "]=", "E"
|
||||
ECHO: " [", 2, "]=", "A"
|
||||
ECHO: " [", 3, "]=", "D"
|
||||
ECHO: " [", 4, "]=", "B"
|
||||
ECHO: " [", 5, "]=", "E"
|
||||
ECHO: " [", 6, "]=", "E"
|
||||
ECHO: " [", 7, "]=", "F"
|
||||
ECHO: "[", 1, "] = ", "Ленивый рыжий кот", " of len=", 17, ":"
|
||||
ECHO: " [", 0, "]=", "Л"
|
||||
ECHO: " [", 1, "]=", "е"
|
||||
ECHO: " [", 2, "]=", "н"
|
||||
ECHO: " [", 3, "]=", "и"
|
||||
ECHO: " [", 4, "]=", "в"
|
||||
ECHO: " [", 5, "]=", "ы"
|
||||
ECHO: " [", 6, "]=", "й"
|
||||
ECHO: " [", 7, "]=", " "
|
||||
ECHO: " [", 8, "]=", "р"
|
||||
ECHO: " [", 9, "]=", "ы"
|
||||
ECHO: " [", 10, "]=", "ж"
|
||||
ECHO: " [", 11, "]=", "и"
|
||||
ECHO: " [", 12, "]=", "й"
|
||||
ECHO: " [", 13, "]=", " "
|
||||
ECHO: " [", 14, "]=", "к"
|
||||
ECHO: " [", 15, "]=", "о"
|
||||
ECHO: " [", 16, "]=", "т"
|
||||
ECHO: "[", 2, "] = ", "كسول الزنجبيل القط", " of len=", 18, ":"
|
||||
ECHO: " [", 0, "]=", "ك"
|
||||
ECHO: " [", 1, "]=", "س"
|
||||
ECHO: " [", 2, "]=", "و"
|
||||
ECHO: " [", 3, "]=", "ل"
|
||||
ECHO: " [", 4, "]=", " "
|
||||
ECHO: " [", 5, "]=", "ا"
|
||||
ECHO: " [", 6, "]=", "ل"
|
||||
ECHO: " [", 7, "]=", "ز"
|
||||
ECHO: " [", 8, "]=", "ن"
|
||||
ECHO: " [", 9, "]=", "ج"
|
||||
ECHO: " [", 10, "]=", "ب"
|
||||
ECHO: " [", 11, "]=", "ي"
|
||||
ECHO: " [", 12, "]=", "ل"
|
||||
ECHO: " [", 13, "]=", " "
|
||||
ECHO: " [", 14, "]=", "ا"
|
||||
ECHO: " [", 15, "]=", "ل"
|
||||
ECHO: " [", 16, "]=", "ق"
|
||||
ECHO: " [", 17, "]=", "ط"
|
||||
ECHO: "[", 3, "] = ", "懶惰的姜貓", " of len=", 5, ":"
|
||||
ECHO: " [", 0, "]=", "懶"
|
||||
ECHO: " [", 1, "]=", "惰"
|
||||
ECHO: " [", 2, "]=", "的"
|
||||
ECHO: " [", 3, "]=", "姜"
|
||||
ECHO: " [", 4, "]=", "貓"
|
||||
ECHO: "[", 4, "] = ", "äöü ÄÖÜ ß", " of len=", 9, ":"
|
||||
ECHO: " [", 0, "]=", "ä"
|
||||
ECHO: " [", 1, "]=", "ö"
|
||||
ECHO: " [", 2, "]=", "ü"
|
||||
ECHO: " [", 3, "]=", " "
|
||||
ECHO: " [", 4, "]=", "Ä"
|
||||
ECHO: " [", 5, "]=", "Ö"
|
||||
ECHO: " [", 6, "]=", "Ü"
|
||||
ECHO: " [", 7, "]=", " "
|
||||
ECHO: " [", 8, "]=", "ß"
|
||||
ECHO: "[", 5, "] = ", "😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐", " of len=", 16, ":"
|
||||
ECHO: " [", 0, "]=", "😁"
|
||||
ECHO: " [", 1, "]=", "😂"
|
||||
ECHO: " [", 2, "]=", "😃"
|
||||
ECHO: " [", 3, "]=", "😄"
|
||||
ECHO: " [", 4, "]=", "😅"
|
||||
ECHO: " [", 5, "]=", "😆"
|
||||
ECHO: " [", 6, "]=", "😇"
|
||||
ECHO: " [", 7, "]=", "😈"
|
||||
ECHO: " [", 8, "]=", "😉"
|
||||
ECHO: " [", 9, "]=", "😊"
|
||||
ECHO: " [", 10, "]=", "😋"
|
||||
ECHO: " [", 11, "]=", "😌"
|
||||
ECHO: " [", 12, "]=", "😍"
|
||||
ECHO: " [", 13, "]=", "😎"
|
||||
ECHO: " [", 14, "]=", "😏"
|
||||
ECHO: " [", 15, "]=", "😐"
|
||||
ECHO: "[", 6, "] = ", "⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏", " of len=", 15, ":"
|
||||
ECHO: " [", 0, "]=", "⠁"
|
||||
ECHO: " [", 1, "]=", "⠂"
|
||||
ECHO: " [", 2, "]=", "⠃"
|
||||
ECHO: " [", 3, "]=", "⠄"
|
||||
ECHO: " [", 4, "]=", "⠅"
|
||||
ECHO: " [", 5, "]=", "⠆"
|
||||
ECHO: " [", 6, "]=", "⠇"
|
||||
ECHO: " [", 7, "]=", "⠈"
|
||||
ECHO: " [", 8, "]=", "⠉"
|
||||
ECHO: " [", 9, "]=", "⠊"
|
||||
ECHO: " [", 10, "]=", "⠋"
|
||||
ECHO: " [", 11, "]=", "⠌"
|
||||
ECHO: " [", 12, "]=", "⠍"
|
||||
ECHO: " [", 13, "]=", "⠎"
|
||||
ECHO: " [", 14, "]=", "⠏"
|
||||
ECHO: "[", 7, "] = ", "🂡🂱🃁🃑", " of len=", 4, ":"
|
||||
ECHO: " [", 0, "]=", "🂡"
|
||||
ECHO: " [", 1, "]=", "🂱"
|
||||
ECHO: " [", 2, "]=", "🃁"
|
||||
ECHO: " [", 3, "]=", "🃑"
|
||||
ECHO: "Past end of unicode only 2-byte ", undef
|
||||
ECHO: "Past end of unicode only 4-byte ", undef
|
||||
ECHO: "Past end of both 2-byte ", undef
|
||||
ECHO: "Past end of both 4-byte ", undef
|
Loading…
Reference in New Issue