2018-12-31 10:11:47 +08:00
|
|
|
#!/bin/bash
|
|
|
|
########################################################################
|
|
|
|
# Generates an "amalgamation build" for roaring. Inspired by similar
|
|
|
|
# script used by whefs.
|
|
|
|
########################################################################
|
|
|
|
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
|
|
|
|
|
|
|
|
echo "We are about to amalgamate all simdjson files into one source file. "
|
|
|
|
echo "See https://www.sqlite.org/amalgamation.html and https://en.wikipedia.org/wiki/Single_Compilation_Unit for rationale. "
|
|
|
|
|
|
|
|
AMAL_H="simdjson.h"
|
|
|
|
AMAL_C="simdjson.cpp"
|
|
|
|
|
|
|
|
# order does not matter
|
2018-12-31 10:50:10 +08:00
|
|
|
ALLCFILES="
|
2019-10-14 02:16:26 +08:00
|
|
|
$SCRIPTPATH/src/jsoncharutils.h
|
|
|
|
$SCRIPTPATH/src/numberparsing.h
|
|
|
|
$SCRIPTPATH/src/simdprune_tables.h
|
2019-06-25 22:13:53 +08:00
|
|
|
$SCRIPTPATH/src/simdjson.cpp
|
2018-12-31 10:50:10 +08:00
|
|
|
$SCRIPTPATH/src/jsonioutil.cpp
|
|
|
|
$SCRIPTPATH/src/jsonminifier.cpp
|
|
|
|
$SCRIPTPATH/src/jsonparser.cpp
|
2019-10-19 10:03:18 +08:00
|
|
|
$SCRIPTPATH/src/arm64/simd.h
|
|
|
|
$SCRIPTPATH/src/haswell/simd.h
|
|
|
|
$SCRIPTPATH/src/westmere/simd.h
|
2019-08-21 19:59:49 +08:00
|
|
|
$SCRIPTPATH/src/arm64/stage1_find_marks.h
|
|
|
|
$SCRIPTPATH/src/haswell/stage1_find_marks.h
|
|
|
|
$SCRIPTPATH/src/westmere/stage1_find_marks.h
|
2018-12-31 10:50:10 +08:00
|
|
|
$SCRIPTPATH/src/stage1_find_marks.cpp
|
2019-08-21 19:59:49 +08:00
|
|
|
$SCRIPTPATH/src/arm64/stringparsing.h
|
|
|
|
$SCRIPTPATH/src/haswell/stringparsing.h
|
|
|
|
$SCRIPTPATH/src/westmere/stringparsing.h
|
2019-10-14 02:16:26 +08:00
|
|
|
$SCRIPTPATH/src/stage2_build_tape.cpp
|
2019-08-21 19:59:49 +08:00
|
|
|
$SCRIPTPATH/src/arm64/stage2_build_tape.h
|
|
|
|
$SCRIPTPATH/src/haswell/stage2_build_tape.h
|
|
|
|
$SCRIPTPATH/src/westmere/stage2_build_tape.h
|
2019-02-23 04:42:44 +08:00
|
|
|
$SCRIPTPATH/src/parsedjson.cpp
|
|
|
|
$SCRIPTPATH/src/parsedjsoniterator.cpp
|
2018-12-31 10:50:10 +08:00
|
|
|
"
|
2018-12-31 10:11:47 +08:00
|
|
|
|
|
|
|
# order matters
|
|
|
|
ALLCHEADERS="
|
2019-02-26 23:14:49 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/simdjson_version.h
|
2018-12-31 10:11:47 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/portability.h
|
2019-07-29 10:46:33 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/isadetection.h
|
2019-10-14 02:16:26 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/jsonformatutils.h
|
2019-07-29 10:46:33 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/simdjson.h
|
2018-12-31 10:11:47 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/common_defs.h
|
2019-05-10 05:59:51 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/padded_string.h
|
2018-12-31 10:11:47 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/jsonioutil.h
|
|
|
|
$SCRIPTPATH/include/simdjson/jsonminifier.h
|
|
|
|
$SCRIPTPATH/include/simdjson/parsedjson.h
|
2019-08-16 07:42:15 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/parsedjsoniterator.h
|
2018-12-31 10:11:47 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/stage1_find_marks.h
|
2019-01-01 06:13:32 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/stage2_build_tape.h
|
2018-12-31 10:11:47 +08:00
|
|
|
$SCRIPTPATH/include/simdjson/jsonparser.h
|
|
|
|
"
|
|
|
|
|
|
|
|
for i in ${ALLCHEADERS} ${ALLCFILES}; do
|
|
|
|
test -e $i && continue
|
|
|
|
echo "FATAL: source file [$i] not found."
|
|
|
|
exit 127
|
|
|
|
done
|
|
|
|
|
|
|
|
function dofile()
|
|
|
|
{
|
2019-08-05 03:58:35 +08:00
|
|
|
# Last lines are always ignored. Files should end by an empty lines.
|
2019-03-03 06:18:45 +08:00
|
|
|
RELFILE=${1#"$SCRIPTPATH/"}
|
|
|
|
echo "/* begin file $RELFILE */"
|
2018-12-31 10:11:47 +08:00
|
|
|
# echo "#line 8 \"$1\"" ## redefining the line/file is not nearly as useful as it sounds for debugging. It breaks IDEs.
|
2019-08-05 03:58:35 +08:00
|
|
|
while IFS= read -r line
|
|
|
|
do
|
2019-08-21 19:59:49 +08:00
|
|
|
if [[ "${line}" == '#include "'*'"'* ]]; then
|
|
|
|
file=$(echo $line| cut -d'"' -f 2)
|
|
|
|
|
|
|
|
if [[ "${file}" == '../'* ]]; then
|
|
|
|
file=$(echo $file| cut -d'/' -f 2-)
|
|
|
|
fi;
|
|
|
|
|
|
|
|
# we ignore simdjson headers (except src/generic/*.h); they are handled in the above list
|
|
|
|
if [ -f include/$file ]; then
|
|
|
|
continue;
|
|
|
|
elif [ -f src/$file ]; then
|
|
|
|
# we paste the contents of src/generic/*.h
|
|
|
|
if [[ "${file}" == *'generic/'*'.h' ]]; then
|
|
|
|
echo "$(<src/$file)"
|
|
|
|
fi;
|
|
|
|
continue;
|
|
|
|
fi;
|
2019-08-05 03:58:35 +08:00
|
|
|
fi;
|
2019-08-21 19:59:49 +08:00
|
|
|
|
|
|
|
# Otherwise we simply copy the line
|
|
|
|
echo "$line"
|
2019-08-05 03:58:35 +08:00
|
|
|
done < "$1"
|
2019-03-03 06:18:45 +08:00
|
|
|
echo "/* end file $RELFILE */"
|
2018-12-31 10:11:47 +08:00
|
|
|
}
|
|
|
|
timestamp=$(date)
|
|
|
|
echo "Creating ${AMAL_H}..."
|
|
|
|
echo "/* auto-generated on ${timestamp}. Do not edit! */" > "${AMAL_H}"
|
|
|
|
{
|
|
|
|
for h in ${ALLCHEADERS}; do
|
|
|
|
dofile $h
|
|
|
|
done
|
|
|
|
} >> "${AMAL_H}"
|
|
|
|
|
|
|
|
|
|
|
|
echo "Creating ${AMAL_C}..."
|
|
|
|
echo "/* auto-generated on ${timestamp}. Do not edit! */" > "${AMAL_C}"
|
|
|
|
{
|
|
|
|
echo "#include \"${AMAL_H}\""
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
echo "/* used for http://dmalloc.com/ Dmalloc - Debug Malloc Library */"
|
|
|
|
echo "#ifdef DMALLOC"
|
|
|
|
echo "#include \"dmalloc.h\""
|
|
|
|
echo "#endif"
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
for h in ${ALLCFILES}; do
|
|
|
|
dofile $h
|
|
|
|
done
|
|
|
|
} >> "${AMAL_C}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEMOCPP="amalgamation_demo.cpp"
|
|
|
|
echo "Creating ${DEMOCPP}..."
|
|
|
|
echo "/* auto-generated on ${timestamp}. Do not edit! */" > "${DEMOCPP}"
|
|
|
|
cat <<< '
|
|
|
|
#include <iostream>
|
|
|
|
#include "simdjson.h"
|
|
|
|
#include "simdjson.cpp"
|
|
|
|
int main(int argc, char *argv[]) {
|
2019-07-31 06:10:48 +08:00
|
|
|
if(argc < 2) {
|
|
|
|
std::cerr << "Please specify a filename " << std::endl;
|
|
|
|
}
|
2019-02-23 04:42:44 +08:00
|
|
|
const char * filename = argv[1];
|
2019-07-10 07:48:20 +08:00
|
|
|
simdjson::padded_string p = simdjson::get_corpus(filename);
|
|
|
|
simdjson::ParsedJson pj = simdjson::build_parsed_json(p); // do the parsing
|
2019-07-31 05:18:10 +08:00
|
|
|
if( ! pj.is_valid() ) {
|
2018-12-31 10:11:47 +08:00
|
|
|
std::cout << "not valid" << std::endl;
|
|
|
|
} else {
|
|
|
|
std::cout << "valid" << std::endl;
|
|
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
' >> "${DEMOCPP}"
|
|
|
|
|
|
|
|
echo "Done with all files generation. "
|
|
|
|
|
|
|
|
echo "Files have been written to directory: $PWD "
|
|
|
|
ls -la ${AMAL_C} ${AMAL_H} ${DEMOCPP}
|
|
|
|
|
|
|
|
echo "Giving final instructions:"
|
|
|
|
|
|
|
|
|
|
|
|
CPPBIN=${DEMOCPP%%.*}
|
|
|
|
|
|
|
|
echo "Try :"
|
2019-07-29 10:46:33 +08:00
|
|
|
echo "c++ -O3 -std=c++17 -o ${CPPBIN} ${DEMOCPP} && ./${CPPBIN} ../jsonexamples/twitter.json "
|
2018-12-31 10:50:10 +08:00
|
|
|
|
|
|
|
SINGLEHDR=$SCRIPTPATH/singleheader
|
|
|
|
echo "Copying files to $SCRIPTPATH/singleheader "
|
|
|
|
mkdir -p $SINGLEHDR
|
2019-07-29 10:46:33 +08:00
|
|
|
echo "c++ -O3 -std=c++17 -o ${CPPBIN} ${DEMOCPP} && ./${CPPBIN} ../jsonexamples/twitter.json " > $SINGLEHDR/README.md
|
2018-12-31 10:50:10 +08:00
|
|
|
cp ${AMAL_C} ${AMAL_H} ${DEMOCPP} $SINGLEHDR
|
|
|
|
ls $SINGLEHDR
|
2018-12-31 10:11:47 +08:00
|
|
|
|
2019-07-29 10:46:33 +08:00
|
|
|
cd $SINGLEHDR && c++ -O3 -std=c++17 -o ${CPPBIN} ${DEMOCPP} && ./${CPPBIN} ../jsonexamples/twitter.json
|
2019-02-23 04:42:44 +08:00
|
|
|
|
2018-12-31 10:11:47 +08:00
|
|
|
lowercase(){
|
|
|
|
echo "$1" | tr 'A-Z' 'a-z'
|
|
|
|
}
|
|
|
|
|
|
|
|
OS=`lowercase \`uname\``
|