Project import generated by Copybara.
GitOrigin-RevId: 03d7d72d983d47c17f7de95bbeae89fe33e41943
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..5f1611c
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,89 @@
+---
+Language: Cpp
+# BasedOnStyle: Google
+AccessModifierOffset: -1
+AlignAfterOpenBracket: DontAlign
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: true
+AlignOperands: false
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: true
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: TopLevel
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ IndentBraces: false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+ColumnLimit: 90
+CommentPragmas: '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 8
+Cpp11BracedListStyle: false
+DerivePointerAlignment: false
+DisableFormat: false
+ExperimentalAutoDetectBinPacking: false
+ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
+IncludeCategories:
+ - Regex: '^<.*\.h>'
+ Priority: 1
+ - Regex: '^<.*'
+ Priority: 2
+ - Regex: '.*'
+ Priority: 3
+IndentCaseLabels: false
+IndentWidth: 4
+IndentWrappedFunctionNames: false
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: false
+PenaltyBreakBeforeFirstCallParameter: 1
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 200
+PointerAlignment: Right
+ReflowComments: true
+SortIncludes: false
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 2
+SpacesInAngles: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard: Auto
+TabWidth: 4
+UseTab: Always
+...
diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 0000000..610642c
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,4 @@
+((makefile-automake-mode
+ (tab-width . 8))
+ (org-mode
+ (fill-column . 70)))
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..1397b26
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,307 @@
+# *~
+# .DS_Store
+
+# for .dockerignore
+.git
+
+# MacOS
+# .DS_Store
+
+# tag files
+# TAGS
+GPATH
+GRTAGS
+GSYMS
+GTAGS
+
+# /
+Makefile
+Makefile.in
+configure
+liblouis.pc
+config.log
+depcomp
+config.guess
+ltmain.sh
+config.sub
+config.status
+libtool
+autom4te.cache
+missing
+aclocal.m4
+install-sh
+INSTALL
+
+# valgrind
+valgrind.log
+
+# Eclipse
+# .cproject
+# .project
+
+# /build-aux/
+build-aux/ar-lib
+build-aux/compile
+build-aux/config.guess
+build-aux/config.rpath
+build-aux/config.sub
+build-aux/depcomp
+build-aux/install-sh
+build-aux/ltmain.sh
+build-aux/mdate-sh
+build-aux/missing
+build-aux/test-driver
+build-aux/texinfo.tex
+
+# /contrib/
+contrib/liblouis.elc
+contrib/braille-input.elc
+
+# /doc/
+doc/Makefile
+doc/Makefile.in
+doc/mdate-sh
+doc/texinfo.tex
+doc/version.texi
+doc/stamp-vti
+doc/liblouis.html
+doc/liblouis.info
+doc/liblouis.txt
+doc/liblouis.pdf
+doc/liblouis.fn
+doc/liblouis.pg
+doc/liblouis.opcode
+doc/liblouis.log
+doc/liblouis.ky
+doc/liblouis.tp
+doc/liblouis.toc
+doc/liblouis.fns
+doc/liblouis.vr
+doc/liblouis.pgs
+doc/liblouis.opcodes
+doc/liblouis.aux
+doc/liblouis.cp
+doc/liblouis.t2p/
+
+# /gnulib/
+gnulib/.libs
+gnulib/.deps
+gnulib/*.o
+gnulib/*.lo
+gnulib/*.la
+gnulib/Makefile
+gnulib/Makefile.in
+gnulib/alloca.h
+gnulib/dirent.h
+gnulib/errno.h
+gnulib/getopt.h
+gnulib/limits.h
+gnulib/stddef.h
+gnulib/stdint.h
+gnulib/stdio.h
+gnulib/stdlib.h
+gnulib/string.h
+gnulib/sys/
+gnulib/unistd.h
+
+# /liblouis/
+liblouis/.libs
+liblouis/.deps
+liblouis/*.o
+liblouis/*.lo
+liblouis/*.la
+liblouis/Makefile
+liblouis/Makefile.in
+liblouis/stamp-h1
+liblouis/config.h.in
+liblouis/config.h
+liblouis/liblouis.h
+
+# /m4/
+m4/Makefile
+m4/Makefile.in
+m4/libtool.m4
+m4/ltoptions.m4
+m4/ltsugar.m4
+m4/ltversion.m4
+m4/lt~obsolete.m4
+
+# /man/
+man/Makefile
+man/Makefile.in
+man/lou_allround.1
+man/lou_checkhyphens.1
+man/lou_checktable.1
+man/lou_debug.1
+man/lou_trace.1
+man/lou_translate.1
+man/lou_checkyaml.1
+
+# /python/
+python/Makefile
+python/Makefile.in
+python/build
+python/setup.py
+
+# /python/louis/
+python/louis/Makefile
+python/louis/Makefile.in
+python/louis/__init__.py
+python/louis/*.pyc
+
+# /tables
+tables/Makefile
+tables/Makefile.in
+
+# /tests/
+tests/.libs
+tests/.deps
+tests/*.o
+tests/*.exe
+tests/*.log
+tests/*.trs
+tests/Makefile
+tests/Makefile.in
+tests/backtranslate
+tests/backtranslate_noUndefinedDots
+tests/backtranslate_partialTrans
+tests/backtranslate_with_letsign
+tests/capitalization
+tests/capitalized_with_sentance
+tests/capitalized_word
+tests/checkTable
+tests/check_metadata
+tests/compbrlAtCursor
+tests/emphclass
+tests/en_gb_g1_italics
+tests/findTable
+tests/getTable
+tests/hash_collision
+tests/hyphenate
+tests/hyphenate_achena
+tests/hyphenate_alderen
+tests/hyphenate_straightforward
+tests/hyphenate_xxx
+tests/infiniteTranslationLoop
+tests/inpos
+tests/inpos_compbrl
+tests/inpos_match_replace
+tests/lastworditalafter
+tests/letterDefTest
+tests/logging
+tests/outpos
+tests/pass0_typebuf
+tests/pass1Only
+tests/pass2
+tests/pass2_inpos
+tests/present_progressive
+tests/resolve_table
+tests/resolve_table.h
+tests/squash_space
+tests/typeform
+tests/typeform_for_emphclass
+tests/uplow_with_unicode
+tests/yaml/*.log
+tests/yaml/*.trs
+
+# /tests/yaml/
+tests/yaml/Makefile
+tests/yaml/Makefile.in
+tests/yaml/*.log
+tests/yaml/*.trs
+
+# /tests/tables/
+tests/tables/Makefile.in
+tests/tables/Makefile
+tests/tables/emphclass/Makefile
+tests/tables/emphclass/Makefile.in
+tests/tables/moreTables/Makefile.in
+tests/tables/moreTables/Makefile
+tests/tables/resolve_table/Makefile
+tests/tables/resolve_table/Makefile.in
+tests/tables/resolve_table/dir_1/Makefile
+tests/tables/resolve_table/dir_1/Makefile.in
+tests/tables/resolve_table/dir_2/Makefile
+tests/tables/resolve_table/dir_2/Makefile.in
+tests/tables/resolve_table/dir_1/dir_1.1/Makefile
+tests/tables/resolve_table/dir_1/dir_1.1/Makefile.in
+tests/tablesWithMetadata/Makefile
+tests/tablesWithMetadata/Makefile.in
+
+# /tests/ueb_test_data/
+tests/ueb_test_data/Makefile
+tests/ueb_test_data/Makefile.in
+
+# /tools/
+tools/.libs
+tools/.deps
+tools/*.o
+tools/*.la
+tools/*.lo
+tools/Makefile
+tools/Makefile.in
+tools/lou_allround
+tools/lou_checkhyphens
+tools/lou_checktable
+tools/lou_checkyaml
+tools/lou_debug
+tools/lou_trace
+tools/lou_translate
+tools/lou_compare
+tools/*.exe
+
+# /tools/gnulib
+tools/gnulib/.libs
+tools/gnulib/.deps
+tools/gnulib/*.o
+tools/gnulib/*.lo
+tools/gnulib/*.la
+tools/gnulib/Makefile
+tools/gnulib/Makefile.in
+tools/gnulib/errno.h
+tools/gnulib/getopt-cdefs.h
+tools/gnulib/getopt.h
+tools/gnulib/limits.h
+tools/gnulib/stddef.h
+tools/gnulib/stdint.h
+tools/gnulib/stdio.h
+tools/gnulib/stdlib.h
+tools/gnulib/string.h
+tools/gnulib/sys/
+tools/gnulib/unistd.h
+tools/gnulib/unistr.h
+tools/gnulib/unistr/.dirstamp
+tools/gnulib/unitypes.h
+
+# /tools/gnulib/unistr/
+tools/gnulib/unistr/.libs
+tools/gnulib/unistr/.deps
+tools/gnulib/unistr/*.o
+tools/gnulib/unistr/*.la
+tools/gnulib/unistr/*.lo
+
+# stuff used with /tools/lou_compare
+# input.txt
+# pass.txt
+# fail.txt
+# output.txt
+
+# /windows/
+windows/*.obj
+windows/liblouis.dll
+windows/liblouis.lib
+windows/liblouis.exp
+windows/Makefile
+windows/Makefile.in
+
+# /windows/include
+windows/include/Makefile
+windows/include/Makefile.in
+
+# /windows/utils
+windows/utils/Makefile
+windows/utils/Makefile.in
+
+# stuff for local development
+# local/
+# local
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..7f2c4af
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,79 @@
+# define liblouis so that Travis CI service can build and test it
+
+# require Trusty so we have a modern version of texinfo (> 5.0) and
+# automake (> 1.14)
+sudo: required
+dist: xenial
+
+language: c
+
+services:
+ - docker
+
+env:
+ global:
+ # COVERITY_SCAN_TOKEN
+ - secure: "k2AM90pXF/IqX8CRSUPD3dkMktu9IUtFafDVvA1iC4p7hMfwOM4UIC/0E5Dqxwv4ULc7yqbWVchZwHMqteEqcJX8xbxsGqt4s1LtNosV2xjikbGmXVl3cp0qqv3exVcUaxtzxDs2Ee379sTUpVDK314M9oH5ky4N2L+971c1v84="
+ # GITHUB_TOKEN
+ - secure: "FbDvOO7Nqih9z0S+9RL/cvz/VTM5nlEUgJdUT7MefFjIAh+YCfv5sw6FkQpaiOx4xkd63tLrUvjJXi7fy4oERLDO2Qk4OOsntJUfNZqWlsGHZWUTfvgYkcNyNhXe2P4lKnnFaZbqui9Ec9OdnsR1DmrtIoq24BKTxYXCsxdux04="
+
+matrix:
+ include:
+ - compiler: gcc
+ env: MODE=build-gcc
+ - compiler: gcc
+ env: MODE=build-gcc ENABLE_UCS4=--enable-ucs4
+ - compiler: i686-w64-mingw32-gcc
+ env: MODE=build-mingw ENABLE_UCS4=--enable-ucs4 ARCH=32
+ - compiler: x86_64-w64-mingw32-gcc
+ env: MODE=build-mingw ENABLE_UCS4=--enable-ucs4 ARCH=64
+ - compiler: gcc
+ env: MODE=build-js
+ - env: MODE=check-format
+
+before_install:
+ - sudo apt-get update -qq
+ - 'chmod +x ./.travis/before_install/*.sh'
+ - 'chmod +x ./.travis/script/*.sh'
+ - 'chmod +x ./.travis/after_success/*.sh'
+ - case "$MODE" in
+ build-mingw) source .travis/before_install/mingw.sh ;;
+ build-js) source .travis/before_install/emscripten.sh ;;
+ build-gcc) source .travis/before_install/gcc.sh ;;
+ check-format) sudo apt-get install -y clang-format-3.9 ;;
+ esac
+ - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
+
+script:
+ - cd $TRAVIS_BUILD_DIR
+ - case "$MODE" in
+ build-mingw) source .travis/script/mingw.sh ;;
+ build-js) source .travis/script/emscripten.sh ;;
+ build-gcc) source .travis/script/gcc.sh ;;
+ check-format) source .travis/script/check-format.sh ;;
+ esac
+
+after_failure:
+ - case "$MODE" in
+ build-mingw|build-gcc) cat tests/test-suite.log ;;
+ esac
+
+after_success:
+ - case "$MODE" in
+ build-mingw) source .travis/after_success/mingw.sh ;;
+ build-js) source .travis/after_success/emscripten.sh ;;
+ esac
+
+# tell the irc channel about the results of the build
+notifications:
+ irc: "irc.oftc.net#liblouis"
+
+addons:
+ coverity_scan:
+ project:
+ name: "liblouis/liblouis"
+ description: "Build submitted via Travis CI"
+ notification_email: liblouis-liblouisxml@freelists.org
+ build_command_prepend: "./autogen.sh && ./configure && make clean"
+ build_command: "make"
+ branch_pattern: coverity_scan
diff --git a/.travis/after_success/emscripten.sh b/.travis/after_success/emscripten.sh
new file mode 100644
index 0000000..7b84fb8
--- /dev/null
+++ b/.travis/after_success/emscripten.sh
@@ -0,0 +1,54 @@
+if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_BRANCH" != "master" ]; then
+ echo "[liblouis-js] Not publishing. Is pull request or non-master branch."
+ exit 0
+fi
+
+if [ -z "$BUILD_VERSION" ]; then
+ echo "[liblouis-js] no build version specified. Not publishing."
+ exit 0
+fi
+
+echo "[liblouis-js] publishing builds to development channel..."
+
+git config user.name "Travis CI" &&
+git config user.email "liblouis@users.noreply.github.com" &&
+
+# --- decrypt and enable ssh key that allows us to push to the
+# liblouis/js-build repository.
+
+openssl aes-256-cbc -K $encrypted_cf3facfb36cf_key -iv $encrypted_cf3facfb36cf_iv -in ./.travis/secrets/deploy_key.enc -out deploy_key -d &&
+chmod 600 deploy_key &&
+eval `ssh-agent -s` &&
+ssh-add deploy_key &&
+
+# --- push commit and tag to repository. (This will also automatically
+# publish the package in the bower registry as the bower registry
+# just fetches tags and builds from the dev channel.)
+
+cd ../js-build &&
+git add --all &&
+
+if [ -z `git diff --cached --exit-code` ]; then
+ echo "[liblouis-js] Build is identical to previous build. Omitting commit, only adding tag."
+else
+ git commit -m "Automatic build of version ${BUILD_VERSION}" &&
+ git push git@github.com:liblouis/js-build.git master
+
+ if [ $? != 0 ]; then
+ echo "[liblouis-js] Failed to commit. Aborting."
+ exit 1
+ fi
+fi
+
+git tag -a ${BUILD_VERSION} -m "automatic build for version ${BUILD_VERSION}" &&
+git push git@github.com:liblouis/js-build.git $BUILD_VERSION
+
+echo "[liblouis-js] publishing builds to release channel..."
+
+if [ "$IS_OFFICIAL_RELEASE" != true ]; then
+ echo "[liblouis-js] Is not an official release. Not publishing to package managers."
+ exit 0
+fi
+
+# --- push in npm registry
+# TODO
diff --git a/.travis/after_success/mingw.sh b/.travis/after_success/mingw.sh
new file mode 100644
index 0000000..12598f0
--- /dev/null
+++ b/.travis/after_success/mingw.sh
@@ -0,0 +1,79 @@
+if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_BRANCH" != "master" ]; then
+ echo "[mingw] Not publishing. Is pull request or non-master branch."
+ exit 0
+fi
+
+echo "[mingw] Zipping up build..."
+
+INSTALL_DIR=win$ARCH-install
+COMMIT=$( git rev-parse --short=7 HEAD )
+ZIP=liblouis-win$ARCH-$COMMIT.zip
+
+make install && \
+cd $INSTALL_DIR && \
+zip -r $ZIP * && \
+cd .. && \
+mv $INSTALL_DIR/$ZIP .
+
+if [ $? != 0 ]; then
+ echo "[mingw] Failed to zip up build"
+ exit 1
+fi
+
+RELEASE_ID=8031256
+GITHUB_USER="bertfrees"
+
+echo "[mingw] First deleting previous build"
+
+# Using "curl -u" because authenticated requests get a higher rate limit
+assets=$(curl -u "$GITHUB_USER:$GITHUB_TOKEN" \
+ "https://api.github.com/repos/liblouis/liblouis/releases/$RELEASE_ID/assets" \
+ 2>/dev/null)
+if echo "$assets" | jq -e '.message' >/dev/null 2>/dev/null; then
+ echo "$assets" | jq -r '.message' >&2
+ exit 1
+else
+ assets=$(echo "$assets" | jq -r '.[] | select(.name | match("^liblouis-win'$ARCH'-.+\\.zip$")) | .url') || exit 1
+ echo "$assets" \
+ | while read u; do
+ if ! message=$(curl -u "$GITHUB_USER:$GITHUB_TOKEN" -X DELETE "$u" 2>/dev/null); then
+ echo "[mingw] Failed to delete asset $u"
+ exit 1
+ elif [ -n "$message" ]; then
+ echo "$message" | jq -r '.message' >&2
+ echo "[mingw] Failed to delete asset $u"
+ exit 1
+ fi
+ done
+fi
+
+echo "[mingw] Uploading builds to Github release..."
+
+if ! curl -u "$GITHUB_USER:$GITHUB_TOKEN" \
+ -H "Content-type: application/zip" \
+ -X POST \
+ "https://uploads.github.com/repos/liblouis/liblouis/releases/$RELEASE_ID/assets?name=$ZIP" \
+ --data-binary @$ZIP \
+ 2>/dev/null \
+ | jq -e '.url'
+then
+ echo "[mingw] Failed to upload asset"
+ exit 1
+fi
+
+echo "[mingw] Editing release description..."
+
+DESCRIPTION="Latest build: $COMMIT"
+if ! curl -u "$GITHUB_USER:$GITHUB_TOKEN" \
+ -H "Accept: application/json" \
+ -H "Content-type: application/json" \
+ -X PATCH \
+ "https://api.github.com/repos/liblouis/liblouis/releases/$RELEASE_ID" \
+ -d "{\"tag_name\": \"snapshot\", \
+ \"body\": \"$DESCRIPTION\"}" \
+ 2>/dev/null \
+ | jq -e '.url'
+then
+ echo "[mingw] Failed to edit release description"
+ exit 1
+fi
diff --git a/.travis/before_install/emscripten.sh b/.travis/before_install/emscripten.sh
new file mode 100644
index 0000000..571d74b
--- /dev/null
+++ b/.travis/before_install/emscripten.sh
@@ -0,0 +1,42 @@
+if [ -z "$TRAVIS_COMMIT" ]; then
+ echo "[liblouis-js] not building in travis. Aborting..."
+ exit 1
+fi
+
+export COMMIT_SHORT=$(echo $TRAVIS_COMMIT | cut -c1-6)
+
+echo $TRAVIS_TAG | grep "^v[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$"
+
+if [ $? -eq 1 ]; then
+ echo "[liblouis-js] tag is not valid version string."
+ export BUILD_VERSION="commit-${COMMIT_SHORT}"
+ export IS_OFFICIAL_RELEASE=false
+else
+ # NOTE: tags cannot be revoked. Only automatically publish as release
+ # candidate. A contributer should confirm the correctness of the build
+ # and rerelease unaltered binaries without the -rc suffix.
+ export BUILD_VERSION="${TRAVIS_TAG}-rc.1"
+ export IS_OFFICIAL_RELEASE=true
+fi
+
+echo "[liblouis-js] Assigned this build the version number ${BUILD_VERSION}" &&
+
+# --- obtain liblouis-js. Contains tests and js snippets appended to builds.
+# liblouis-js version should be incremented by hand, to keep the repositories
+# in sync.
+git clone https://github.com/liblouis/liblouis-js.git &&
+cd liblouis-js &&
+git checkout 8a28e9380c591c58e4b411bb366c76cf686ac418 &&
+cd .. &&
+# --- obtain the latest version of liblouis/js-build
+# we publish/deploy to this repository. Contains package
+# descriptions (package.json and bower.json) and documentation
+# that must/should be part of packages in package managers.
+
+# Note: we clone this repository to a location outside of the liblouis/liblouis
+# git repository to avoid issues caused by nested git repositorys
+git clone --depth 1 https://github.com/liblouis/js-build.git ../js-build &&
+
+echo "[liblouis-js] obtaining docker image of build tools..." &&
+docker pull dolp/liblouis-js-build-travis:1.37.3-64bit
+
diff --git a/.travis/before_install/gcc.sh b/.travis/before_install/gcc.sh
new file mode 100644
index 0000000..825ffca
--- /dev/null
+++ b/.travis/before_install/gcc.sh
@@ -0,0 +1 @@
+sudo apt-get install -y libyaml-dev
diff --git a/.travis/before_install/mingw.sh b/.travis/before_install/mingw.sh
new file mode 100644
index 0000000..190bc83
--- /dev/null
+++ b/.travis/before_install/mingw.sh
@@ -0,0 +1,9 @@
+sudo apt-get install -y $(test $ARCH == 32 && echo libc6-dev-i386 || echo mingw-w64) jq texinfo
+mkdir -p $HOME/src &&
+cd $_ &&
+curl -L https://github.com/yaml/libyaml/archive/0.2.2.tar.gz | tar zx &&
+cd libyaml-0.2.2 &&
+./bootstrap &&
+./configure --host $(test $ARCH == 32 && echo i686-w64-mingw32 || echo x86_64-w64-mingw32) --prefix=$HOME/build/win$ARCH/libyaml &&
+make &&
+make install
diff --git a/.travis/script/check-format.sh b/.travis/script/check-format.sh
new file mode 100755
index 0000000..de87454
--- /dev/null
+++ b/.travis/script/check-format.sh
@@ -0,0 +1,5 @@
+# apply clang-format and check for uncommitted changes
+./autogen.sh && \
+./configure && \
+make format-sources && \
+git diff-index --exit-code HEAD -- . ':!.travis'
diff --git a/.travis/script/emscripten-build-command.sh b/.travis/script/emscripten-build-command.sh
new file mode 100644
index 0000000..74e0d9c
--- /dev/null
+++ b/.travis/script/emscripten-build-command.sh
@@ -0,0 +1,23 @@
+function buildjs {
+
+ if [ $1 != "32" -a $1 != "16" ]; then
+ echo "argument 1 must either be 32 for UTF32 builts or 16 for UTF16 builds"
+ exit 1
+ fi
+
+ if [ -z $2 ]; then
+ echo "argument 2 must be a valid filename"
+ exit 1
+ fi
+
+ set -x
+
+ emcc ./liblouis/.libs/liblouis.a -s RESERVED_FUNCTION_POINTERS=1 -s MODULARIZE=1\
+ -s EXPORT_NAME="'liblouisBuild'" -s EXTRA_EXPORTED_RUNTIME_METHODS="['FS',\
+ 'Runtime', 'stringToUTF${1}', 'Pointer_Stringify']" --pre-js ./liblouis-js/inc/pre.js\
+ --post-js ./liblouis-js/inc/post.js ${3} -o ./out/${2} &&
+
+ cat ./liblouis-js/inc/append.js >> ./out/${2}
+
+ set +x
+}
diff --git a/.travis/script/emscripten-build.sh b/.travis/script/emscripten-build.sh
new file mode 100644
index 0000000..8a5771f
--- /dev/null
+++ b/.travis/script/emscripten-build.sh
@@ -0,0 +1,27 @@
+source ./.travis/script/emscripten-build-command.sh &&
+mkdir out &&
+
+echo "[liblouis-js] starting build process in docker image..." &&
+
+./autogen.sh &&
+
+echo "[liblouis-js] configuring and making UTF-16 builds..." &&
+emconfigure ./configure --disable-shared &&
+emmake make &&
+# install to obtain a table folder which does not contain build scripts
+emmake make install prefix="$(pwd)/out-emscripten-install"
+
+buildjs "16" "build-no-tables-utf16.js" &&
+#buildjs "16" "build-no-tables-wasm-utf16.js" "-s WASM=1" &&
+#buildjs "16" "build-tables-embeded-root-utf16.js" "--embed-files ./out-emscripten-install/share/liblouis/tables@/" &&
+
+echo "[liblouis-js] configuring and making UTF-32 builds..." &&
+emconfigure ./configure --enable-ucs4 --disable-shared &&
+emmake make &&
+
+echo "[liblouis-js] building UTF-32 with no tables..." &&
+buildjs "32" "build-no-tables-utf32.js" &&
+#buildjs "32" "build-no-tables-wasm-utf32.js" "-s WASM=1" &&
+#buildjs "32" "build-tables-embeded-root-utf32.js" "--embed-files ./out-emscripten-install/share/liblouis/tables@/" &&
+
+echo "[liblouis-js] done building in docker image..."
diff --git a/.travis/script/emscripten.sh b/.travis/script/emscripten.sh
new file mode 100644
index 0000000..2ba1d52
--- /dev/null
+++ b/.travis/script/emscripten.sh
@@ -0,0 +1,52 @@
+# --- build all four currently published builds of liblouis (UTF-16 with
+# tables, UTF-16 wihout tables, UTF-32 with tables and UTF-32 without
+# tables) in a docker image that has all necessary build tools installed.
+rm -f ../js-build/build-*.js
+
+echo "[liblouis-js] starting docker image with emscripten installed..."
+docker run --rm -v $(pwd):/src dolp/liblouis-js-build-travis:1.37.3-64bit /bin/bash -c "./.travis/script/emscripten-build.sh"
+
+if [ $? != 0 ]; then
+ echo "[liblouis-js] Build failed. Aborting..."
+ exit 1
+fi
+
+# --- collect all files that are necessary for a publish in package
+# managers.
+echo "[liblouis-js] bundling files to package for publish..." &&
+rm -rf ../js-build/tables/ &&
+cp -R ./out-emscripten-install/share/liblouis/tables/ ../js-build/tables/ &&
+cp -Rf ./out/* ../js-build/
+
+if [ "$IS_OFFICIAL_RELEASE" = true ]; then
+ cd ../js-build
+ npm version --no-git-tag-version $BUILD_VERSION
+
+ if [ $? != 0 ]; then
+ echo "[liblouis-js] Failed to update npm version tag. Aborting."
+ exit 1
+ fi
+
+ cd -
+fi
+
+ls -lah ../js-build
+
+# --- make sure the package we just build is not damaged.
+echo "[liblouis-js] testing builds..."
+
+# NOTE: `npm link` exposes the newly build npm package to the
+# test runner. The `--production`-flag is necessary as it ensures
+# that no publicly published package of the build is downloaded
+# and tested instead.
+cd liblouis-js &&
+npm link ../../js-build --production &&
+# NOTE: we only test the build in NodeJS as the browser test environment
+# segfaults sometimes for successful builds.
+npm run test-node &&
+cd ..
+
+if [ $? != 0 ]; then
+ echo "[liblouis-js] Not publishing as at least one build failed tests."
+ exit 1
+fi
diff --git a/.travis/script/gcc.sh b/.travis/script/gcc.sh
new file mode 100644
index 0000000..57aab1e
--- /dev/null
+++ b/.travis/script/gcc.sh
@@ -0,0 +1,13 @@
+./autogen.sh &&
+./configure $ENABLE_UCS4 --with-yaml &&
+make &&
+make check #&&
+# check display names
+# FIXME: temporarily disabled because this causes a memory corruption error on Travis
+# if [[ -n ${ENABLE_UCS4+x} ]]; then
+# cd extra/generate-display-names &&
+# if ! make; then
+# cat generate.log
+# false
+# fi
+# fi
diff --git a/.travis/script/mingw.sh b/.travis/script/mingw.sh
new file mode 100644
index 0000000..03a57c8
--- /dev/null
+++ b/.travis/script/mingw.sh
@@ -0,0 +1,11 @@
+./autogen.sh &&
+export CPPFLAGS="-I/$HOME/build/win$ARCH/libyaml/include/" &&
+export LDFLAGS="-L/$HOME/build/win$ARCH/libyaml/lib/" &&
+./configure --host $(test $ARCH == 32 && echo i586-mingw32msvc || echo x86_64-w64-mingw32) \
+ $ENABLE_UCS4 --with-yaml --prefix=$(pwd)/win$ARCH-install &&
+make LDFLAGS="$LDFLAGS -avoid-version -Xcompiler -static-libgcc"
+
+# FIXME:
+# make CPPFLAGS='-I/$HOME/build/win32/libyaml/include/' \
+# LDFLAGS='-L/$HOME/build/win32/libyaml/lib/' \
+# distwin32
diff --git a/.travis/secrets/deploy_key.enc b/.travis/secrets/deploy_key.enc
new file mode 100644
index 0000000..f237447
--- /dev/null
+++ b/.travis/secrets/deploy_key.enc
Binary files differ
diff --git a/ANNOUNCEMENT b/ANNOUNCEMENT
new file mode 100644
index 0000000..aaeaf6e
--- /dev/null
+++ b/ANNOUNCEMENT
@@ -0,0 +1,192 @@
+liblouis 3.11.0 has been released
+
+The liblouis developer team is proud to announce the liblouis release
+3.11.0. The release is available for download at:
+
+https://github.com/liblouis/liblouis/releases
+
+Introduction
+============
+
+Liblouis is an open-source braille translator and back-translator. It
+features support for computer, literary and math braille, supports
+contracted and uncontracted translation for many, many languages [1]_.
+It plays an important role in an open source accessibility stack and is
+used by screenreaders such as NVDA, Orca and JAWS. A companion project
+liblouisutdml [2]_ deals with formatting of braille.
+
+Noteworthy changes in this release
+==================================
+
+A tremendous amount of work by Dave Mielke and Bert Frees has gone into
+this release. They have improved liblouis for use on note taker devices,
+for backwards translation and a number of languages. Many other
+contributors (listed below) have also helped in fixing bugs and
+improving braille tables, such as Dutch, Mongolian, Polish, Ancient
+Greek, Danish, Irish, Chinese, and American Braille Computer Code.
+
+For a detailed list of all the changes refer to the list of closed
+issues [3]_.
+
+New features
+------------
+
+- Enable ``always`` rules with a single character and a single braille
+ cell for back-translation. Thanks to Bue Vester-Andersen.
+- Implement ``noUndefined`` mode for forward translation, thanks to
+ Dave Mielke.
+- Use fallback braille representations (NABCC) for rendering undefined
+ characters in hexadecimal notation, thanks to Dave Mielke.
+- Always render undefined characters, also ASCII characters, in
+ hexadecimal notation.
+- Add a new metadata field ``index-name`` for selecting a table from a
+ list fast and efficiently. It has the most important information
+ first and no redundant information. It should look nice when sorted.
+ This in contrast to the existing ``display-name`` field which is for
+ describing a table accurately and should sound good. Thanks to Dave
+ Mielke and Bert Frees.
+
+Bug fixes
+---------
+
+- Don't let a caps passage end on a word with no letters. Thanks to
+ Bert Frees.
+- Handle word resets in the last word of an caps or emphasis passage if
+ the end indicator was placed before the word. Thanks to Bert Frees.
+- Never convert to lowercase if ``capsletter`` is not defined. Thanks
+ to Bert Frees.
+- Fix position mapping for back-translation when ``noUndefined`` mode
+ is active. Thanks to Dave Mielke.
+- Fix bug where a translation would hang on words that match both a
+ ``nocont`` and a ``repeated`` rule. Thanks to Dave Mielke.
+- Fix bug where the effect of ``capsnocont`` would leak to the next
+ word if that word starts with a capital. Thanks to Bue
+ Vester-Andersen.
+
+Braille table improvements
+--------------------------
+
+- Fix an issue with ordinal numbers inside caps passages in Dutch
+ braille. Thanks to Bert Frees.
+- Improved back-translation for Mongolian thanks to Angaragerdene.
+- Fixes to Polish grade 1 and Polish computer braille thanks to Łukasz
+ Golonka.
+- Improvements to Ancient Greek braille, which has been renamed
+ "Greek international braille". A version with composed
+ accents is made available as a .uti table. Thanks to Dave Mielke and
+ Μαρια Γεωργακαράκου (Maria Georgakarakou).
+- Various improvements to modern Greek thanks to Dave Mielke.
+- Improvements and fixes to Spanish contracted braille. Details in
+ #741. Thanks to Juan Pablo Bello.
+- Improvements and fixes to the Danish tables. Thanks to Bue
+ Vester-Andersen.
+- Add a display table to match Word CX which is used in Norway and
+ Sweden, and maybe also in other countries thanks to Lars Bjørndal.
+- Fix handling of colon within number in Dutch braille, thanks to Jake
+ Kyle.
+- Fix translation of bullet and dot operators in Dutch braille, thanks
+ to Paul Rambags
+- Added North American Braille Computer Code table (``en-nabcc.utb``)
+ which is the counterpart of the ``text_nabcc.dis`` display table.
+ Thanks to Dave Mielke.
+- Add support for the International Phonetic Alphabet (IPA) to the
+ Chinese bopomofo braille table, thanks to Hurt Huang and Sponge Jhan.
+ Various improvements, including dot patterns and test cases, to the
+ Chinese bopomofo braille table, thanks to Sponge Jhan.
+- Unified English Braille no longer displays a single underscore when
+ multiple underscores are in the text, thanks to André-Abush Clause.
+- Update to Afrikaans uncontracted braille and new table for contracted
+ braille. Thanks to Christo de Klerk and Greg Kearney.
+- Update Irish braille (contracted and uncontracted) to the May 2019
+ version of the specification, thanks to Ronan McGuirk
+
+Other changes
+-------------
+
+- The python wrapper now encodes and decodes strings to/from UTF-16 and
+ UTF-32 using the surrogatepass error handler. This ensures that
+ single UTF-16 surrogate characters are processed correctly by the
+ wrapper and don't raise an encoding/decoding error. Thanks to Leonard
+ de Ruijter.
+- Metadata keys and values are now case insensitive, thanks to Dave
+ Mielke.
+- Remove ``unicodedefs.cti``. It was obsolete and never meant to be
+ included by any tables. Instead use the online references as
+ mentioned in the documentation now. See also #696.
+- ``lou_checkyaml`` test reporting has been improved, thanks to Bert
+ Frees. For example it now has a ``--verbose`` option so that printing
+ of expected failures can be enabled.
+- Hyphenation tables have been removed from tables except those needed
+ for ``nocross`` rules, thanks to Bert Frees.
+
+ The idea is that the caller (for example ``odt2braille`` or
+ ``liblouisutdml``) should be able to decide for themselves which
+ hyphenation table to use. The case in which a table contains nocross
+ rules is an exception. In this case the hyphenation patterns are a
+ real part of the table. Because it is not recommended to append an
+ own hyphenation table in this case, a ``#-has-nocross`` metadata
+ field was added to indicate that a table contains nocross rules.
+- ``lou_hyphenate`` can now handle more than just words (sequences of
+ letters), e.g compound words, thanks to Bert Frees.
+
+Deprecation notice
+------------------
+
+- The ``noUndefinedDots`` mode has been renamed to ``noUndefined``. For
+ backwards compatibility ``noUndefinedDots`` is still available in the
+ header file and in the Python bindings, as an alias for
+ ``noUndefined``.
+
+Backwards incompatible changes
+------------------------------
+
+None
+
+Invisible changes
+-----------------
+
+- Internally separate more clearly the display and translation phases.
+
+New, renamed or removed tables
+------------------------------
+
+New
+~~~
+
+- grc-international-common.uti
+- grc-international-composed.uti
+- grc-international-decomposed.uti
+- en-nabcc.utb
+
+Renamed
+~~~~~~~
+
+- gr-bb.ctb -> grc-international-en.utb
+
+Removed
+~~~~~~~
+
+- unicodedefs.cti
+- fi-fi.ctb
+
+Next release
+============
+
+The next release will be published on December 2 2019 so please keep up
+the excellent work and keep those improvements coming.
+
+Share and Enjoy!
+
+– Christian Egli, on behalf of the liblouis developers
+
+Footnotes
+=========
+
+.. [1]
+ https://github.com/liblouis/liblouis/tree/master/tables
+
+.. [2]
+ https://github.com/liblouis/liblouisutdml
+
+.. [3]
+ https://github.com/liblouis/liblouis/milestone/21?closed=1
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..302de78
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,219 @@
+MAIN AUTHOR
+
+ John J. Boyer <john.boyer@abilitiessoft.org> from Abilitiessoft, Inc.
+ - is the founder, creator and original author of the liblouis
+ project(s)
+ - has put his heart and soul into liblouis
+ - has written the bulk of the code
+ - maintainer emeritus
+
+CODE CONTRIBUTORS
+
+A team of three developers has taken over maintenance work since John
+Boyer did a step back in 2014:
+
+ Christian Egli <christian.egli@sbs.ch> from SBS <www.sbs.ch>
+ - maintains the build and version control systems and does releases
+ on a regular basis
+ - has done code contributions
+ - is one of the project maintainers
+
+ Mesar Hameed <mesar.hameed@gmail.com>
+ - has done code contributions
+ - has done a lot of table maintenance
+ - was the main developer of the test harness
+ - is one of the project maintainers
+
+ Bert Frees <bertfrees@gmail.com> for DocArch <www.docarch.be> and SBS <www.sbs.ch>
+ - has done code contributions
+ - has done table contributions as well
+ - is one of the project maintainers
+
+Considerable coding was done by:
+
+ Bue Vester-Andersen <bue@vester-andersen.dk>
+ Dave Mielke <dave@mielke.cc>
+ Davy Kager <mail@davykager.nl>
+ Eitan Isaacson <eitan@ascender.com>
+ James Teh <jamie@jantrid.net>
+ Michael Curran <mick@kulgan.net>
+ Michael Whapples <mwhapples@aim.com>
+ Mike Gray <mgray@aph.org>
+ Reiner Dolp <hallo@reinerdolp.com>
+
+Patches were provided by:
+
+ Arend Arends <arend.arends@hccnet.nl>
+ Chris Brannon
+ Jeremy Roman <jbroman@google.com>
+ Ken Perry <kperry@aph.org>
+ Martin Michlmayr <tbm@cyrius.com>
+ Matt Wenn
+ Mike Gorse
+ Milan Zamazal <pdm@brailcom.org>
+ Peter Nilsson Lundblad <plundblad@google.com>
+ Simon Aittamaa, Index Braille <simon.aittamaa@indexbraille.com>
+ Timothy Lee <timothy.ty.lee@gmail.com>
+ Victor Montalvão vicmont@microsoft.com
+ Vincent Untz <vuntz@gnome.org>
+ Volker Bijewitz <v.bijewitz@baum.de>
+
+BRLTTY AUTHORS
+
+Liblouis was derived from the Linux screen reader BRLTTY. Because it
+is rather difficult to trace back exactly which parts of BRLTTY ended
+up in liblouis we just list all BRLTTY contributors here (see also
+brltty.com/contact.html).
+
+The team:
+
+ Dave Mielke <dave@mielke.cc>
+ Nicolas Pitre <nico@fluxnic.net>
+ Stéphane Doyon <s.doyon@videotron.ca>
+
+Other contributors:
+
+ Andreas Gross <andi@andi-bika.de>
+ August Hörandl <hoerandl@elina.htlw1.ac.at>
+ Brailcom o.p.s. <technik@brailcom.cz>
+ Christian Comaschi <christian_comaschi@libero.it>
+ Coscell Kao <coscell@mail.batol.net>
+ James Bowden
+ John Boyer <director@chpi.org>
+ Jos Lemmens <jlemmens@inter.nl.net>
+ Mario Lang <mlang@delysid.org>
+ Nikhil Nair <nn201@cus.cam.ac.uk>
+ Oscar Fernandez <ofa@once.es>
+ Per Lejontand <pele@acc.umu.se>
+ Samuel Thibault <samuel.thibault@labri.fr>
+ Sébastien Hinderer <sebastien.hinderer@libertysurf.fr>
+ Stephane Dalton <sdalton@videotron.ca>
+ Wolfgang Astleitner <wolfgang.astleitner@liwest.at>
+ Yannick Plassiard <Yannick.Plassiard@free.fr>
+
+TABLE AND TEST CONTRIBUTORS
+
+ Aaron Cannon <cannona@fireantproductions.com>
+ Abdolamir Banisaeid <saedjan@gmail.com>
+ Adi Kushnir <adikushnir@gmail.com>
+ Alex Ho
+ Ammar Usama <ammar.usama@nlb.no>
+ André-Abush Clause <dev@andreabc.net>
+ Anthony Tibbs
+ Artis Raugulis
+ Ashoka Bandula Weerawardhana
+ Birkir Gunnarsson <birkir@midstod.is>
+ Brailcom, o.p.s. <technik@brailcom.cz>
+ Branislav Mamojka <mamojka@unss.sk>
+ Bue Vester-Andersen <bue@vester-andersen.dk>
+ Bo-Cheng Jhan <school510587@yahoo.com.tw>
+ Carles Sadurní Anguita <www.transcriptor.net>
+ Carlos Ferreira <cferreira9886@gmail.com>
+ Caterina Avoledo <catery81@yahoo.it>
+ Chennai Shankar <brailleacl@gmail.com> from Braille Section Team, Anna Centenary Library
+ Christian Waldvogel <christian.waldvogel@sbszh.ch> from SBS <www.sbs.ch>
+ Coscell Kao <coscell@molerat.net>
+ Danko Butorac <danko@ipsis.hr>
+ Dave Mielke <dave@mielke.cc>
+ David Hole
+ David Reynolds <dkreynolds@ntlworld.com>
+ Dinakar T.D. <td.dinkar@gmail.com>
+ Dinesh Kaushal<dineshkaushal@hotmail.com>
+ Dipendra Manocha <d@saksham.org>
+ Erez Kugler <erez@gaash.com> from TSR GAASH <www.tsr-gaash.co.il>
+ Eric Yip
+ Frédéric Schwebel
+ Gatis Grintals
+ Greg Kearney <gkearney@gmail.com>
+ Halim Sahin <halim.sahin@web.de>
+ Hammer Attila <hammera@pickup.hu>, <hammer.attila@infoalap.hu> from IT Foundation for the Visually Impaired in Hungary
+ Hans Schou <chlor@schou.dk>
+ Harri Pasanen <harri@mpaja.com>
+ Henri Apperloo <h.apperloo@cbb.nl> from CBB <www.cbb.nl>
+ Him Prasad Gautam
+ Hurt Huang <hurt.nzsmr@gmail.com>
+ Igor B. Poretsky <poretsky@mlbox.ru>
+ Ikrami Ahmad <ikrami.ahmad@gmail.com>
+ International league of Blind Esperantists (LIBE) <libe.narzan.com>
+ Jake Kyle from Compass Braille <jake@compassbraille.org>
+ James Datray from Freedom Scientific
+ James Bowden <james.bowden@rnib.org.uk> from Royal National Institute of Blind People (RNIB)
+ Jan Halousek <merit@login.cz> from MERIT
+ Jan Hegr <hegrjan@gmail.com>
+ Joseph Lee <joseph.lee22590@gmail.com>
+ Jostein Austvik Jacobsen <josteinaj@gmail.com>
+ José Enrique Fernández del Campo <jefdelcampo@gmail.com>
+ Jožef Gregorc <jozko.gregorc@gmail.com>
+ Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+ Juan Pablo Bello <juanpisjaws@gmail.com>
+ Jukka Eerikäinen <jukka.eerikainen@celia.fi> from Celia <www.celia.fi>
+ Jürgen Dengo <jyrgen.dengo@gmail.com>
+ KM Yuen
+ Kaifang Bao baokaifang@gmail.com from RejoinTech
+ Karol Pecyna <HarpoDeveloper@gmail.com> from Harpo <http://int.harpo.com.pl>
+ Keny Yuen
+ Kevin Derome
+ Knut Arne Bjørndal <bob+liblouis@cakebox.net>
+ Lars Bjørndal <lars@handytech.no>, <lars@lamasti.net>
+ Luis Lorente Barajas (ONCE-CIDAT)
+ Leon Ungier <Leon.Ungier@ViewPlus.com> from ViewPlus Technologies, Inc. <www.viewplus.com>
+ Leona Holloway <Leona.Holloway@visionaustralia.org> from Vision Australia
+ Leonard de Ruijter from Babbage B.V. <www.babbage.com>
+ Ludovic Oger <oger.ludovic@gmail.com>
+ Łukasz Golonka <wulfryk1@gmail.com>
+ Mateja Jenčič
+ Michel Such <michel.such@free.fr>
+ Mike Sivill <mike.sivill@viewplustechnologies.com> from ViewPlus Technologies, Inc.
+ Mohammed R. Ramadan <mramadan@nattiq.com>
+ Mohammadreza Rashad <mohammadreza5712@gmail.com>
+ Monk Jeremiah from Visoki Dečani <visokidecani@gmail.com>
+ Neil Soiffer <NeilS@dessci.com>
+ Nicolas Pitre <nico@cam.org>
+ Nicolai Svendsen <chojiro1990@gmail.com>
+ Patrick Zajda
+ Paul Rambags <paulrambags@dedicon.nl>
+ Paul Wood <paulw.torchtrust@gmail.com>
+ Peter Engström <peter.engstrom@indexbraille.com> from Index Braille
+ Peter Vágner <pvdeejay@gmail.com>
+ Rimas Kudelis <rq@akl.lt>
+ Ronan McGuirk <ronan.p.mcguirk@gmail.com>
+ Roshanson <736781877@qq.com>
+ Rui Batista <ruiandrebatista@gmail.com>
+ Rui Fontes <rui.fontes@tiflotecnia.com>
+ Rumiana Kamenska <rkamenska@gmail.com>
+ Samuel Thibault <samuel.thibault@ens-lyon.org>
+ Sébastien Sablé <sable@users.sourceforge.net>
+ Sergiy Moskalets (www.trosti.com.ua)
+ Simone Dal Maso <simone.dalmaso@juvox.it>
+ Sreeja Parameswaran <sreeja.param@gmail.com>
+ Stefan Moisei <vortex37@gmail.com>
+ Sukil Etxenike <sukiletxe@yahoo.es>
+ Sunian Loomee <ghito@qq.com>
+ Tamru E. Belay <tamru@sympatico.ca>, <g.braille@sympatico.ca> from Adaptive Technology Center for the Blind (ATCB)
+ Timothy Wynn
+ Tom Johnston <Tom.Johnston@accessibilityconsulting.co.uk>
+ Tsengel Maidar tsengel@digitalsunngo.org
+ Uğur Gürbüz <ugur.gurbuz@brailleteknik.com>
+ Yuemei Sun from ViewPlus Technologies, Inc.
+ Zlatko Sobočan <zlatko.sobocan@tifloglobus.hr>
+ Zvonimir Stanecic <zvonimirek222@yandex.com>
+ <Aliminator83@gmail.com>
+ <eric@integra-belgium.com>
+
+LIBHNJ AUTHORS
+
+Code was borrowed from the hyphenation library Libhnj.
+
+ Raph Levien <raph@acm.org>
+
+Hyphenation dictionaries were copied from OpenOffice.org.
+
+OTHER CONTRIBUTORS
+
+These are contributions not in the form of code or tables.
+
+ John Gardner <john.gardner@viewplus.com> from ViewPlus Technologies, Inc. <www.viewplus.com>
+
+Unknown contribution:
+
+ Alastair Irving
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/COPYING.LESSER b/COPYING.LESSER
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/COPYING.LESSER
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..31e92e1
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1654 @@
+2014-03-21 Lars Bjørndal <lars@lamasti.net>
+
+ * tables/no-no-g0.utb:
+ * tables/hyph_nn_NO.dic:
+ * tables/hyph_nb_NO.dic: Add hyphenation tables from the hyphen-nb
+ and hyphen-nn packages version 2.1.
+
+2014-01-06 Peter Nilsson Lundblad <plundblad@google.com>
+
+ * liblouis/wrappers.c: Two unused variables that I just removed.
+
+ * liblouis/lou_translateString.c: Changed two variables of type
+ typeforms to int since they're used as bitfields.
+ * liblouis/compileTranslationTable.c (parseChars): The loop
+ counter in the utf8 decoding couldn't go below 0, but the compiler
+ couldn't prove that. I think the change from >= to > in the
+ termination condition is correct since the byte has to be >= 0x80
+ in this case so the finial iteration isn't necessary (if it would
+ be, the compiler would be right and we'd actually have an array
+ out of bounds).
+
+2013-07-19 Patrick Zajda <patrick@zajda.fr>
+
+ * tables/fr-bfu-comp8.utb: corrections.
+
+2013-06-21 Christian Egli <christian.egli@sbs.ch>
+
+ * configure.ac: Update release number
+
+2013-06-10 Joseph Lee <joseph.lee22590@gmail.com>
+
+ * tables/en-ueb-g1.ctb:
+ * tables/en-ueb-chardefs.uti: latest additions to Unified English
+ Braille.
+
+2013-06-06 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Makefile.am (table_files):
+ * liblouis/compileTranslationTable.c (doLang2table):
+ (compileTranslationTable): Remove the lang2table feature. It was
+ never used, undocumented and contains an out-of-bounds access bug.
+ See also
+ http://www.freelists.org/post/liblouis-liblouisxml/PATCH-FW-Outofbounds-access-in-doLang2Table
+
+2013-06-03 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/hash_collision.c:
+ * tests/Makefile.am (XFAIL_TESTS): Mark the hash_collision test as
+ a known failure.
+
+ * liblouis/compileTranslationTable.c (allocateSpaceInTable): When
+ the table needs more space it is reallocated. Unfortunately not
+ all references to the table (such as the tableChain) are updated.
+ This is now fixed.
+
+ * tests/tables/large.ctb:
+ * tests/tables/Makefile.am:
+ * HACKING: Added a new section about profiling and some test table
+ that can be used for profiling.
+
+2013-05-28 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/hash_collision.c:
+ * tests/tables/empty.ctb:
+ * tests/tables/Makefile.am:
+ * tests/Makefile.am: Add a new test to benchmark the hash
+ algorithm.
+
+2013-01-28 Igor B. Poretsky <poretsky@mlbox.ru>
+
+ * tables/ru-litbrl.ctb:
+ * tables/ru-letters.dis:
+ * tables/ru-compbrl.ctb:
+ * tables/ru-chardefs.cti:
+ * tables/Makefile.am (table_files): Add new russian tables.
+
+ * tables/hyph_ru.dic: Added russian hyphenation dictionary.
+
+ * tables/it-it-comp6.utb: A little fix for Italian table.
+
+2013-01-28 Knut Arne Bjørndal <bob+liblouis@cakebox.net>
+
+ * tables/no-no-g0.utb: Fixes for Emphasis marks in the norwegian
+ braille table.
+
+2013-01-25 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/no-no-g0.utb: Corrections for double angle quotation
+ mark. Thanks to Knut Arne Bjørndal <bob+liblouis@cakebox.net> for
+ the patch.
+
+2013-01-24 Christian Egli <christian.egli@sbs.ch>
+
+ * tools/lou_trace.c: Fix warnings and run through indent.
+
+2013-01-24 David Reynolds <dkreynolds@ntlworld.com>
+
+ * tables/en-gb-comp8.ctb: Add the British pound sign.
+
+2013-01-21 David Reynolds <dkreynolds@ntlworld.com>
+
+ * tables/en-gb-comp8.ctb: Added a table for U.K. English 8 dot
+ Computer braille.
+
+2013-01-21 Joseph Lee <joseph.lee22590@gmail.com>
+
+ * tables/en-ueb-g2.ctb: Improvements based on Leona's requested
+ changes.
+
+2013-01-17 Joseph Lee <joseph.lee22590@gmail.com>
+
+ * tables/en-ueb-g2.ctb: Changed some entries thanks to the
+ document that Leona provided.
+
+2013-01-11 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/Makefile.am:
+ * gnulib/Makefile.am:
+ * configure.ac:
+ * HACKING: Use the malloc and realloc modules from gnulib to
+ enable cross compilation to windows using mingw.
+
+2013-01-09 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/ko.ctb: Fixes for the Korean tables by Joseph Lee.
+
+2013-01-04 Christian Egli <christian.egli@sbs.ch>
+
+ * gnulib/sys/*.h:
+ * gnulib/m4/*.m4
+ * gnulib/*.h:
+ * gnulib/*.c:
+ * gnulib/Makefile.am:
+ * build-aux/snippet/*.h: Upgrade to gnulib v0.0-7794-g964bbc2
+
+ * tables/en-ueb-g2.ctb: excludes entries that are not needed,
+ thanks to Joseph Lee.
+
+ * tables/Makefile.am (table_files):
+ * tables/ko.ctb:
+ * tables/ko-g2.ctb:
+ * tables/ko-g1.ctb: Added Korean tables by Joseph Lee.
+
+ * tests/check_all_tables.pl: Ignore zip files.
+
+2012-12-21 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/check_all_tables.pl: Exclude backup, patch, diff and txt
+ files from the table tests.
+
+2012-12-20 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Makefile.am (table_files):
+ * tables/ru-ru-comp8: Remove ru-ru-comp8 table as it fails and is
+ a duplicate of ru.ctb
+
+ * tests/check_all_tables.pl: Check all files by default and
+ exclude only known exceptions, e.g. Makefiles, shell scripts, etc.
+
+2012-12-19 Christian Egli <christian.egli@sbs.ch>
+
+ * gnulib/m4/unistd_h.m4:
+ * gnulib/m4/gnulib-comp.m4:
+ * gnulib/m4/extern-inline.m4:
+ * gnulib/unistd.in.h:
+ * gnulib/unistd.c:
+ * gnulib/Makefile.am (libgnu_la_SOURCES):
+ * build-aux/snippet/warn-on-use.h: Upgrade to newest gnulib
+
+ * tests/brl_checks.c (convert_typeform): Make it compile under
+ C89.
+
+ * tools/lou_translate.c (print_help):
+ * tools/lou_trace.c (print_help):
+ * tools/lou_debug.c (print_help):
+ * tools/lou_checktable.c (print_help):
+ * tools/lou_checkhyphens.c (print_help):
+ * tools/lou_allround.c (print_help): Update the usage message to
+ show that more than one table can be specified.
+
+2012-12-18 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/tables/Makefile.am (EXTRA_DIST): Add all test tables.
+
+2012-12-17 Christian Egli <christian.egli@sbs.ch>
+
+ * NEWS: Added all new features to the NEWS entry for this release.
+
+ * doc/liblouis.texi: Add documentation for the lou_trace program.
+
+ * tools/lou_trace.c: Add copyright information.
+ (print_script): Fixes to the printing of context rules.
+
+ * liblouis/lou_translateString.c (checkMultCaps):
+ (noCompbrlAhead): Fix the valgrind warnings properly without
+ adding a regression.
+ (translateString): Make sure appliedRules are also updated for the
+ context opcode.
+
+2012-12-17 Hammer Attila <hammera@pickup.hu>
+
+ * tests/harnessSources/hu-hu-g1_harness_source.txt:
+ * tests/harnessSources/hu-hu-g1-hyph_harness_source.txt:
+ * tests/harness/hu-hu-g1_harness.txt:
+ * tests/harness/hu-hu-g1-hyph_harness.txt:
+ * tables/hu-exceptionwords.cti: Bug fix and tests for the
+ Hungarian grade 1 table.
+
+2012-12-14 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/typeform.c: Added a comment about the purpose of this
+ file, as it isn't really a test
+
+ * tests/brl_checks.h:
+ * tests/brl_checks.c (convert_typeform): Add the new function to
+ the header file.
+
+2012-12-13 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/typeform.c:
+ * tests/en_gb_g1_italics.c:
+ * tests/brl_checks.c:
+ * liblouis/compileTranslationTable.c: Fix compiler warnings, like
+ unused variables, macro redefinition, comparison between signed
+ and unsigned integer expressions, etc.
+
+ * configure.ac:
+ * NEWS: Update for release 2.5.2
+
+2012-12-13 Paul Wood <paulw.torchtrust@gmail.com>
+
+ * tables/en-GB-g2.ctb: Fix a regression with the 'com'
+ contraction.
+
+2012-12-10 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/ukchardefs.cti: Fixes provided by Paul Paul Wood.
+
+2012-12-07 Paul Wood <paulw.torchtrust@gmail.com>
+
+ * tables/en-GB-g2.ctb: Corrections to the g2 table.
+
+2012-12-06 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/ko.ctb:
+ * tables/Makefile.am (table_files): Add a table for Korean
+ provided by Joseph Lee <joseph.lee22590@gmail.com>
+
+2012-12-04 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/Makefile.am (AM_ETAGSFLAGS): The langmap option only
+ works if you use ctags. Newer versions of etags (i.e. emacs 24 and
+ up) seem to generate proper TAGS files even for *.ci files, so
+ this option can be removed.
+
+2012-12-03 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/lou_translateString.c (lou_dotsToChar): Fix some
+ valgrind warnings about invalid reads, i.e. do some array bound
+ checking.
+
+2012-12-03 Joseph Lee <joseph.lee22590@gmail.com>
+
+ * tables/Makefile.am (table_files):
+ * tables/en-ueb-g1.ctb:
+ * tables/en-ueb-g2.ctb: Added ueb tables
+
+2012-10-02 Christian Egli <christian.egli@sbs.ch>
+
+ * gnulib: Update gnulib
+
+2012-09-21 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/it-it-comp8.utb: More fixes to the italian table. Thanks
+ to Simone Dal Maso <simone.dalmaso@juvox.it>
+
+2012-09-06 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am (check_PROGRAMS):
+ * tests/brl_checks.c:
+ * tests/brl_checks.h:
+ * tests/pass1Only.c: Added a test case for the reported memory
+ problem with pass1Only.
+
+2012-09-05 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/runHarness.py (test_allCases): Add some code to enable the
+ harness to return the result of the tests. Disable it for now as
+ there are still some tables that fail that we cannot fix before
+ release.
+
+ * tables/de-de-comp8.ctb: Added more unicode definitions. Thanks
+ to Aliminator83@gmail.com.
+
+2012-09-04 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/check_all_tables.pl:
+ * tests/check_endless_loop.pl:
+ * tests/multiple_table_path.pl: When doing VPATH builds (such as
+ in `make distcheck`) the binary for lou_checktable is not found.
+ Just use a relative path to find it.
+
+2012-07-10 Christian Egli <christian.egli@sbs.ch>
+
+ * doc/liblouis.texi (How to Write Translation Tables): Document
+ the fact that translation tables can now be in UTF-8.
+ (Top): Document the doctests.
+ (How to Write Translation Tables): Add some minimal documentation
+ about the doctests
+
+2012-06-28 Christian Egli <christian.egli@sbs.ch>
+
+ * doc/liblouis.texi (Miscellaneous Opcodes): Enhance the
+ documentation on the display opcode
+
+2012-06-14 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/lou_translateString.c (hyphenate): Fix a buffer overrun.
+
+2012-06-07 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/compileTranslationTable.c (compilePassOpcode): Increase
+ the number of chars matched in a $a. expression from 32 to 0xffff.
+
+ * doc/liblouis.texi (The Context and Multipass Opcodes): Document
+ the fact that context $a. matches are limited to 0xffff
+
+ * python/louis/__init__.py.in (hyphenate): Now that we know that
+ hyphens array should be inlen+1 adapt the Python bindings
+ accordingly.
+
+ * doc/liblouis.texi (lou_hyphenate): Fix a documentation bug with
+ lou_hyphenate. The length of the hyphens array should be inlen+1.
+
+ * tests/Makefile.am (check_PROGRAMS):
+ * tests/brl_checks.c (check_hyphenation):
+ * tests/brl_checks.h:
+ * tests/hyphenate.c (main): Add a test program hyphenation.
+
+2012-06-01 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am:
+ * tests/repeated.c:
+ * tests/squash_space.c:
+ * tests/tables/Makefile.am:
+ * tests/tables/repeated.utb:
+ * tests/tables/repeated_with_correct.utb:
+ * tests/tables/squash_space_with_context_1.utb:
+ * tests/tables/squash_space_with_context_2.utb:
+ * tests/tables/squash_space_with_correct.utb:
+ * tests/tables/squash_space_with_repeated.utb: More tests for
+ squashing white space. It looks like I found some bugs after all.
+
+ * tests/brl_checks.c (check_translation): Also print the input
+ string and delimit the strings with single quotes to better see
+ white space.
+
+ * TODO: Added a TODO file to note things that could/should be
+ done.
+
+ * tables/de-de-comp8.ctb: Add Symbols such as double quotes,
+ dashes to the German computer braille table. Thanks to
+ Aliminator83@gmail.com
+
+2012-05-31 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am:
+ * tests/repeated.c:
+ * tests/tables/Makefile.am:
+ * tests/tables/repeated.utb:
+ * tests/tables/repeated_with_correct.utb: Added a test for the
+ repeated opcode. Rumors had it that it was buggy, but it does what
+ it is supposed to.
+
+ * doc/liblouis.texi (The correct Opcode): Remove the comment about
+ input and output positions being incorrect. This bug has been fixed.
+
+2012-05-30 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/tables/letterDefTest_uppercase.ctb:
+ * tests/tables/letterDefTest_uplow.ctb:
+ * tests/tables/letterDefTest_lowercase.ctb:
+ * tests/tables/letterDefTest_letter.ctb:
+ * tests/letterDefTest.c (main): Convert the test so that it
+ returns the result of the test. Also use the \xhhhh notation for
+ unicode so that it works with the c based test framework.
+
+2012-05-11 Christian Egli <christian.egli@sbs.ch>
+
+ * liblouis/compileTranslationTable.c (doLang2table): Remove an
+ unused variable that was reported by -Wall
+ (getALine): Properly initialize a variable. This issue was
+ reported by Valgrind.
+
+2012-05-07 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/brl_checks.c (check_translation): Enhance to be able to
+ handle \xhhhh encoded strings like the rest of liblouis. This is
+ to support unicode based test cases.
+
+ * tests/uplow_with_unicode.c:
+ * tests/tables/uplow_with_unicode.ctb:
+ * tests/tables/lowercase_with_unicode.ctb:
+ * tests/Makefile.am (uplow_with_unicode_SOURCES): Add a test for
+ the problem with lowercase and unicode.
+
+2012-04-20 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/nl-BE.dis:
+ * tables/Makefile.am (table_files):
+ * tests/doctests/Makefile.am:
+ * tests/doctests/nl-BE-g1.ctb_test.txt: Added a doctest for the
+ dutch tables
+
+2012-04-18 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/pass2_outpos.c:
+ * tests/pass2_inpos.c: Rename test to reflect what it really
+ tests.
+
+ * tests/Makefile.am:
+ * tests/brl_checks.h:
+ * tests/brl_checks.c (check_inpos):
+ * tests/inpos_compbrl.c: Rename check_outpos to check_inpos to
+ reflect the true intention of the function.
+
+2012-04-17 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/doctests/en-GB-g2.ctb_test.txt:
+ * tests/check_doctests.py (TestHelper): Add a test helper to
+ simplify the writing of doctests.
+
+ * tests/tables/moreTables/include.utb:
+ * tests/Makefile.am (TESTS_ENVIRONMENT):
+ * tests/multiple_table_path.pl: Added some tests for the improved
+ LOUIS_TABLEPATH functionality.
+
+2012-04-13 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am:
+ * tests/tables/pass2.ctb:
+ * tests/pass2_outpos.c: Add a test for the problem with pass2 and outpos.
+
+ * tests/brl_checks.h:
+ * tests/brl_checks.c (check_outpos):
+ * tests/inpos_compbrl.c (main): Enhance so that output position
+ can be checked for different tables.
+
+2012-03-23 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/tables/pass2.ctb:
+ * tests/tables/Makefile.am:
+ * tests/pass2.c:
+ * tests/Makefile.am: Add a test to show the regression with the
+ pass2 opcode.
+
+ * tests/brl_checks.c (check_translation): Make the printing of
+ test results more robust (against out of bound errors).
+
+2012-03-21 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am (TESTS_ENVIRONMENT): Set the env variables so
+ that the libraries and executables from the source directories are
+ used instead of the installed ones.
+
+2012-03-20 Christian Egli <christian.egli@sbs.ch>
+
+ * configure.ac:
+ * tests/Makefile.am: Only enable the Python based tests if
+ configured with ucs4.
+
+2012-03-02 Mesar Hameed <mesar.hameed@gmail.com>
+
+ * configure.ac:
+ * doc/liblouis.texi:
+ * tests/Makefile.am:
+ * tests/harness/Makefile.am:
+ * tests/harness/__init__.py:
+ * tests/harness/en-GB-g2_harness.py:
+ * tests/runHarness.py: Add a test harness, i.e. an infrastructure
+ to be able to do table tests in a simple and concise syntax.
+
+2012-03-01 Christian Egli <christian.egli@sbs.ch>
+
+ * configure.ac:
+ * python/louis/Makefile.am:
+ * tests/Makefile.am:
+ * tests/check_doctests.py:
+ * tests/doctests/Makefile.am:
+ * tests/doctests/en-GB-g2.ctb_test.txt: Check for Python in
+ configure and if there is a Python interpreter enable some Python
+ based doctests.
+
+
+2012-02-27 Mesar Hameed <mesar.hameed@gmail.com>
+
+ * python/louis/__init__.py.in: Expose the constants otherTrans and
+ ucBrl in the python bindings.
+
+2012-02-22 Christian Egli <christian.egli@sbs.ch>
+
+ * configure.ac: Update version number
+
+ * tables/ta-ta-g1.ctb: Added a new tamil table by Mesar Hameed
+ <mesar.hameed@gmail.com>
+
+ * tables/no-no.ctb: Additions to the Norwegian braille tables
+ thanks to David Hole.
+
+2012-02-21 Juan Carlos Buño Suárez <quetzatl@eresmas.net>
+
+ * tables/Es-Es-G0.utb: add support for the letter Ñ to the Spanish
+ table.
+
+2012-02-20 Birkir Gunnarsson <birkir@midstod.is>
+
+ * tables/is.ctb: Updates and additions to Icelandic 8-dot braille
+ table.
+
+2012-02-06 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Es-Es-G0.utb: Added Spanish grade0 table provided by José
+ Enrique Fernández del Campo and Juan Carlos Buño Suárez.
+
+2012-02-01 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/pt-pt-g1.utb: Added improvements to Portuguese table by
+ Rui Batista <ruiandrebatista@gmail.com>.
+
+ * tables/hyph_cs_CZ.dic:
+ * tables/Makefile.am (table_files): Added hyphenation table for
+ Czech provided by Jan Halousek
+
+2012-01-09 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/ar-ar-g1.utb: Added updates to Generic Arabic table by
+ Mesar Hameed <mesar.hameed@gmail.com>
+
+2011-08-19 Bert Frees <bertfrees@gmail.com>
+
+ * tables/cs-chardefs.cti:
+ * tables/cs-g1.ctb:
+ * tables/cs-translation.ctb: Improved translation tables for Czech
+ braille. Credit goes to Jan Halousek
+
+2011-08-08 Michel Such <michel.such@free.fr>
+
+ * tables/fr-bfu-comp8.utb:
+ * tables/fr-bfu-comp6.utb: Updated French tables.
+
+2011-06-28 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Makefile.am (table_files): Added the table provided by
+ Mesar Hameed to the build process.
+
+2011-06-28 Mesar Hameed <mesar.hameed@gmail.com>
+
+ * tables/ar-fa.utb: Added a table for Arabic Farsi.
+
+ * tables/ar-ar-g1.utb: Enhance the Generic Arabic Grade 1 table
+
+2011-06-24 Christian Egli <christian.egli@sbs.ch>
+
+ * windows/Makefile.nmake: Rename the Makefile to Makefile.nmake to
+ make sure it's not overwritten by autoconf
+
+ * windows/Makefile.am (SUBDIRS): Add the include sub dir
+
+2011-06-17 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/Makefile.am (en_gb_g1_italics_SOURCES):
+ * tests/en_gb_g1_italics.c (main): Add a test case for italics
+ with the en-gb-g1.utb table.
+
+2011-05-30 Stefan Moisei <vortex37@gmail.com>
+
+ * tables/ro.ctb: Updates to Romanian table.
+
+2011-05-25 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/brl_checks.c (check_translation): Print the outbuf using a
+ dedicated function. The normal printf with the %ls modifier
+ doesn't work as outbuf is not really of type wchar_t. Now the
+ received output is correctly printed in the test cases.
+
+2011-05-18 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/braille-patterns.cti: Fix a problem with the definition
+ of Unicode character U+2800. This issue was brought up on the list
+ by James Teh.
+
+2011-05-18 Michel Such <michel.such@free.fr>
+
+ * tables/fr-bfu-comp8.utb: Some fixes for french tables.
+
+2011-05-09 Christian Egli <christian.egli@sbs.ch>
+
+ * NEWS:
+ * configure.ac: Changed the version number.
+
+2011-05-03 Coscell Kao <coscell@molerat.net>
+
+ * tables/zh-tw.ctb: Update the Chinese braille table.
+
+2011-04-26 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/ar-ar-g1.utb (math): Integrate a patch by Mesar Hameed
+ <mesar.hameed@gmail.com>, some white space and encoding cleanup.
+
+2011-04-15 Peter Engström <peter.engstrom@indexbraille.com>
+
+ * tables/sr-chardefs.cti:
+ * tables/sr-g1.ctb:
+ * tables/sr-translation.ctb:
+ * tables/Makefile.am (table_files): Added braille tables for
+ Serbian
+
+ * tables/gez-chardefs.cti:
+ * tables/gez-g1.ctb:
+ * tables/gez-translation.ctb:
+ * tables/Makefile.am (table_files): Added braille tables for
+ Ethiopic
+
+ * tables/ckb-chardefs.cti:
+ * tables/ckb-g1.ctb:
+ * tables/ckb-translation.ctb:
+ * tables/Makefile.am (table_files): Added braille tables for
+ Sorani (Kurdish)
+
+2011-04-15 Bert Frees <bertfrees@gmail.com>
+
+ * tables/es-chardefs.cti:
+ * tables/es-g1.ctb:
+ * tables/es-translation.ctb:
+ * tables/Makefile.am (table_files): Improvements to the Spanish
+ Braille tables.
+
+ * tables/nl-BE-translation.ctb:
+ * tables/nl-BE-g1.ctb:
+ * tables/Makefile.am (table_files): Improvements to the Dutch
+ Braille tables.
+
+ * tables/braille-patterns.cti:
+ * tables/nl-BE-chardefs.cti:
+ * tables/wiskunde-chardefs.cti:
+ * tables/wiskunde-translation.ctb:
+ * tables/wiskunde.ctb:
+ * tables/Makefile.am (table_files): Improvements to the Flemish
+ Braille Math Code tables.
+
+2011-04-15 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/check_all_tables.pl: Make sure translation tables which
+ are just meant to be included such as *-translation.ctb are not
+ checked.
+
+2011-04-08 Coscell Kao <coscell@molerat.net>
+
+ * tables/zh-tw.ctb: Improvements to the Chinese braille table
+
+2011-03-30 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/multiple_table_path.pl: Make sure the test also run in a
+ VPATH build, i.e. in make distcheck.
+
+2011-03-28 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Makefile.am (table_files): Added a new swedish table
+ provided by Samuel Thibault.
+
+ * doc/liblouis.texi (Deprecated Opcodes): Added a section on
+ deprecated opcodes.
+
+2011-03-21 Christian Egli <christian.egli@sbs.ch>
+
+ * contrib/liblouis.spec: Removed spec file as it is now maintained
+ in Fedora.
+
+2011-03-03 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/it-it-g1.utb2: Added an updated italian 8 dot table
+ provided by Caterina Avoledo <catery81@yahoo.it>
+
+2010-12-16 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/check_all_tables: Removed
+
+ * tests/check_all_tables.pl: Port the check_all_tables shell
+ script to perl and add a timeout to handle the endless loop
+ problem when checking all the tables.
+
+2010-12-09 Bert Frees <bertfrees@gmail.com>
+
+ * tables/nl-BE.cti:
+ * tables/nl-BE-g1.ctb: modified the Dutch tables a bit, for
+ improved back-translation and hyphenation.
+
+2010-12-09 Lars Bjørndal <lars@lamasti.net>
+
+ * tables/no-no-g0.utb:
+ * tables/no-no-g1.utb:
+ * tables/no-no-g2.utb:
+ * tables/no-no-g3.utb: Added slightly modified versions of
+ Norwegian braille tables.
+
+2010-12-07 Christian Egli <christian.egli@sbs.ch>
+
+ * tests/tables/loop.ctb:
+ * tests/tables/Makefile.am:
+ * tests/check_endless_loop.pl:
+ * tests/Makefile.am:
+ * configure.ac: Add a new test case which exhibits an endless loop
+ in the table compiler if you configure with --enable-ucs4.
+
+ * tables/is-chardefs6.cti: Fix a problem with undefined dot
+ patterns.
+
+2010-12-07 Bert Frees <bertfrees@gmail.com>
+
+ * tables/wiskunde_edit.cti:
+ * tables/wiskunde.cti:
+ * tables/wiskunde.ctb:
+ * tables/nl-BE.cti:
+ * tables/nl-BE-g1.ctb: Added Dutch tables provided by Bert Frees
+
+2010-11-26 Christian Egli <christian.egli@sbs.ch>
+
+ * doc/liblouis.texi (Translation Opcodes): Fix typos and add an
+ example for the usage of joinnum.
+ (The Context and Multipass Opcodes): Added some clarification on
+ the workings of the multipass opcode that was posted to the
+ mailing list by Bert Frees.
+ (The Context and Multipass Opcodes): beautify the table
+ of characters that can be used for attribute strings.
+
+2010-11-18 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/is-chardefs8.cti: Add table for computer braille based on
+ the IceBraille standard, v1.0 by Birkir Gunnarsson,
+ birkir@midstod.is
+
+2010-11-12 Christian Egli <christian.egli@sbs.ch>
+
+ * tables/Makefile.am (table_files):
+ * tables/es-old.dis:
+ * tables/es-new.dis:
+ * tables/es-g1.ctb:
+ * tables/es-chardefs.cti:
+ * tables/ca-g1.ctb:
+ * tables/ca-chardefs.cti: Added Spanish tables made by Bert Frees
+ <bertfrees@gmail.com>.
+
+2010-09-27 Christian Egli <christian.egli@sbszh.ch>
+
+ * tables/Makefile.am (table_files): Integrate the new indian tables.
+ (table_files): Integrate the new Icelandic table.
+
+2010-09-27 Birkir Gunnarsson <birkir@midstod.is>
+
+ * tables/is-chardefs6.cti: Added support for Icelandic 6-dot.
+
+2010-09-27 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ * tables/as.ctb:
+ * tables/awa.ctb:
+ * tables/bengali.cti:
+ * tables/bh.ctb:
+ * tables/bn.ctb:
+ * tables/bra.ctb:
+ * tables/devanagari.cti:
+ * tables/dra.ctb:
+ * tables/gon.ctb:
+ * tables/gu.ctb:
+ * tables/gujarati.cti:
+ * tables/gurmukhi.cti:
+ * tables/hi.ctb:
+ * tables/kannada.cti:
+ * tables/kha.ctb:
+ * tables/kn.ctb:
+ * tables/kok.ctb:
+ * tables/kru.ctb:
+ * tables/malayalam.cti:
+ * tables/ml.ctb:
+ * tables/mni.ctb:
+ * tables/mr.ctb:
+ * tables/mun.ctb:
+ * tables/mwr.ctb:
+ * tables/ne.ctb:
+ * tables/new.ctb:
+ * tables/or.ctb:
+ * tables/oriya.cti:
+ * tables/pa.ctb:
+ * tables/pi.ctb:
+ * tables/sa.ctb:
+ * tables/sat.ctb:
+ * tables/sd.ctb:
+ * tables/ta.ctb:
+ * tables/tamil.cti:
+ * tables/te.ctb:
+ * tables/telugu.cti: Added quite a few indian tables.
+
+2010-08-27 Christian Egli <christian.egli@sbszh.ch>
+
+ * NEWS: Added NEWS entry for release 2.1.1
+
+2010-08-23 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/lastworditalafter.c (main): Handle two tests more elegantly.
+
+ * tests/brl_checks.c (check_translation): Make the testing code
+ robust against NULL values in the typeform parameter.
+
+ * tests/Makefile.am (check_PROGRAMS): Add lastworditalafter to
+ check_PROGRAMS.
+
+2010-08-23 James Teh <jamie@jantrid.net>
+
+ * NEWS: Small corrections. Also, include issue numbers with
+ their associated changes.
+
+2010-08-19 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am (XFAIL_TESTS): Move lastworditalafter to
+ XFAIL_TESTS as they currently fail
+
+ * NEWS: Added News items for release 1.9.0, 2.0.0 and 2.1.0
+
+2010-08-06 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: Fix the output cursorPos when the
+ compbrlAtCursor mode is enabled and the characters around the cursor
+ translate to multiple braille cells, such as in the Chinese braille
+ tables.
+
+2010-08-05 James Teh <jamie@jantrid.net>
+
+ * python/louis/__init__.py.in: Allow the user to configure the maximum
+ output length by specifying a number by which the input length is
+ multiplied using the outlenMultiplier module variable. The default will
+ handle the case where every input character is undefined in the
+ translation table. Previously, this was hard-coded to 2, which was
+ insufficient in some cases.
+ Rename tran_tables argument to tableList in all functions to be
+ consistent with liblouis itself.
+
+2010-08-04 James Teh <jamie@jantrid.net>
+
+ * python/louis/__init__.py.in: Corrections/clarifications to docstrings.
+ Add compbrlLeftCursor mode constant.
+ Add compileString function which wraps lou_compileString.
+
+2010-08-03 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: Fix the input/output position arrays
+ for characters in the input which are undefined in the translation
+ table.
+
+2010-07-21 James Teh <jamie@jantrid.net>
+
+ * python/setup.py: Remove unnecessary imports, allowing this to
+ run in Python 2.7. (issue 12)
+
+2010-04-15 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/brl_checks.h:
+ * tests/brl_checks.c (check_translation): Add a function for
+ checking a translation against an expected result.
+
+ * tests/lastworditalafter.c (main): Add a test for handling of
+ italics using an English and a German table
+
+ * tests/Makefile.am (lastworditalafter_SOURCES): Added the
+ lastworditalafter test to the check programs
+
+2010-02-12 Michael Whapples <mwhapples@aim.com>
+
+ * python/louis/__init__.py.in: Added python function louis.backTranslate
+ to wrap lou_backTranslate. Has same calling as louis.translate but again
+ with the slightly different meanings as described in liblouis
+ documentation for lou_backTranslate.
+ Also made some minor error corrections in docstrings.
+
+2010-02-12 Michael Whapples <mwhapples@aim.com>
+
+ * python/louis/__init__.py.in: Added louis.backTranslateString to wrap
+ lou_backTranslateString in python. Calling is similar to that for
+ louis.translateString. You should be aware of the possible different
+ use of typeform in lou_translateString and lou_backTranslateString.
+
+2010-02-11 Michael Whapples <mwhapples@aim.com>
+
+ * python/louis/__init__.py.in: Added support for python to recieve
+ typeform data back from louis.translate and louis.translateString.
+ For both of these the data will be placed in the typeform list handed
+ in to the function. If you don't want this to happen then don't
+ use a list (eg. use a tuple).
+
+2010-02-11 Michael Whapples <mwhapples@aim.com>
+
+ * python/louis/__init__.py.in: Added louis.hyphenate to allow access
+ from python to the lou_hyphenate function. Its definition is
+ def hyphenate(tran_tables, inbuf, mode=0)
+ Where tran_tables is a list like for the translate functions,
+ inbuf is the text or Braille to hyphenate and mode says if inbuf
+ is to be treated as text or Braille. It returns the hyphenation
+ data in a string.
+
+2010-02-04 James Teh <jamie@jantrid.net>
+
+ * python/louis/__init__.py.in: lou_translate* writes output information
+ in typeform, so allocate enough bytes for it. Fixes possible buffer
+ overruns and resultant crashes.
+
+2010-01-07 Christian Egli <christian.egli@sbszh.ch>
+
+ * liblouis/compileTranslationTable.c (compileError): Change the
+ format of table checking error messages to a format similar to the
+ one used in gcc.
+
+2009-11-30 Carlos Ferreira <cferreira9886@gmail.com>
+
+ * tables/Pt-Pt-g1.utb:
+ * tables/pt-pt-g2.ctb: Added tables for Portuguese grade 1 and 2.
+
+2009-11-30 Mike Sivill <mike.sivill@viewplus.com>
+
+ * tables/da-dk-g2.ctb: Added tables for Danish grade 2.
+
+2009-11-23 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Release 1.8.0: See NEWS for new features
+
+
+2009-11-20 Christian Waldvogel <christian.waldvogel@sbszh.ch>
+
+ * tables/de-ch-accents.cti:
+ * tables/de-ch-g0.utb:
+ * tables/de-ch-g1.ctb:
+ * tables/de-ch-g2.ctb:
+ * tables/de-chardefs6.cti:
+ * tables/de-chardefs8.cti:
+ * tables/de-de-accents.cti:
+ * tables/de-de-g0.utb:
+ * tables/de-de-g1.ctb:
+ * tables/de-de-g2.ctb:
+ * tables/de-eurobrl6.dis:
+ * tables/de-eurobrl6u.dis:
+ * tables/de-g0-core.utb:
+ * tables/de-g1-core.ctb:
+ * tables/de-g2-core.ctb:
+ * tests/check_all_tables: Added German grade 2 and Swiss German
+ grade 0, 1 and 2.
+
+2009-11-18 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis.texi (lou_checkhyphens): Document the --help and
+ --version options that all the tools support now. Also document
+ the lou_checkhyphens tool.
+
+2009-11-12 Christian Egli <christian.egli@sbszh.ch>
+
+ * liblouis/liblouis.h.in (widechar):
+ * liblouis/liblouis.h (widechar):
+ * configure.ac: No longer include config.h in liblouis.h. Instead
+ define the type of widechar in configure and generate liblouis.h
+ based on the options given to configure and liblouis.h.in.
+
+2009-11-05 Christian Egli <christian.egli@sbszh.ch>
+
+ * COPYING:
+ * COPYING.LIB:
+ * README: Explain that the library is licensed under LGPL and the
+ tools under GPL.
+
+ * HACKING: Mention the use of gnulib and explain how to update it.
+
+2009-11-02 Christian Egli <christian.egli@sbszh.ch>
+
+ * tables/Makefile.am (table_files):
+ * tables/sv-1996.ctb:
+ * tables/sv-1989.ctb: Added two more tables for Swedish that were
+ ported from brltty by Samuel Thibault.
+
+2009-10-16 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/table_test_corpuses/README:
+ * tests/table_test_corpuses/Makefile.am:
+ * tests/table_test_corpuses/test_de-de-g0.utb:
+ * tests/table_test_corpuses/test_en-us-g2.ctb:
+ * tests/check_tables_against_corpus.pl:
+ * tests/Makefile.am: Added a framework for corpus based table tests.
+
+2009-10-13 Christian Egli <christian.egli@sbszh.ch>
+
+ * man/Makefile.am: When generating the man pages at distribution
+ time you need to make sure that all the libraries and all the
+ tools are built. This makes the Makefile complex for no good
+ reason (since John doesn't have help2man anyway). So the man pages
+ are not distributed now. If a user wants man pages they have to
+ install help2man.
+
+2009-10-09 Christian Egli <christian.egli@sbszh.ch>
+
+ * Makefile.am:
+ * configure.ac:
+ * tools/lou_allround.c:
+ * tools/lou_checkhyphens.c:
+ * tools/lou_checktable.c:
+ * tools/lou_debug.c:
+ * tools/lou_translate.c: Integrate gnulib (modules getopt,
+ progname and version-etc) and use it to add --help and --version
+ options to all the tools. Due to an (apparent) restriction in
+ progname I also changed the config header to (standard) "config.h"
+ instead of "louiscfg.h".
+
+ * man/Makefile.am (man_MANS): Automatically generate man pages for
+ all the tools if help2man is installed.
+
+2009-10-08 Christian Egli <christian.egli@sbszh.ch>
+
+ * tools/lou_allround.c:
+ * tools/lou_checkhyphens.c:
+ * tools/lou_checktable.c:
+ * tools/lou_debug.c:
+ * tools/lou_translate.c: Change the license of the tools to GPL.
+
+2009-09-18 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am: Define the test scripts with check_SCRIPTS
+ and make sure they are distributed.
+
+
+2009-08-24 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am: Re-enable the present_progressive test but
+ mark it as "expected failure" so that the test suite still passes.
+
+ * tests/present_progressive.c: Add a description as to what this
+ test is trying to check. Thanks Jamie for the explanation.
+
+2009-08-21 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am: Comment out the present_progressive test
+ completely so autogen.sh no longer complains.
+
+2009-08-19 Mike Sivill <mike.sivill@viewplus.com>
+
+ * tables/da.ctb:
+ * tables/da-dk-g1.utb: Bug fixes for the Danish tables
+
+2009-08-19 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am (check_PROGRAMS): disable the
+ present_progressive test.
+
+ * tables/Makefile.list, tables/Makefile.skel: removed as
+ functionality is now provided by maketablelist.sh
+
+ * tables/maketablelist.sh: renamed from tables/maketablelist
+
+2009-08-12 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/check_all_tables (TABLES): No longer check include tables
+ that are not valid on their own.
+
+2009-08-11 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Updated edit tables for UK maths and Marburg to give more
+ readable output.
+
+2009-08-03 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added new tables for Marburg maths.
+
+
+2009-07-29 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added replaceGrouping function
+
+
+2009-07-28 Christian Egli <christian.egli@sbszh.ch>
+
+ * tables/Makefile.am: Remove some spurious files from the list of
+ tables.
+
+2009-07-28 John J. Boyer <john.boyer@abilitiessoft.org>
+ * Alpha release of UK Maths tables
+
+2009-07-17 Lars Bjørndal <lars@lamasti.net>
+
+ * contrib/liblouis.spec: Added rpm spec file.
+
+2009-07-13 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Merged compileTranslationTable.c and lou_translateString.c
+ with code for non-nemeth math back into trunk
+
+2009-07-06 Christian Egli <christian.egli@sbszh.ch>
+
+ * tables/Makefile.am (table_files): Bring the list of tables up to
+ date.
+
+2009-07-03 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/Makefile.am (TESTS_ENVIRONMENT): Set the environment so
+ that the tests also pass when building in a separate directory and
+ in particular for the `distcheck' rule.
+
+ * tests/brl_checks.c (TRANTAB): Since the Makefile sets the
+ LOUIS_TABLEPATH we no longer need to specify the path to the
+ table.
+
+ * tests/check_all_tables: Use LOUIS_TABLEPATH to find the tables.
+
+ * tables/sk-sk.utb: Fix errors that were reported by
+ lou_checktable.
+
+2009-07-03 James Teh <jamie@jantrid.net>
+
+ * configure.ac: Include the version suffix in the dll name for Windows again (don't add -avoid-version).
+ * python/Makefile.am:
+ * python/louis/__init__.py.in: Use the precise name of the library
+ that the bindings were built with. This ensures the correct ABI
+ and allows the bindings to work on systems which do not use the .so
+ extension.
+
+2009-07-02 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis.texi (How to Write Translation Tables): Fix the
+ prefix for characters operand. It is \y for 5 digits and \z for 8
+ digits.
+
+2009-07-02 Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+ * tables/spaces.ctb:
+ * tables/ru.ctb:
+ * tables/gd.ctb:
+ * tables/en-chess.ctb:
+ * tables/fr-2007.ctb:
+ * tables/boxes.ctb:
+ * tables/de-chess.ctb: Fixed problems with 5-digit character
+ operands in tables.
+
+2009-07-01 Christian Egli <christian.egli@sbszh.ch>
+
+ * tests/check_all_tables: Added a test that invokes lou_checktable
+ on all tables.
+
+ * tests/Makefile.am (TESTS): Add the check_all_tables test to the
+ list of tests.
+
+2009-06-12 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added lou_checkhyphens tool for checking hyphenation tables and
+ the performance of the lou_hyphenate function. Did bugfixes in
+ lou_hyphenate. More to come.
+
+2009-05-19 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added noback and nofor opcode prefixes
+ * Documentation in liblouis.texi, etc.
+
+
+2009-04-22 John J. Boyer <john.boyer@abilitiessoft.org>
+ * Added repword opcode with documentation
+
+2009-03-24 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added ability to specify first four user-defined classes in
+ multipass opcodes.
+
+ * Updated documentation with table of multipass attributes
+
+
+2009-03-19 John J. Boyer <john.boyer@abilitiessoft.org>
+ * Fixed bug with French back-translation.
+
+
+2009-03-12 John J. Boyer <john.boyer@abilitiessoft.org>
+ * doc/Makefile.am: datarootdir may not be correct.
+
+
+2009-03-09 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/Makefile.am (doc_DATA): Use the default location for docdir.
+ Thanks to Lars Bjørndal for the report.
+
+2009-03-04 John J. Boyer <john.boyer@abilitiessoft.org>
+ * New Norwegian tables
+ * Release 1.6.0
+
+
+2009-02-26 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Removed egregiously bad German Grade 2 taale.
+
+
+2009-02-23 (2) John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * doc/louis.texi: Correcting and updating documentation
+
+
+2009-02-20 (2) John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Moved mac-osx-10.5 directory to liblouisxml
+
+
+2009-02-20 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Added the directory mac-osx-10.5 and its files for building
+ liblouis and liblouisxml on the Mac.
+
+
+2009-02-19 Christian Egli <christian.egli@sbszh.ch>
+
+ * tables/hyph_nl_NL.dic:
+ * tables/cy-cy-g1.utb: The svn:eol-style says these files are LF,
+ however they contain CRs. So when doing a svn cat you'll get an
+ error saying "svn: Inconsistent line ending style". I fixed this
+ with dos2unix.
+
+2009-02-18 John J. Boyer <john.boyer@abilitiessoft.org>
+
+ * Changing e-mail, website and company name to abilitiessoft.
+
+
+2009-02-17 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Added Russian Tables and correct Danish tables from ViewPlus
+
+2009-02-16 John J. Boyer <john.boyer@jjb-software.com>
+ * Documented exactdots opcode.
+
+
+2009-02-15 John J. Boyer <john.boyer@jjb-software.com>
+
+ * compileTranslationTable.c: Fined automatic path finding. Moved
+ getProgramPath there from paths.c in liblouisxml, and made it
+ exportable as lou_getProgramPath
+ * liblouis.h: added lou_getProgramPath for Windows only.
+
+2009-02-14 James Teh <jamie@jantrid.net>
+
+ * liblouis/compileTranslationTable.c:
+ * liblouis/liblouis.h:
+ * liblouis/lou_backTranslateString.c:
+ * liblouis/lou_translateString.c: Use stdcall calling convention if building for Windows.
+ * configure.ac: If building for Windows, pass --add-stdcall-alias to the linker so that non-decorated function aliases are generated for the stdcall exported functions.
+ * python/louis/__init__.py: Update to work with stdcall under Windows.
+
+2009-02-14 Eitan Isaacson <eitan@ascender.com>
+
+ * liblouis/compileTranslationTable.c (getFullTablePath): Added a
+ new table search path function.
+ * liblouis/Makefile.am: Define a macro with the installed
+ tables directory TABLESDIR.
+
+2009-02-09 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Latest French tables.
+
+2009-02-09 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis.texi (Programming with liblouis): Move the
+ programming section to the back and rename to emphasize more on
+ the user instead of the programmer.
+
+ * doc/liblouis-guide.texi: rename it to liblouis.texi.
+
+2009-02-03 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Implement exactdots opcode
+
+2009-01-22 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis-guide.texi (The Context and Multipass Opcodes):
+ Document the problem with correct and multipass opcodes and input
+ and output positions.
+
+2009-01-21 James Teh <jamie@jantrid.net>
+
+ * tables/UEBC-g1.ctb: Some fixes to the UEBC grade 1 table.
+
+2009-01-20 James Teh <jamie@jantrid.net>
+
+ * python/louis/__init__.py: Add pass1Only mode.
+
+2009-01-20 (2) John J. Boyer <john.boyer@jjb-software.com>
+ * Implemented pass1Only mode bit
+ * Can now set pass1Only in lou_allround
+2009-01-20 John J. Boyer <john.boyer@jjb-software.com>
+ * Change version in configure.ac to 1.5.2
+
+2009-01-20 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: Fix the bug whereby the next character in the input was skipped if doing compbrlAtCursor and the first character of the word was a capital letter.
+ * liblouis/compileTranslationTable.c: lou_version() now returns PACKAGE_VERSION as defined in louiscfg.h.
+ * configure.ac: Include -avoid-version in LDFLAGS if the host is mingw or cygwin so that the version suffix is not included in the dll filename.
+
+2009-01-19 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis-guide.texi (Top): Added some minimal docu for the
+ Python bindings.
+
+2009-01-19 Eitan Isaacson <eitan@ascender.com>
+
+ * Makefile.am:
+ * configure.ac:
+ * python/Makefile.am:
+ * python/louis/Makefile.am: Added Python bindings to autotooled
+ distribution.
+
+ * python/README: Unset executable flag.
+
+2009-01-19 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: Fix issues when compbrlAtCursor is set, input is being removed due to a "repeated" opcode and cursorPos lies within the repeated input.
+
+2009-01-18 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: When contracting or expanding in the output, map all positions of the input to the first position of the output and all positions of the output to the first position of the input. Mapping to subsequent positions of a contraction doesn't make sense, as the contraction only makes sense as a whole.
+
+2009-01-15 Eitan Isaacson <eitan@ascender.com>
+
+ * python/setup.py:
+ * python/louis/__init__.py: Added Python bindings.
+
+2009-01-15 John J. Boyer <john.boyer/jjb-software.com>
+
+ * Version 1.5.1: bugfix
+ * liblouis/lou_translateString.c: fixed multi-word phrases
+ * tools/lou_debug.c : fixed bug in character display
+ * liblouis/compileTranslationTable.c : fixed bug in
+ findOpcodeName
+
+2009-01-14 James Teh <jamie@jantrid.net>
+
+ * liblouis/lou_translateString.c: Fix the inpos array values for the case where a rule has an output length which is larger than its input length. For example, using UEBC, given the input "#", the output will be "_?". The array mapping from output to input (inpos) previously specified [0, 1], which is incorrect; there is no character at index 1 in the input. The correct result is now returned; i.e. [0, 0].
+
+2009-01-12 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Fixed problem with French Braille
+ * Completed lou_debug tool
+ * Added hooks in compileTranslationTable.c for lou_debug
+ * Updated louis.h with hook prototypes and documentation
+ * Changed version number to 1.5.0
+
+2009-01-08 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/Makefile.am (AM_MAKEINFOHTMLFLAGS): Generate the html as one
+ big page.
+
+2008-12-20 Eitan Isaacson <eitan@ascender.com>
+
+ * ChangeLog:
+ * configure.ac:
+ * doc/Makefile.am:
+ * doc/liblouis-guide.texi:
+ * doc/version.texi:
+ * liblouis/lou_translateString.c:
+ * liblouis/louiscfg.h.in:
+ * tables/Cz-Cz-g1.utb:
+ * tables/Fr-Ca-g2.ctb:
+ * tables/Fr-Fr-g2.ctb:
+ * tables/Lv-Lv-g1.utb:
+ * tables/Makefile.am:
+ * tables/Nl-Nl-g1.utb:
+ * tables/No-No-g0.utb:
+ * tables/No-No-g1.ctb:
+ * tables/No-No-g2.ctb:
+ * tables/No-No-g3.ctb:
+ * tables/Pl-Pl-g1.utb:
+ * tables/Pt-Pt-g1.utb:
+ * tables/Se-Se-g1.utb:
+ * tables/UEBC-g1.utb:
+ * tables/UEBC-g2.ctb:
+ * tables/ar-ar-g1.utb:
+ * tables/bg.ctb:
+ * tables/boxes.ctb:
+ * tables/cy-cy-g1.utb:
+ * tables/cy-cy-g2.ctb:
+ * tables/da-1252.ctb:
+ * tables/da-lt.ctb:
+ * tables/da.ctb:
+ * tables/de-chess.ctb:
+ * tables/de-de-g0.utb:
+ * tables/de-de-g1.ctb:
+ * tables/de-de-g2.ctb:
+ * tables/de-de.dis:
+ * tables/en-GB-g2.ctb:
+ * tables/en-chess.ctb:
+ * tables/en-gb-g1.utb:
+ * tables/en-us-brf.dis:
+ * tables/en-us-comp6.ctb:
+ * tables/en-us-comp8.ctb:
+ * tables/en-us-g1.utb:
+ * tables/en-us-g2.ctb:
+ * tables/en-us-interline.ctb:
+ * tables/en_CA.ctb:
+ * tables/eo.ctb:
+ * tables/et.ctb:
+ * tables/eurodefs.cti:
+ * tables/fi-fi-8dot.ctb:
+ * tables/fi-fi.ctb:
+ * tables/fi1.ctb:
+ * tables/fi2.ctb:
+ * tables/fr-2007.ctb:
+ * tables/fr-bfu-comp6.utb:
+ * tables/fr-bfu-comp8.utb:
+ * tables/fr-ca-g1.utb:
+ * tables/fr-fr-g1.utb:
+ * tables/gd.ctb:
+ * tables/gr-bb.ctb:
+ * tables/gr-gr-g1.utb:
+ * tables/hi-in-g1.utb:
+ * tables/hr.ctb:
+ * tables/hy.ctb:
+ * tables/hyph_de_DE.dic:
+ * tables/hyph_it_IT.dic:
+ * tables/hyph_nl_NL.dic:
+ * tables/hyph_no_NO.dic:
+ * tables/is.ctb:
+ * tables/it-it-g1.utb:
+ * tables/it-it-g1.utb2:
+ * tables/lt.ctb:
+ * tables/nemeth_edit.ctb:
+ * tables/nl-be-g1.utb:
+ * tables/no-gen.dis:
+ * tables/no-no.dis:
+ * tables/ro.ctb:
+ * tables/ru.ctb:
+ * tables/se-se.dis:
+ * tables/sk-sk-g1.utb:
+ * tables/sk-sk.utb:
+ * tables/spaces.ctb:
+ * tables/text_nabcc.dis:
+ * tables/tr.ctb:
+ * tables/ukchardefs.cti:
+ * tables/uni-text.dis:
+ * tables/vi.ctb:
+ * tables/zh-tw.ctb:
+ * tools/Makefile.am:
+ * tools/lou_checktable.c:
+ * tools/lou_debug.c:
+ * configure.in:
+ * doc/liblouis-guide.html:
+ * doc/liblouis-guide.txt: Merge with 1.4.0, and John's autotools.
+
+
+2008-11-12 Christian Egli <christian.egli@sbszh.ch>
+
+ * doc/liblouis-guide.texi: Added the guide in texinfo
+ * doc/Makefile.am (.texi.txt): Integrate the texinfo guide in the
+ build system.
+
+2008-06-16 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Release liblouis-1.3.8
+ * Competed conversion to Gnu autotools that Eitan Isaacson started.
+
+2008-05-29 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Release liblouis-1.3.71
+ * Bugs with compbrlAtCursor and returned inlen have been fixed.
+ * lou_allround has a new heature to test returned lengths.
+ * Bugs with nocont opcode fixed.
+
+2008-05-12 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Release liblouis-1.3.7
+ * The moretables directory has been renamed to tables.
+ * Documentation has been moved to the docs directory.
+ * Only the programs allround, checktable and translate
+ are now supported.
+ * The names of these programs have been changed to lou_allround,
+ lou_checktable and lou_translate
+ * A few bugs have been fixed.
+
+2008-03-31 John J. Boyer <john.boyer@jjb-software.com>
+
+ * Release 1.3.6
+ * The moretables directory now contains the latest versions of
+ both the translation and hyphenation tables.
+ * The COPYING file has been changed to reflct the change from GPL to LGPL.
+
+2008-01-29 Eitan Isaacson <eitan@ascender.com>
+
+ * configure.in: Bumped to new version.
+ * tools/Makefile.am: Changed tool names
+ * tools/allround.c:
+ * tools/basicround.c:
+ * tools/checktable.c:
+ * tools/dotsround.c:
+ * tools/roundtrip.c:
+ * tools/testback.c:
+ * tools/translate.c:
+ * tools/lou_allround.c:
+ * tools/lou_basicround.c:
+ * tools/lou_checktable.c:
+ * tools/lou_dotsround.c:
+ * tools/lou_roundtrip.c:
+ * tools/lou_testback.c:
+ * tools/lou_translate.c: Prefixed all binaries with lou_.
+
+2008-01-23 Eitan Isaacson <eitan@ascender.com>
+
+ * configure.in:
+ * doc/liblouis-guide.html:
+ * doc/liblouis-guide.txt:
+ * liblouis/lou_backTranslateString.c:
+ * liblouis/lou_translateString.c:
+ * tables/chardefs.cti:
+ * tables/en-us-g2.ctb:
+ * tools/allround.c: John's 1.3.51 release.
+
+ * liblouis/lou_translateString.c:
+ * tools/Makefile.am:
+ * tools/allround.c: Jonh's 1.3.42 release.
+
+2008-01-17 Eitan Isaacson <eitan@ascender.com>
+
+ * configure.in: Tagged version 1.3.5.
+
+ * configure.in: Removed unsupported/Makefile.am
+ * tables/Makefile.am: Removed unsupported subdir.
+ * tables/unsupported: Removed.
+
+ * liblouis.pc.in: Added a variable called 'tablesdir'.
+ * tables/Cz-Cz-g1.utb:
+ * tables/Es-Es-g1.utb:
+ * tables/Fr-Ca-g2.ctb:
+ * tables/Fr-Fr-g2.ctb:
+ * tables/Lv-Lv-g1.utb:
+ * tables/Makefile.am:
+ * tables/Nl-Nl-g1.utb:
+ * tables/No-No-g0.utb:
+ * tables/No-No-g1.ctb:
+ * tables/No-No-g2.ctb:
+ * tables/No-No-g3.ctb:
+ * tables/Pl-Pl-g1.utb:
+ * tables/Pt-Pt-g1.utb:
+ * tables/README:
+ * tables/Se-Se-g1.utb:
+ * tables/UEBC-g1.utb:
+ * tables/UEBC-g2.ctb:
+ * tables/ar-ar-g1.utb:
+ * tables/cy-cy-g1.utb:
+ * tables/cy-cy-g2.ctb:
+ * tables/de-de-g0.utb:
+ * tables/de-de-g1.ctb:
+ * tables/de-de-g2.ctb:
+ * tables/de-de.dis:
+ * tables/en-GB-g2.ctb:
+ * tables/en-gb-g1.utb:
+ * tables/en-us-g1.utb:
+ * tables/errors:
+ * tables/eurodefs.cti:
+ * tables/fr-ca-g1.utb:
+ * tables/fr-fr-g1.utb:
+ * tables/gr-gr-g1.utb:
+ * tables/hi-in-g1.utb:
+ * tables/hyph_de_DE.dic:
+ * tables/hyph_en_US.dic:
+ * tables/hyph_es_ES.dic:
+ * tables/hyph_fr_FR.dic:
+ * tables/hyph_it_IT.dic:
+ * tables/hyph_nl_NL.dic:
+ * tables/hyph_no_NO.dic:
+ * tables/hyph_pl_PL.dic:
+ * tables/hyph_pt_PT.dic:
+ * tables/hyph_sv_SE.dic:
+ * tables/it-it-g1.utb:
+ * tables/nl-be-g1.utb:
+ * tables/no-no.dis:
+ * tables/se-se.dis:
+ * tables/text_nabcc.dis:
+ * tables/ukchardefs.cti:
+ * tables/uni-text.dis:
+ * tables/unsupported:
+ * tables/unsupported/Cz-Cz-g1.utb:
+ * tables/unsupported/Es-Es-g1.utb:
+ * tables/unsupported/Fr-Ca-g2.ctb:
+ * tables/unsupported/Fr-Fr-g2.ctb:
+ * tables/unsupported/Lv-Lv-g1.utb:
+ * tables/unsupported/Makefile.am:
+ * tables/unsupported/Nl-Nl-g1.utb:
+ * tables/unsupported/No-No-g0.utb:
+ * tables/unsupported/No-No-g1.ctb:
+ * tables/unsupported/No-No-g2.ctb:
+ * tables/unsupported/No-No-g3.ctb:
+ * tables/unsupported/Pl-Pl-g1.utb:
+ * tables/unsupported/Pt-Pt-g1.utb:
+ * tables/unsupported/README:
+ * tables/unsupported/Se-Se-g1.utb:
+ * tables/unsupported/UEBC-g1.utb:
+ * tables/unsupported/UEBC-g2.ctb:
+ * tables/unsupported/ar-ar-g1.utb:
+ * tables/unsupported/chardefs.cti:
+ * tables/unsupported/countries.cti:
+ * tables/unsupported/cy-cy-g1.utb:
+ * tables/unsupported/cy-cy-g2.ctb:
+ * tables/unsupported/de-de-g0.utb:
+ * tables/unsupported/de-de-g1.ctb:
+ * tables/unsupported/de-de-g2.ctb:
+ * tables/unsupported/de-de.dis:
+ * tables/unsupported/en-GB-g2.ctb:
+ * tables/unsupported/en-gb-g1.utb:
+ * tables/unsupported/en-us-g1.utb:
+ * tables/unsupported/en-us-g2.ctb:
+ * tables/unsupported/errors:
+ * tables/unsupported/eurodefs.cti:
+ * tables/unsupported/fr-ca-g1.utb:
+ * tables/unsupported/fr-fr-g1.utb:
+ * tables/unsupported/gr-gr-g1.utb:
+ * tables/unsupported/hi-in-g1.utb:
+ * tables/unsupported/hyph_de_DE.dic:
+ * tables/unsupported/hyph_en_US.dic:
+ * tables/unsupported/hyph_es_ES.dic:
+ * tables/unsupported/hyph_fr_FR.dic:
+ * tables/unsupported/hyph_it_IT.dic:
+ * tables/unsupported/hyph_nl_NL.dic:
+ * tables/unsupported/hyph_no_NO.dic:
+ * tables/unsupported/hyph_pl_PL.dic:
+ * tables/unsupported/hyph_pt_PT.dic:
+ * tables/unsupported/hyph_sv_SE.dic:
+ * tables/unsupported/it-it-g1.utb:
+ * tables/unsupported/nl-be-g1.utb:
+ * tables/unsupported/no-no.dis:
+ * tables/unsupported/se-se.dis:
+ * tables/unsupported/text_nabcc.dis:
+ * tables/unsupported/ukchardefs.cti:
+ * tables/unsupported/uni-text.dis: Flattened tables directory,
+ all tables not live in basedir/tables.
+
+2008-01-16 Eitan Isaacson <eitan@ascender.com>
+
+ * README:
+ * doc/liblouis-guide.html:
+ * doc/liblouis-guide.txt:
+ * liblouis/compileTranslationTable.c:
+ * liblouis/lou_backTranslateString.c:
+ * liblouis/lou_translateString.c:
+ * tables/chardefs.cti: John's changes.
+ * configure.in: Bumped to version 1.3.41.
+
+ * liblouis/liblouis.h: Added an include to louiscfg.h for
+ character width.
+ * configure.in: Added --enable-ucs4 for 4 byte wide characters.
+ * liblouis/Makefile.am: Added louiscfg.h for installation.
+
+2008-01-03 Eitan Isaacson <eitan@ascender.com>
+
+ * configure.in: First autotooled version.
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..a05410f
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,29 @@
+FROM debian:jessie
+
+LABEL maintainer="Liblouis Maintainers <liblouis-liblouisxml@freelists.org>"
+
+# Fetch build dependencies
+RUN apt-get update && apt-get install -y \
+ autoconf \
+ automake \
+ curl \
+ libtool \
+ libyaml-dev \
+ make \
+ pkg-config \
+ python \
+ texinfo \
+ && rm -rf /var/lib/apt/lists/*
+
+# compile and install liblouis
+ADD . /usr/src/liblouis
+WORKDIR /usr/src/liblouis
+RUN ./autogen.sh && ./configure --enable-ucs4 && make && make install && ldconfig
+
+# install python bindings
+WORKDIR /usr/src/liblouis/python
+RUN python setup.py install
+
+# clean up
+WORKDIR /root
+RUN rm -rf /usr/src/liblouis
diff --git a/Dockerfile.dev b/Dockerfile.dev
new file mode 100644
index 0000000..a62bbb4
--- /dev/null
+++ b/Dockerfile.dev
@@ -0,0 +1,29 @@
+FROM debian:jessie
+
+MAINTAINER Liblouis Maintainers "liblouis-liblouisxml@freelists.org"
+
+# developer environment
+RUN apt-get update
+RUN apt-get install -y make autoconf automake libtool pkg-config curl
+
+# for cross-compiling
+RUN apt-get install -y mingw32 mingw-w64 libc6-dev-i386
+
+# for running cross-compiled tests
+RUN dpkg --add-architecture i386 && apt-get update && apt-get install -y wine32 wine64
+
+# for check_yaml
+WORKDIR /root/src/
+RUN curl -L https://github.com/yaml/libyaml/archive/0.2.2.tar.gz | tar zx
+WORKDIR /root/src/libyaml-0.2.2
+RUN ./bootstrap
+RUN ./configure --host i586-mingw32msvc --prefix=/root/build/win32/libyaml
+RUN make
+RUN make install
+
+ADD . /root/src/liblouis
+WORKDIR /root/src/liblouis
+
+# create Makefile
+RUN ./autogen.sh
+RUN ./configure
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..ec92be6
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2453 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Liblouis"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = Braille Translation and Back-Translation Library
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doc
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = liblouis tools tests python
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS = *.c \
+ *.h \
+ *.py
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# 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
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/HACKING b/HACKING
new file mode 100644
index 0000000..56d3bc6
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,473 @@
+This HACKING file describes the development environment. -*- org -*-
+
+ Copyright (C) 2008, 2009, 2011 ViewPlus Technologies, Inc. and Abilitiessoft, Inc.
+ Copyright (C) 2012, 2013, 2014,2015 Swiss Library for the Blind, Visually Impaired and Print Disabled
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved. This file is offered as-is,
+ without any warranty.
+
+This file attempts to describe the maintainer-specific notes to follow
+when hacking liblouis.
+
+* Table of Contents :TOC:
+- [[#developing][Developing]]
+ - [[#where-to-get-it][Where to get it]]
+ - [[#build-requirements][Build requirements]]
+ - [[#gnulib][Gnulib]]
+ - [[#how-to-build][How to build]]
+ - [[#install-with-homebrew][Install with Homebrew]]
+ - [[#docker][Docker]]
+ - [[#how-to-run-tests][How to run tests]]
+ - [[#how-to-debug][How to debug]]
+ - [[#how-to-find-memory-leaks][How to find memory leaks]]
+ - [[#static-analysis][Static analysis]]
+ - [[#how-to-analyze-performance][How to analyze performance]]
+ - [[#how-to-build-for-windows][How to build for Windows]]
+- [[#release-procedure][Release Procedure]]
+ - [[#update-the-news-entry][Update the NEWS entry]]
+ - [[#set-the-version-number][Set the version number]]
+ - [[#commit-and-tag][Commit and tag]]
+ - [[#make-the-release][Make the release]]
+ - [[#upload][Upload]]
+ - [[#online-documentation][Online documentation]]
+ - [[#web-site-maintenance][Web site maintenance]]
+ - [[#announce][Announce]]
+
+* Developing
+** Where to get it
+The development sources are available through git at github.com:
+
+ https://github.com/liblouis/liblouis
+
+** Build requirements
+To build Automake, Autoconf, and Libtool are used. If you are getting
+the sources from git (or change configure.ac), you'll need to have
+these tools installed to (re)build. Optionally (if you want to
+generate man pages) you'll also need ~help2man~. All of these programs
+are available from ftp://ftp.gnu.org/gnu.
+
+If you want to run the YAML based test suite you will have to install
+~libyaml~.
+
+On Mac OS, the programs can be optained with Homebrew (http://brew.sh):
+
+#+BEGIN_SRC shell
+$ brew install automake libtool pkg-config texinfo
+#+END_SRC
+
+Note that if you are using Homebrew to install liblouis (see below),
+the build dependencies are installed automatically.
+
+** Gnulib
+Gnulib (http://www.gnu.org/software/gnulib) is used to provide
+portable basic functionality to programs and libraries. We use two
+instances of gnulib, one to provide portable functions such as
+~malloc~, ~strndup~, etc to the library and another one to provide
+portable functionality such as ~getopt~, ~progname~ or
+~version-etc~ to the tools.
+
+The first time invocation to import gnulib for the library was
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnu --source-base=gnulib \
+ --m4-base=gnulib/m4 --aux-dir=build-aux --libtool \
+ --macro-prefix=gl --no-vc-files \
+ malloc-gnu realloc-gnu strndup
+#+END_SRC
+
+and for the tools
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnutools --source-base=tools/gnulib \
+ --m4-base=tools/gnulib/m4 --aux-dir=build-aux --libtool \
+ --macro-prefix=gl_tools --no-vc-files \
+ getopt-gnu malloc-gnu progname version-etc
+#+END_SRC
+
+More modules might have been added since. The currently-used gnulib
+modules and other gnulib information are recorded in
+~gnulib/m4/gnulib-cache.m4~ and ~tools/gnulib/m4/gnulib-cache.m4~.
+
+If you want to update from the current gnulib, install gnulib, and
+then run the following commands in the top-level directory.
+
+#+BEGIN_SRC shell
+$ gnulib-tool --add-import --lib=libgnu --source-base=gnulib \
+ --m4-base=gnulib/m4 --aux-dir=build-aux --libtool \
+ --macro-prefix=gl --no-vc-files
+$ gnulib-tool --add-import --lib=libgnutools --source-base=tools/gnulib \
+ --m4-base=tools/gnulib/m4 --aux-dir=build-aux --libtool \
+ --macro-prefix=gl_tools --no-vc-files
+#+END_SRC
+
+** How to build
+After getting the sources from git, with
+
+#+BEGIN_SRC shell
+$ git clone https://github.com/liblouis/liblouis.git
+#+END_SRC
+
+and installing the tools above, change to the liblouis directory and
+and bootstrap the project with the following command
+
+#+BEGIN_SRC shell
+$ ./autogen.sh
+#+END_SRC
+
+to do a fresh build. Then run configure as usual:
+
+#+BEGIN_SRC shell
+$ ./configure
+#+END_SRC
+
+You have the choice to compile liblouis for either 16- or 32-bit
+Unicode. By default it is compiled for the former. To get 32-bit
+Unicode run configure with ~--enable-ucs4~.
+
+After running configure run ~make~ and then ~make install~. You must
+have root privileges for the installation step.
+
+** Install with Homebrew
+Homebrew (http://brew.sh) is a package manager for Mac OS X that
+installs software from source. There is nothing special about the
+installation process in the sense that under the hood it happens
+exactly as described above, with the only difference that Homebrew
+automates it completely.
+
+First, use the ~brew tap~ command to add the repository that includes
+the liblouis formula:
+
+#+BEGIN_SRC shell
+$ brew tap liblouis/liblouis
+#+END_SRC
+
+Now you are ready to install liblouis:
+
+#+BEGIN_SRC shell
+$ brew install liblouis
+#+END_SRC
+
+** Docker
+Docker (https://www.docker.com) can be useful both for creating a
+development environment for liblouis, and for shipping the
+application.
+
+Setting up a developer environment can take long and can be
+problematic especially for Windows. Thanks to Docker we can set up the
+environment for you, we can easily distribute it as an image, which
+can be run by anybody and will behave exactly the same for everybody.
+
+Docker images of liblouis are being built automatically each time
+something changes in the code (see https://registry.hub.docker.com/repos/liblouis).
+In order to use them, first get Docker at
+http://docs.docker.com/introduction/get-docker. Download the latest
+liblouis image with:
+
+#+BEGIN_SRC shell
+$ docker pull liblouis/liblouis
+#+END_SRC
+
+Then, enter the development environment by running the image in a
+Docker container:
+
+#+BEGIN_SRC shell
+$ docker run -it liblouis/liblouis bash
+#+END_SRC
+
+Local files and directories can be "mounted" inside the container, in
+order to make it easier to edit files and to persist changes across
+runs. For example, to use local table files:
+
+#+BEGIN_SRC shell
+$ docker run -it -v $(pwd)/tables:/tmp/liblouis/tables liblouis/liblouis bash
+#+END_SRC
+
+See the Docker documentation for more info.
+
+The same Docker image can be used as a development environment and as
+the application itself. For example, to run the lou_translate tool
+from inside a Docker container:
+
+#+BEGIN_SRC shell
+$ docker run -it liblouis/liblouis lou_translate en-us-g1.ctb
+#+END_SRC
+
+To rebuild the image yourself, run the following command in the root
+directory of the liblouis source:
+
+#+BEGIN_SRC shell
+$ docker build -t liblouis/liblouis .
+#+END_SRC
+
+A ~.dockerignore~ file is required if you want to compile the source
+both on te host and in the Docker container. The ~.dockerignore~ file
+can be updated from ~.gitignore~ with:
+
+#+BEGIN_SRC shell
+$ make .dockerignore
+#+END_SRC
+
+** How to run tests
+Tests are run with
+
+#+BEGIN_SRC shell
+$ make check
+#+END_SRC
+
+** How to debug
+First you have to build liblouis with debugging info enabled.
+
+#+BEGIN_SRC shell
+$ ./configure CFLAGS='-g -O0 -Wall -Wextra'
+$ make
+#+END_SRC
+
+Starting the programs under the tools directory within gdb is a little
+tricky as they are linked with libtool. See the info page of libtool
+for more information. To start ~lou_checktable~ for table
+~wiskunde.ctb~ for example you'd have to issue the following commands:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gdb ./tools/lou_checktable
+(gdb) run tables/wiskunde.ctb
+#+END_SRC
+
+** How to find memory leaks
+Valgrind is a tool that can be used to find memory errors. It is
+recommended that you compile liblouis without any optimizations and
+with all warnings enabled before running it through Valgrind:
+
+#+BEGIN_SRC shell
+$ ./configure CFLAGS='-g -O0 -Wall'
+$ make
+#+END_SRC
+
+Then use Valgrind to analyze liblouis. For example you can run
+~lou_translate~ trough Valgrind:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+ --leak-check=full --leak-resolution=high --log-file=valgrind.log \
+ ./tools/lou_translate en-us-g2.ctb
+#+END_SRC
+
+Type a few words at the prompt, check translation and terminate
+~lou_translate~. Now open the file ~valgrind.log~ and see if there are
+any memory leaks reported.
+
+You can also just run lou_checktable for example:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+ --leak-check=full --leak-resolution=high --log-file=valgrind.log \
+ ./tools/lou_checktable tables/nl-BE-g0.utb
+#+END_SRC
+
+Again open valgrind.log to see if any memory leaks were reported.
+
+For the full experience run lou_allround under Valgrind:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute valgrind -v --tool=memcheck \
+ --leak-check=full --show-reachable=yes \
+ --leak-resolution=high --track-origins=yes \
+ --log-file=valgrind.log ./tools/lou_allround
+#+END_SRC
+
+*** AddressSanitizer
+[[https://github.com/google/sanitizers/wiki/AddressSanitizer][AdressSanitizer]] is a memory error detector for C/C++. It is part of
+both LLVM and gcc. To check liblouis build it as follows:
+
+#+BEGIN_SRC shell
+$ ./autogen.sh
+$ ./configure CFLAGS='-fsanitize=address -O1 -fno-omit-frame-pointer -g'
+$ make
+$ ./tools/lou_translate tables/en-ueb-g2.ctb
+#+END_SRC
+
+Run a few translations, end the program and marvel at the output of
+AddressSanitizer. At the time of this writing it complained pretty
+hard:
+
+#+BEGIN_EXAMPLE
+SUMMARY: AddressSanitizer: 12384 byte(s) leaked in 12 allocation(s).
+#+END_EXAMPLE
+
+*** Electric Fence
+Electric Fence is a tool that helps detect memory access that overruns
+the boundaries of a ~malloc()~ memory allocation, and access to memory
+that has been released with ~free()~.
+
+Under Debian the usage is fairly straightforward:
+
+#+BEGIN_SRC shell
+$ sudo apt install sudo apt install electric-fence
+#+END_SRC
+
+Then compile [[#how-to-debug][as above]] and invoke the debugger [[#how-to-debug][as above]]. Inside ~gdb~
+set up ~LOUIS_TABLEPATH~ and ~LD_PRELOAD~ as follows:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gdb ./tools/lou_allround
+(gdb) set environment LOUIS_TABLEPATH ./tables,./tests/tables,./tests/tables/moreTables,./tests/tablesWithMetadata,./tests/tables/emphclass
+(gdb) set environment LD_PRELOAD /usr/lib/libefence.so.0.0
+(gdb) run
+#+END_SRC
+
+If there are problems with memory access the program will run into a
+segmentation fault which you can consequently analyze in the debugger.
+
+** Static analysis
+[[http://clang-analyzer.llvm.org/scan-build.html][scan-build]] is a command line utility to run a static analyzer over the
+codebase. It helps to find problems such as memory leaks, dereference
+of null pointer, etc.
+
+#+BEGIN_SRC shell
+$ make maintainer-clean
+$ ./autogen.sh
+$ scan-build ./configure
+$ scan-build make
+...
+scan-build: 101 bugs found.
+scan-build: Run 'scan-view /tmp/scan-build-2019-08-15-141827-5185-1' to examine bug reports.
+#+END_SRC
+
+then look at the generated reports and fix (or report) the issues.
+
+** How to analyze performance
+Gprof helps you analyze the performance of programs. You have to
+compile liblouis as follows:
+
+#+BEGIN_SRC shell
+$ ./configure --disable-shared
+$ make clean all CFLAGS='-g -O0 -pg' LDFLAGS='-all-static'
+#+END_SRC
+
+Then translate some stuff with a large table:
+
+#+BEGIN_SRC shell
+$ ./tools/lou_translate tests/tables/large.ctb
+#+END_SRC
+
+Finally look at the call profile:
+
+#+BEGIN_SRC shell
+$ libtool --mode=execute gprof ./tools/lou_translate gmon.out
+#+END_SRC
+
+** How to build for Windows
+See the ~README.windows~ file and the windows subdirectory.
+
+*** How to cross-compile for Windows
+To compile for win32, use the MinGW win32 cross-compiler as shown
+below. Use the prefix option to install the binaries to a temporary
+place where you can create a zip file. The ~LDFLAGS='-all-static'~
+ensures that libgcc is linked in statically. Otherwise the users need
+to have ~libgcc_s_sjlj-1.dll~.
+
+Some users want the dlls unversioned. To achieve that add
+~-avoid-version~ to ~LDFLAGS~.
+
+#+BEGIN_SRC shell
+$ ./configure --build=i686-pc-linux-gnu --host=i686-w64-mingw32 --prefix=/tmp/liblouis-mingw32
+$ make LDFLAGS='-avoid-version -Xcompiler -static-libgcc'
+$ make install
+$ zip -r liblouis-mingw32msvc.zip /tmp/liblouis-mingw32
+#+END_SRC
+
+To compile for win64, use the MinGW-w64 cross-compiler:
+
+#+BEGIN_SRC shell
+$ ./configure --build=i686-pc-linux-gnu --host=x86_64-w64-mingw32 --prefix=/tmp/liblouis-w64-mingw32
+$ make LDFLAGS='-avoid-version -Xcompiler -static-libgcc'
+$ make install
+$ zip -r liblouis-w64-mingw32.zip /tmp/liblouis-w64-mingw32
+#+END_SRC
+
+Two makefile rules have been provided to do this automatically for you. Docker will be used if the
+right cross-compiler is not installed. To compile for win32 using the MinGW cross-compiler, run ~make
+distwin32~. This will produce a ZIP file called ~liblouis-<version>-win32.zip~. To compile for win64
+using the MinGW-w64 cross-compiler, run ~make distwin64~. This will produce a ZIP file called
+~liblouis-<version>-win64.zip~.
+
+*** TODO How to build for Windows using Cygwin
+(possibly use a Vagrantfile as demonstration + explain that Cygwin
+binaries can not be used outside the Cygwin environment)
+
+*** TODO How to build for Windows using MinGW
+(possibly use a Vagrant file as demonstration)
+
+* Release Procedure
+These steps describe what a maintainer does to make a release; they
+are not needed for ordinary patch submission.
+
+** Update the NEWS entry
+If any new tables were added, renamed or removed please note them with
+their file name in the NEWS entry. This is usefull for projects like
+NVDA.
+
+** Set the version number
+Update the version number in ~NEWS~ (with version, date, and release
+type), ~configure.ac~ and ~windows/include/config.h~.
+
+Don't forget to update the libtool versioning info in ~configure.ac~,
+i.e. ~LIBLOUIS_REVISION~ and possibly ~LIBLOUIS_CURRENT~ and
+~LIBLOUIS_AGE~. Check the [[https://www.gnu.org/software/libtool/manual/html_node/Interfaces.html#Interfaces][libtool documentation on versioning]] for an
+explanation of these values.
+
+** Commit and tag
+Commit the changes and tag this version
+
+#+BEGIN_SRC shell
+$ git tag -s v2.6.0 -m "Release 2.6.0"
+$ git push origin v2.6.0
+#+END_SRC
+
+If you know the exact version number that needs to be tagged use
+
+#+BEGIN_SRC shell
+$ git tag -s v2.6.0 -m "Release 2.6.0" <commit>
+$ git push origin v2.6.0
+#+END_SRC
+
+** Make the release
+Check out a clean copy in a different directory, like /tmp. Run
+autogen.sh and configure with no special prefixes. Run make distcheck.
+This will make sure that all needed files are present, and do a
+general sanity check. Run make dist. This will produce a tarball.
+
+#+BEGIN_SRC shell
+$ ./autogen.sh && ./configure && make && make distcheck && make dist
+#+END_SRC
+
+** Upload
+Add the tarball to the github liblouis releases page, i.e. add it
+under https://github.com/liblouis/liblouis/releases with the specific
+release and add a link to it in $WEBSITE/downloads/index.md. See below
+for instructions on how to update the web site.
+
+** Online documentation
+The online documentation is part of the liblouis web site. To add it to the
+site simply copy doc/liblouis.html to $WEBSITE/documentation/liblouis.html.
+Make sure you add the proper YAML front matter. Again see below for
+instructions on how to update the web site.
+
+** Web site maintenance
+The liblouis web site at liblouis.org is maintained with the help of
+[[https://pages.github.com/][github pages]]. To edit the site just check out the repo at
+https://github.com/liblouis/liblouis.github.io. You'll need to know a
+few things about [[http://jekyllrb.com/][Jekyll]] and markdown, the markup that is used to edit
+the content. In order to update the site simply edit, commit and push.
+
+For the new release update the project web site.
+
+- Add a post containing the current NEWS to the _posts directory and
+- add the download artifacts to the download page
+
+** Announce
+Send an announcement to the liblouis list
+~liblouis-liblouisxml@freelists.org~. See ~ANNOUNCEMENT~ for an
+example.
+
diff --git a/License.md b/License.md
new file mode 100644
index 0000000..19e3071
--- /dev/null
+++ b/License.md
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+(This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.)
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ {description}
+ Copyright (C) {year} {fullname}
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random
+ Hacker.
+
+ {signature of Ty Coon}, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f2cf8ad
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,64 @@
+SUBDIRS = gnulib liblouis tools tables man tests python windows
+
+# only build the documentation if we have makeinfo 5
+if HAVE_MAKEINFO_5
+SUBDIRS += doc
+endif
+
+ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4 -I tools/gnulib/m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = liblouis.pc
+
+EXTRA_DIST = liblouis.pc README.windows HACKING
+
+distwin32 : distwin32-zip
+
+distwin32-zip : distwin32-dir
+ rm -f liblouis-$(VERSION)-win32.zip
+ zip -r liblouis-$(VERSION)-win32.zip liblouis-$(VERSION)-win32
+
+distwin32-dir :
+ rm -rf liblouis-$(VERSION)-win32/*
+ @if which i586-mingw32msvc-gcc >/dev/null; then \
+ ./configure --host i586-mingw32msvc --prefix=$(CURDIR)/liblouis-$(VERSION)-win32 && \
+ make LDFLAGS="$$LDFLAGS -avoid-version -Xcompiler -static-libgcc" && \
+ make check WINE=wine32&& \
+ make install; \
+ elif which i686-w64-mingw32-gcc >/dev/null; then \
+ ./configure --host i686-w64-mingw32 --prefix=$(CURDIR)/liblouis-$(VERSION)-win32 && \
+ make LDFLAGS="$$LDFLAGS -avoid-version -Xcompiler -static-libgcc" && \
+ make install; \
+ elif which docker >/dev/null; then \
+ gtar --transform='s/Dockerfile.dev/Dockerfile/' --exclude-from=.dockerignore -cz * | docker build -t liblouis-dev - && \
+ mkdir -p liblouis-$(VERSION)-win32 && \
+ docker run --rm -v $(CURDIR)/liblouis-$(VERSION)-win32:/root/src/liblouis/liblouis-$(VERSION)-win32 liblouis-dev \
+ make CPPFLAGS='-I/root/build/win32/libyaml/include/' \
+ LDFLAGS='-L/root/build/win32/libyaml/lib/' \
+ distwin32-dir; \
+ fi
+
+distwin64 : distwin64-zip
+
+distwin64-zip : distwin64-dir
+ rm -f liblouis-$(VERSION)-win64.zip
+ zip -r liblouis-$(VERSION)-win64.zip liblouis-$(VERSION)-win64
+
+distwin64-dir :
+ rm -rf liblouis-$(VERSION)-win64/*
+ @if which x86_64-w64-mingw32-gcc >/dev/null; then \
+ ./configure --host x86_64-w64-mingw32 --prefix=$(CURDIR)/liblouis-$(VERSION)-win64 && \
+ make LDFLAGS='-avoid-version -Xcompiler -static-libgcc' && \
+ make check WINE=wine64&& \
+ make install; \
+ elif which docker >/dev/null; then \
+ gtar --transform='s/Dockerfile.dev/Dockerfile/' --exclude-from=.dockerignore -cz * | docker build -t liblouis-dev - && \
+ mkdir -p liblouis-$(VERSION)-win64 && \
+ docker run --rm -v $(CURDIR)/liblouis-$(VERSION)-win64:/root/src/liblouis/liblouis-$(VERSION)-win64 liblouis-dev \
+ make distwin64-dir; \
+ fi
+
+# .dockerignore
+.dockerignore : .gitignore
+ sed -e 's|^\([^/#]\)|# \1|' -e 's|^/||' -e 's|\+|\\+|g' $< >$@
+
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..1494b8b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2060 @@
+liblouis NEWS -- history of user-visible changes. -*- org -*-
+
+* Noteworthy changes in release 3.12.0 (2019-12-02)
+This release contains major updates to the UEB, Afrikaans, Chinese,
+Danish and Polish tables. Aside from that there have been many code
+cleanups, such as the elimination of many global vars and bug fixes
+such as an endless loop or a crash in ~lou_translate~.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/22?closed=1][the list of closed
+issues]].
+
+** New features
+None
+** Bug fixes
+- Fix a memory leak when several tables are specified and some of them
+ that can't be resolved. Thanks to André-Abush Clause.
+- Fix an endless loop with multipass rules where ~endReplace~ is
+ smaller or equal to ~startMatch~. Thanks to Bert Frees and Bue
+ Vester-Andersen.
+** Braille table improvements
+- Punctuation corrections in Ethiopic Braille thanks to Dr. Tamru E.
+ Belay.
+- Fixes to the Norwegian 8dot braille table in regards to 4 Sami
+ characters, capital and small letters S and Z with caron. Thanks to
+ Oddvar Øyan and Lars Bjørndal.
+- Improvements to Afrikaans contracted braille thanks to Christo de Klerk
+ - Over 50 cases have been corrected where braille rules were not
+ correctly applied in words, mainly in those cases where
+ contractions depend on pronunciation; for example, ui or ie must
+ not be contracted in requiem.
+ - Corrected contraction errors caused by start or end of input not
+ properly taken into account.
+ - Words are no longer contracted into lower word contractions when
+ they are adjacent to lower punctuation, for example: "hier.
+ - Words are now contracted into their lower contractions when they
+ are adjacent to upper punctuation, for example: (hier.
+- New draft table for Dutch 8-dot computer braille thanks to Leonard
+ de Ruijter.
+- Updates to the Chinese braille table (~zh-tw.ctb~) thanks to
+ Bo-Cheng Jhan, Coscell Kao, 特種兵, 黃偉豪, and Victor Cai.
+- Fixes to Polish grade 1, thanks to Łukasz Golonka
+ - Removes some unneeded ~midnum~ symbols from the Polish Grade 1.
+ - Fixes some symbols which weren't defined according to the
+ specification.
+ - Makes it possible to type dot from a braille keyboard.
+ - Adds Greek letters and some commonly used math operators to both
+ the Grade 1 and the computer braille table.
+- Fix several conflicts in ~fr-bfu-comp68.cti~ with regards to the IPA
+ Unicode range. These had been especially noticed when
+ ~compbrlAtCursor~ mode flag was used. Thanks to André-Abush Clause.
+- Major Improvements to contraction use in UEB thanks to James Bowden.
+- Updates to the Danish Tables thanks to Bue Vester-Andersen:
+ - Added miscelaneous Unicode characters to 8 dots grade 1 and 2
+ (accented letters, punctuation, arrows and some math signs).
+ Most of these characters have not been defined in the Danish
+ Braille standard. This implementation is purely experimental,
+ and the characters may be changed later.
+ - Updated the 6 dots tables with more Unicode characters
+ (no arrows or math signs).
+ - Corrected a bug in 8 dots grade 2, which resulted in the
+ "var" contraction not always being properly applied.
+** Other changes
+- Make sure the log callback uses the same calling convention as all
+ the other exported functions. Thanks to Leonard de Ruijter.
+- Fix a problem with Non-ASCII characters in file paths in the Python
+ bindings, thanks to André-Abush Clause.
+- Eliminate some of the globals variables thanks to Bert Frees.
+- The display and the translation are now separated at least
+ internally, thanks to Bert Frees. As a reminder, there are two
+ phases to a braille conversion:
+ - translation :: liblouis uses the rules in the translation table to
+ convert characters to dots
+ - display :: display the dots as characters. Usually liblouis uses
+ the characters defined in display rules (in display
+ tables) but as a fallback it uses mappings defined in
+ the translation table, e.g. letter rules.
+- No longer install ~lou_compare~, a tool that is used to run
+ regression tests for UEB. As it is only run during testing it will
+ no longer be installed by default on a users machine.
+- Remove a hidden feature of ~lou_translate~ that would cause it to
+ crash if passed an invalid file name. Thanks to Christian Egli.
+- Raise an error if a dot pattern can not be displayed instead of
+ silently ignoring it thanks to Bert Frees.
+** Deprecation notice
+None
+
+** Backwards incompatible changes
+None
+
+** Invisible changes
+
+** New, renamed or removed tables
+*** New
+- nl-comp8.utb
+
+*** Renamed
+None
+
+*** Removed
+None
+
+* Noteworthy changes in release 3.11.0 (2019-09-02)
+A tremendous amount of work by Dave Mielke and Bert Frees has gone
+into this release. They have improved liblouis for use on note taker
+devices, for backwards translation and a number of languages. Many
+other contributors (listed below) have also helped in fixing bugs and
+improving braille tables, such as Dutch, Mongolian, Polish, Ancient
+Greek, Danish, Irish, Chinese, and American Braille Computer Code.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/21?closed=1][the list of closed
+issues]].
+
+** New features
+- Enable ~always~ rules with a single character and a single braille
+ cell for back-translation. Thanks to Bue Vester-Andersen.
+- Implement ~noUndefined~ mode for forward translation, thanks to Dave
+ Mielke.
+- Use fallback braille representations (NABCC) for rendering undefined
+ characters in hexadecimal notation, thanks to Dave Mielke.
+- Always render undefined characters, also ASCII characters, in
+ hexadecimal notation.
+- Add a new metadata field ~index-name~ for selecting a table from a
+ list fast and efficiently. It has the most important information
+ first and no redundant information. It should look nice when sorted.
+ This in contrast to the existing ~display-name~ field which is for
+ describing a table accurately and should sound good. Thanks to Dave
+ Mielke and Bert Frees.
+
+** Bug fixes
+- Don't let a caps passage end on a word with no letters. Thanks to
+ Bert Frees.
+- Handle word resets in the last word of an caps or emphasis passage
+ if the end indicator was placed before the word. Thanks to Bert
+ Frees.
+- Never convert to lowercase if ~capsletter~ is not defined. Thanks to
+ Bert Frees.
+- Fix position mapping for back-translation when ~noUndefined~ mode is
+ active. Thanks to Dave Mielke.
+- Fix bug where a translation would hang on words that match both a
+ ~nocont~ and a ~repeated~ rule. Thanks to Dave Mielke.
+- Fix bug where the effect of ~capsnocont~ would leak to the next word
+ if that word starts with a capital. Thanks to Bue Vester-Andersen.
+
+** Braille table improvements
+- Fix an issue with ordinal numbers inside caps passages in Dutch
+ braille. Thanks to Bert Frees.
+- Improved back-translation for Mongolian thanks to Angaragerdene.
+- Fixes to Polish grade 1 and Polish computer braille thanks to Łukasz
+ Golonka.
+- Improvements to Ancient Greek braille, which has been renamed "Greek
+ international braille". A version with composed accents is made
+ available as a .uti table. Thanks to Dave Mielke and Μαρια
+ Γεωργακαράκου (Maria Georgakarakou).
+- Various improvements to modern Greek thanks to Dave Mielke.
+- Improvements and fixes to Spanish contracted braille. Details in
+ #741. Thanks to Juan Pablo Bello.
+- Improvements and fixes to the Danish tables. Thanks to Bue
+ Vester-Andersen.
+- Add a display table to match Word CX which is used in Norway and
+ Sweden, and maybe also in other countries thanks to Lars Bjørndal.
+- Fix handling of colon within number in Dutch braille, thanks to Jake
+ Kyle.
+- Fix translation of bullet and dot operators in Dutch braille, thanks
+ to Paul Rambags
+- Added North American Braille Computer Code table (~en-nabcc.utb~)
+ which is the counterpart of the ~text_nabcc.dis~ display table.
+ Thanks to Dave Mielke.
+- Add support for the International Phonetic Alphabet (IPA) to the
+ Chinese bopomofo braille table, thanks to Hurt Huang and Sponge
+ Jhan. Various improvements, including dot patterns and test cases, to
+ the Chinese bopomofo braille table, thanks to Sponge Jhan.
+- Unified English Braille no longer displays a single underscore when
+ multiple underscores are in the text, thanks to André-Abush Clause.
+- Update to Afrikaans uncontracted braille and new table for contracted
+ braille. Thanks to Christo de Klerk and Greg Kearney.
+- Update Irish braille (contracted and uncontracted) to the May 2019
+ version of the specification, thanks to Ronan McGuirk
+
+** Other changes
+- The python wrapper now encodes and decodes strings to/from UTF-16
+ and UTF-32 using the surrogatepass error handler. This ensures that
+ single UTF-16 surrogate characters are processed correctly by the
+ wrapper and don't raise an encoding/decoding error. Thanks to
+ Leonard de Ruijter.
+- Metadata keys and values are now case insensitive, thanks to Dave
+ Mielke.
+- Remove ~unicodedefs.cti~. It was obsolete and never meant to be
+ included by any tables. Instead use the online references as
+ mentioned in the documentation now. See also #696.
+- ~lou_checkyaml~ test reporting has been improved, thanks to Bert
+ Frees. For example it now has a ~--verbose~ option so that printing
+ of expected failures can be enabled.
+- Hyphenation tables have been removed from tables except those needed
+ for ~nocross~ rules, thanks to Bert Frees.
+
+ The idea is that the caller (for example ~odt2braille~ or
+ ~liblouisutdml~) should be able to decide for themselves which
+ hyphenation table to use. The case in which a table contains nocross
+ rules is an exception. In this case the hyphenation patterns are a
+ real part of the table. Because it is not recommended to append an
+ own hyphenation table in this case, a ~#-has-nocross~ metadata field
+ was added to indicate that a table contains nocross rules.
+- ~lou_hyphenate~ can now handle more than just words (sequences of
+ letters), e.g compound words, thanks to Bert Frees.
+
+** Deprecation notice
+- The ~noUndefinedDots~ mode has been renamed to ~noUndefined~. For
+ backwards compatibility ~noUndefinedDots~ is still available in the
+ header file and in the Python bindings, as an alias for
+ ~noUndefined~.
+
+** Backwards incompatible changes
+None
+
+** Invisible changes
+ - Internally separate more clearly the display and translation
+ phases.
+
+** New, renamed or removed tables
+*** New
+- grc-international-common.uti
+- grc-international-composed.uti
+- grc-international-decomposed.uti
+- en-nabcc.utb
+
+*** Renamed
+- gr-bb.ctb -> grc-international-en.utb
+
+*** Removed
+- unicodedefs.cti
+- fi-fi.ctb
+
+* Noteworthy changes in release 3.10.0 (2019-06-03)
+This release comes across as quiet, containing just the usual
+assortment of braille table improvements, cleanups, bug fixes and the
+classic buffer overflow patches. But beware, a lot has happened behind
+the scenes. Bert and Davy have been adding a new opcode to handle
+special emphasis situations. A number of annoying restrictions with
+regards to names, such as class names have been removed thank to Bert.
+And lastly also thanks to Bert it is now possible to define inline
+display tables in your YAML tests.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/20?closed=1][the list of closed
+issues]].
+
+** New features
+- Add a new opcode ~emphmodechars~. Thanks to Bert Frees and Davy
+ Kager.
+
+** Bug fixes
+- Remove memoization in ~checkAttr~. It wasn't implemented correctly,
+ caused some weird bugs and probably didn't do much for performance.
+ Thanks to Bert Frees.
+- Fix multiple buffer overflows in ~compilePassOpcode~. Thanks to
+ Cheng Wen for the report and to Christian Egli for the fix.
+- Fix a build problem when building without libyaml thanks to Bert
+ Frees.
+
+** Braille table improvements
+- Added modified letters to UEB thanks to Mike Gray.
+- Complete overhaul of the U.S. six-dot computer braille tables to
+ align with the CBC standard thanks to Timothy Wynn. There is now a
+ sub-table for EBAE (~en-us-compbrl.uti~) and a stand-alone table
+ (~en-us-comp6.ctb~).
+ - Conforms to the CBC standard from BANA for character definitions
+ that differ from the 8-dot ASCII braille (11 punctuation marks).
+ - Added rules for braille indicators, emphasis indicators, and
+ isolated lower-cell signs to the stand-alone table.
+ - Uncontracted and contracted EBAE tables no longer use dot 7 when
+ in computer braille mode.
+ - ~en-us-compbrl.ctb~ was deleted because it was identical to
+ ~en-us-comp6.ctb~.
+- Update Bopomofo-based Chinese Braille thanks to Sponge Jhan
+ - Correct various dot patterns of Chinese characters.
+ - Add more known pattern exceptions of Chinese characters.
+ - Apply ~word~ opcode to 倔 and 据.
+ - Change dot pattern of & to 456-12346.
+- ~de-de-comp8.ctb~ now has definitions for musical Unicode characters
+ thanks to Daniel Mayr
+- Emphasis improvements in Unified French 6 dots Braille thanks to
+ Ludovic Oger.
+- Improvements to Unified English braille, Grade 2 thanks to James
+ Datray from Freedom Scientific.
+- Numerous back-translation fixes to Grade 2 of UK English and Unified
+ English Braille thanks to Anthony Tibbs.
+- Updates to Dutch Braille thanks to Bert Frees
+ - Hyphen cancels the effect of emphasis indicator
+ - Left/right curly brackets
+ - Write currency symbols in full if they come after the number
+
+** Other changes
+- Remove various restrictions on which characters and braille cells
+ can be used in translation rules, thanks to Bert Frees.
+- Remove some code duplication in ~pattern.c~ thanks to Bert Frees
+- It is now also possible to define inline tables when a display table
+ has been defined thanks to Bert Frees
+- Nightly snapshots of liblouis are now also built for win64 thanks to
+ Bert Frees
+
+** Deprecation notice
+None
+
+** Backwards incompatible changes
+None
+
+** New, renamed or removed tables
+*** New
+- en-us-compbrl.uti
+
+*** Renamed
+- chardefs.cti -> en-chardefs.cti
+
+*** Removed
+- en-us-compbrl.ctb
+
+* Noteworthy changes in release 3.9.0 (2019-03-04)
+This release has seen a tremendous amount of work by Bert Frees. He
+was instrumental in pushing the improvements for Latvian, Norwegian
+and Slovenian. But most prominently he pushed the big change for space
+and control character handling through the door. These characters are
+now no longer hard coded in liblouis. This should solve a few long
+standing issues. Other than that there is the usual assortment of code
+improvements and cleanups.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/19?closed=1][the list of closed
+issues]].
+
+** New features
+- None
+
+** Bug fixes
+- Fix a problem in the callback registration in the Python bindings
+ thanks to Leonard de Ruijter.
+- Fixed memory leaks created by block scope compound literals thanks
+ to Martin Gieseking.
+- The hard coded rules dealing with white space have been replaced
+ with a normal table that is included in all tables. This fixes a
+ number of bugs to do with space and control characters. This (big)
+ change has been brewing for a couple of releases and has finally
+ landed. Thanks to Christian Egli and Bert Frees.
+
+** Braille table improvements
+- Major extension of the German 8 dot computer braille table thanks to
+ Ali-Riza Ciftcioglu. For example the Euro sign or quote characters
+ are finally defined.
+- Fix a few issues with Hungarian grade1 and grade2 Braille thanks to
+ Attila Hammer.
+- Various improvements to Norwegian thanks to Lars Bjørndal, Jostein
+ Austvik Jacobsen, Ammar Usama and Bert Frees.
+- Updates to Bopomofo-based Chinese Braille thanks to Sponge Jhan:
+ Improved Braille representation of Chinese characters, and rewritten
+ Kana rules using multipass statements.
+- Implement the new Slovenian Braille standard thanks to Robert Merič
+ and Bert Frees.
+- Updates to Latvian Grade 1 Braille thanks to Artis Raugulis and Bert
+ Frees.
+- Fixes to English, U.S. Grade 2 (ABAE) thanks to jdatray.
+
+** Other changes
+- Don't search for tables in ~/usr/local/share/liblouis/tables~ (or
+ the Windows equivalent) if ~LOUIS_TABLEPATH~ is set.
+- The log levels in ~liblouis.h~ are no longer exposed as ~LOG_FOO~
+ but instead are now prefixed. So ~LOG_WARN~ becomes ~LOU_LOG_WARN~
+ for example to issue a warning from a C program using liblouis. The
+ actual values remain the same, so the ABI remains stable.
+
+** Deprecation notice
+- The ~locale~ opcode was never implemented and was just silently
+ ignored. It is now removed from the tables and a warning will be
+ issued if it is found in a table.
+
+** Backwards incompatible changes
+
+** New, renamed or removed tables
+*** New
+- None
+
+*** Renamed
+- spaces.ctb -> spaces.uti
+
+*** Removed
+- None
+
+* Noteworthy changes in release 3.8.0 (2018-12-03)
+The major focus of this release is on braille table updates. There are
+major updates to German, Arabic, Chinese, Turkish, Dutch, Czech,
+Latvian, Spanish and Ethiopic. Some of these new tables have only been
+possible because Bert Frees fixed some nasty long standing bugs behind
+the scene. Also there is the usual assortment of code improvements and
+cleanups.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/18?closed=1][the list of closed
+issues]].
+
+** New features
+- None
+
+** Bug fixes
+- Fix support more than 4 classes thanks to Bert Frees.
+- Fix capitalization of words that match ~nocont~ rules thanks to Bert
+ Frees.
+
+** Braille table improvements
+- Defined the undefined character for the Czech tables thanks to Jan
+ Hegr.
+- Improvements to Unified English braille thanks to Mike Gray
+- Updated the Dutch table to the new 2017.1 braille standard thanks to
+ Davy Kager.
+- Improvements to the Polish grade 1 table, to make back-translations
+ of diacritics working
+- Fixes to Latvian braille table thanks to Gatis Grintals and Artis
+ Raugulis.
+- Improvements to traditional Mainland Chinese braille and two-cell
+ Chinese Braille thanks to Sunian Loomee.
+- Update Bopomofo-based Chinese Braille to version 2018-11 thanks to
+ Bo-Cheng Jhan
+ - Correct the default braille pattern of many Chinese characters
+ - Add various Chinese phrases involving exceptions of braille
+ patterns
+ - Modify dot patterns of dashes for readability reasons
+- Added a table for Turkish grade 2 thanks to Uğur Gürbüz and Simon
+ Aittamaa
+- Major upgrade to the German tables. They have been upgraded to /Das
+ System der deutschen Brailleschrift/ (2018). They are much smaller
+ now as they are based on ~lou_maketable~. As they now work for any
+ locale (be it Switzerland or Germany) they have been merged into one
+ set of tables for the different grades. Thanks to Christian
+ Waldvogel.
+- New table for Arabic contracted braille thanks to Ikrami Ahmad.
+- New table for Arabic computer braille thanks to Ikrami Ahmad.
+- Improvements to Arabic uncontracted braille thanks to Ikrami Ahmad.
+- Improvements to Ethiopic thanks to Tamru E. Belay.
+- New table for Spanish contracted braille thanks to Juan Pablo Bello.
+
+** Other changes
+- Updated the ~lou_allround~ and ~lou_trace~ test tools to include all
+ the mode flags described in the documentation of the
+ ~lou_translateString()~ function, thanks to Bue Vester-Andersen
+
+** Deprecation notice
+- None
+
+** Backwards incompatible changes
+- The ~pass1Only~ flag has been deprecated for a while and is now
+ removed from the code, thanks to Bue Vester-Andersen.
+
+** New, renamed or removed tables
+*** New
+- tr-g2.ctb
+- ar-ar-g2.ctb
+- ar-ar-comp8.utb
+- es-g2.ctb
+
+*** Renamed
+- de-de-accents.cti -> de-accents.cti
+- de-de-g0.utb -> de-g0.utb
+- de-de-g1.ctb -> de-g1.ctb
+- de-de-g2.ctb -> de-g2.ctb
+- de-ch-g0.utb -> de-g0.utb
+- de-ch-g1.ctb -> de-g1.ctb
+- de-ch-g2.ctb -> de-g2.ctb
+
+*** Removed
+- ar-fa.utb
+- Es-Es-g1.utb
+
+* Noteworthy changes in release 3.7.0 (2018-09-03)
+This release implements major improvements for back-translation thanks
+to concerted efforts by Bue Vester-Andersen, Bert Frees, Timothy Lee
+and others. In particular the input/output positions are now correct
+also for back-translation. There are new and improved Chinese Braille
+tables and some long awaited improvements to UEB. The release also has
+some code cleanups and documentation improvements.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/17?closed=1][the list of closed
+issues]].
+
+** New features
+- Added a new opcode ~midendnumericmodechars~. Characters defined with
+ this opcode can appear in the middle or at the end of a number
+ without canceling numeric mode. Thanks to Bue Vester-Andersen.
+
+** Bug fixes
+- Fix another stack-based buffer overflow in input parsing reported by
+ Henri Salo thanks to Christian Egli.
+- Fix input/output positions for back-translation. Thanks to excellent
+ bug reports and patches by Timothy Lee, Bert Frees heroically sat down and
+ reworked the handling of the input/output positions for
+ back-translation. This solves numerous issues with backward
+ translation.
+- The returned ~inlen~ and ~outlen~ now always match thanks to the
+ above work on input/output positions by Bert Frees.
+- Major improvements in the back-translation of capitalized words
+ (~capsword~) in conjunction with punctuation and numbers. Thanks to
+ Bue Vester-Andersen
+- Fixed a problem in the back-translation of numbers in conjunction
+ with punctuation and letters. Thanks to Rimas Kudelis and Bue
+ Vester-Andersen
+- Fix a buffer overflow in ~matchCurrentInput~. Thanks to Hongxu Chen
+ for reporting and to Christian Egli for fixing it.
+
+** Braille table improvements
+- Danish grade 2 tables: Reduced hyphenation to only the hyphens
+ necessary for correct Braille translation. Replaced the longer rules
+ with hyphenation for better cursor positioning. Corrected some words.
+ Thanks to Bue Vester-Andersen.
+- New Chinese Mandarin Braille Codes (Grade 1) and (Grade 2) thanks to
+ Sunian Loomee. The first one is for Chinese Common Braille, commonly
+ known as the old Braille where a Chinese character is composed of
+ three Braille Symbols, consonants, vowels and tones. The second
+ table is for Chinese double spelling Braille, commonly known as the
+ new Braille where Chinese character is composed of two Braille
+ Symbols, consonants and vowels, ( the tones are included in vowels ).
+- Major update to the Urdu tables thanks to Jake Kyle.
+- Back-translation of numbers in Latvian, Polish, Portuguese, Serbian,
+ and Swedish has been fixed thanks to Bue Vester-Andersen.
+- Improvements to UEB such as handling of /BLT/, /BLVD/ and /LLC/,
+ number sign placement, final-letter groupsign usage and final-letter
+ back-translation thanks to Mike Gray.
+- Significant changes to Bopomofo-based Chinese Braille. Among other
+ things there is now complete the support of /CJK Unified Ideographs
+ Extension A/ and some symbols were added for Nemeth. Thanks to
+ Sponge Jhan and 黃偉豪. With this change we can now properly handle
+ duoyinzi, Chinese words that have more than one pronunciation. The
+ granularity of the cursor movement can now reflect positions of all
+ Chinese characters.
+
+** Other changes
+- Added documentation of opcodes which were previously introduced as
+ part of the UEB work. Thanks to Bue Vester-Andersen.
+- Test suite improvements: In addition to checking the translation the
+ tests now also check if the provided ~inlen~ is the same as the
+ returned ~inlen~ and retry the test with a larger output buffer.
+- Fix a problem in the Makefiles that prevented liblouis from being
+ built with automake 1.16. This is fixed now thanks to a patch from
+ Samuel Thibault.
+- Removal of the code for the /scripting language/ for multipass
+ opcodes. This code was originally introduced in 2012 but never
+ documented. Consequently it was never used. Meanwhile the original
+ code for multipass opcodes was much improved. So there is no more
+ need for this (duplicate) code and we are removing it.
+- The nightly snapshots of pre-built windows binaries are now built
+ with UCS4 enabled.
+
+** Deprecation notice
+- None
+
+** Backwards incompatible changes
+- None
+
+** New, renamed or removed tables
+*** New
+- zhcn-g1.ctb
+- zhcn-g2.ctb
+*** Renamed
+- None
+*** Removed
+Tables that are only useful in the context of liblouisutdml were moved
+there
+- marburg.ctb
+- marburg_edit.ctb
+- nemeth.ctb
+- nemeth_edit.ctb
+- ukmaths.ctb
+- ukmaths_edit.ctb
+- wiskunde-translation.cti
+- wiskunde.ctb
+
+* Noteworthy changes in release 3.6.0 (2018-06-04)
+This release contains the usual assortment of braille table
+improvements, cleanups and bug fixes. The most prominent change is the
+refactoring of the call APIs by Bert Frees that makes the code much
+more manageable and solid and will help us in the future to evolve the
+library.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/16?closed=1][the list of closed
+issues]].
+
+** New features
+- Add metadata fields =name= and =display-name= to tables thanks to
+ Bert Frees. The =name= contains a description of the table in the
+ native language. =display-name= contains an English description.
+- YAML test enhancements
+ - You can now test both forward and backwards translation with in
+ the same YAML file and for the same set of tables tests thanks to
+ Bue Vester-Andersen. See the documentation for the
+ ~bothDirections~ testmode.
+ - Add =maxOutputLength= option in YAML tests.
+
+** Bug fixes
+- Fix a bunch of buffer overflow errors in table parsing thanks to
+ Samuel Thibault and Christian Egli (CVE-2018-11410 and
+ CVE-2018-11440).
+- Fix input-output mapping of context rules thanks to Bert Frees.
+- Fix back tracking with all caps words thanks to Bert Frees.
+- Fix context rules with lookback thanks to Bert Frees.
+- Fix a memory leak in default table resolver thanks to Timothy Lee.
+- Fix an array out of bounds error which caused a crash on i386 thanks
+ to Samuel Thibault.
+- Fix numerous stack-based buffer overflow in table parsing reported
+ by Henri Salo and Edward-L thanks to Christian Egli (CVE-2018-11577,
+ CVE-2018-11683, CVE-2018-11684 and CVE-2018-11685).
+
+** Braille table improvements
+- Fix some forward- and back-translation errors in Unified French Grade
+ 2 thanks to André-Abush Clause.
+- Updates to the Simplified-Chinese Braille Translation Table thanks
+ to Roshanson
+ - Added many polygraphs to distinguish different meanings of a word
+ - Letter identifiers have been modified. In China's school for the
+ blind, when many visually impaired students learn, the lowercase
+ letters often do not have to mark the identifiers deliberately. So
+ in this version, we this item has been deleted.
+ - Fixed a bug in the braille code that revises the space and 0
+- Updates to Bopomofo-based Chinese Braille Table thanks to Bo-Cheng Jhan
+ - Redefine some Chinese words and phrases
+ - Add various Nemeth symbols such as arrows and parenthesis
+ - Complete the support of CJK Compatibility block
+ - Fix the support of various parentheses, brackets, and braces
+ - Minor fixes (kana rules, punctuation marks, Greek alphabets)
+- New 8 dot computer braille table for Czech thanks to Jan Hegr.
+- Fixes to Czech 6 dot table thanks to Jan Hegr
+ - Fixed curly brackets representation
+ - Fixed number sign representation
+ - Added copyright sign
+- Minor fixes to Hebrew thanks to Erez Kugler.
+
+** Other changes
+- Refactoring thanks to Bert Frees
+ - Simplify the emphasis class handling by combining all related vars
+ in a struct =EmphasisClass=
+ - Simplify input/output buffer handling
+ - Combine =emphasisBuffer= and =transnoteBuffer=
+ - Group match related vars in a struct =PassRuleMatch=
+ - Remove dead code
+- Fixed many warnings thanks to Christian Egli
+
+** Deprecation notice
+- The =mode= parameter in =lou_dotsToChar= never had any effect and is
+ now deprecated.
+- In 2012 a new way to specify the test and action part in context and
+ multipass opcodes was introduced. It was never documented and has no
+ known usage in the wild. However it opens up the attack surface to
+ the table parsing code. Therefore it is deprecated and will be
+ removed in the next release.
+
+** Backwards incompatible changes
+- None
+
+** New, renamed or removed tables
+*** New
+- cs-comp8.utb
+*** Renamed
+- None
+*** Removed
+- Cz-Cz-g1.utb
+
+* Noteworthy changes in release 3.5.0 (2018-03-05)
+This release has a number of Braille table improvements, cleanups and
+meta data enhancements. The most prominent new feature however is
+probably the much improved test coverage. This has helped in tracing
+and fixing a number of long standing bugs.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/15?closed=1][the list of closed
+issues]].
+
+** New features
+- The same name can now be used in more than one ~class~ rule. The
+ effect is that both set of characters become part of that one class.
+
+** Bug fixes
+- Fix a regression in inputPositions thanks to Bert Frees
+- Treat characters within the range ~compbrlStart~ and ~compbrlEnd~ as
+ a special case. This fixes many if not most of the problems with
+ cursor position and the ~compbrlAtCursor~ mode. Thanks to Dave Mielke.
+- Fix ~swapdd~ opcode thanks to Bert Frees
+- Fix negation of attribute matcher in multipass expressions thanks to
+ Bert Frees
+
+** Braille table improvements
+- Add a display table that maps braille dots to brl/brf character set.
+ For an in depth explanation see the corresponding [[https://github.com/liblouis/liblouis/issues/503][github issue]].
+ Thanks to Rimas Kudelis
+- Major Improvements to Unified French Grade 2 thanks to André-Abush
+ Clause
+- Fix braille number input for Greek Braille thanks to Dave Mielke
+- Add a fix for "phad" according to UEB Rule 10.7.3 thanks to Anthony
+ Tibbs
+- Updates to the Urdu tables thanks to Jake Kyle from Compass Braille
+- Updates to the Chinese braille table (~zh-tw.ctb~) thanks to
+ Bo-Cheng Jhan
+- ~IPA.utb~ now contains a more complete list of phonetic symbols,
+ including some that might conflict with other tables. For this
+ reason it is not suitable for inclusion in other tables. A separate
+ table ~IPA-unicode-range.uti~ has been added for this
+ purpose. Thanks to Ludovic Oger.
+- The Mongolian table has been improved and there is now also support
+ for grade 2 thanks to Tsengel Maidar.
+- Minor updates to the Danish tables thanks to Bue Vester-Andersen
+- Fix back translation of numbers in Dutch, Finnish and Canadian
+ French, thanks to Leonard de Ruijter.
+- New table for Ukrainian thanks to Sergiy Moskalets.
+
+** Other changes
+*** Improved documentation
+- Extend the documentation on multipass opcodes. Thanks to Dave Mielke
+ and Christian Egli.
+- Remove the deprecation note of the '=' dots operand. While there are
+ still problems with back-translation we will not remove support for
+ it. See also the discussion in the [[https://github.com/liblouis/liblouis/issues/500][github issue]].
+
+*** Improved meta data information in tables
+The meta data in the tables such as locale, contraction grade, etc has
+been improved and is now also used when testing from a YAML test.
+Thanks to Bert Frees.
+
+*** Major overhaul of the YAML test suite
+**** Support for proper testing of cursor positions
+Due to problems in the cursor position computation the YAML test
+suite was improved to support proper testing of cursor position also
+in combination with input, output position and modes. In essence all
+of the liblouis API is now supported and can be tested via the YAML
+tests. Thanks to Christian Egli.
+
+**** Support for table selection via meta data query
+The tables to be tested can now be specified via a meta data query in
+addition to specifying them by filename. See the documentation for
+more details. Internally the YAML tests have been split up into tests
+that test the braille translation for a particular locale (now located
+in ~tests/braille_specs~) and tests that check a specific feature of
+liblouis. Thanks to Bert Frees.
+
+** Deprecation notice
+None
+
+** Backwards incompatible changes
+- The translation mode ~comp8Dots~ has been removed as it was never
+ really implemented anyway
+- Support for the ~pass1Only~ flag has now been removed. Thanks to Bue
+ Vester-Andersen.
+- The old UEB tables ~UEBC-g1.ctb~ and ~UEBC-g2.ctb~ have been removed
+ as the have been superseded by ~en-ueb-g1.ctb~ and ~en-ueb-g2.ctb~.
+- The french tables ~fr-2007.ctb~, ~fr-fr-g1.utb~, ~fr-fr-g2.ctb~,
+ ~fr-ca-g1.utb~ and ~fr-ca-g2.ctb~ have been removed. Use
+ ~fr-bfu-comp6.utb~ for 6 dots literary, ~fr-bfu-comp8.utb~ for 8
+ dots computer and ~fr-bfu-g2.ctb~ for contracted braille instead.
+
+** New, renamed or removed tables
+*** New
+- IPA-unicode-range.uti
+- mn-MN-g2.ctb
+- uk.utb
+*** Renamed
+- mn-MN.utb -> mn-MN-g1.utb
+*** Removed
+- fr-2007.ctb
+- fr-ca-g1.utb
+- Fr-Ca-g2.ctb
+- fr-fr-g1.utb
+- Fr-Fr-g2.ctb
+- UEBC-g1.ctb
+- UEBC-g2.ctb
+
+* Noteworthy changes in release 3.4.0 (2017-12-04)
+This release brings together a lot of work by lots of different
+people. Probably the most prominent fix is the work on output
+positions by Bue and Bert. NVDA should benefit from this. Then there
+are new and massively improved tables like the Lithuanian 6-dot table
+by Rimas or the improved back-translation for French by Michel and
+André-Abush to name just a few. There are too many contributors to
+name them here, thanks to them all.
+
+For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/14?closed=1][the list of closed
+issues]].
+
+** New features
+- Add support for ~inputPos~ and ~outputPos~ checking in
+ ~lou_checkyaml~ thanks to Bue Vester-Andersen. See the manual for
+ details and examples.
+** Bug fixes
+- output positions (~outputPos~) are now calculated based on input
+ positions (~inputPos~) thanks to Bert Frees. This avoids a whole
+ class of bugs that previously plagued the output positions. This fix
+ also obviates the need for the ~pass1Only~ flag. See below for the
+ deprecation notice.
+** Braille table improvements
+- Addition of Nemeth and Kangxi radical characters and other
+ improvements to Chinese braille (~zh-tw.ctb~) thanks to Bo-Cheng
+ Jhan and 黃偉豪.
+- Improvements to the Spanish chardefs table thanks to Luis Lorente
+ Barajas and Simon Aittamaa.
+- Fixed a lowercase ó in Spanish first reported for NVDA thanks to
+ Sukil Etxenike.
+- New Norwegian 6-dot display braille table for Braillo embossers
+ thanks to Lars Bjørndal
+- Added a bunch of whitespace-like codepoints as spaces thanks to
+ Rimas Kudelis
+- Added Lithuanian 6-dot table thanks to Rimas Kudelis.
+- Addition of more characters to the French tables thanks to Samuel
+ Thibault
+- Improvements to the Hungarian tables thanks to Attila Hammer
+- Improvements to the Mongolian tables thanks to Tsengel Maidar
+- Fix some math signs in Czech Braille (~cs-chardefs.cti~). Thanks to
+ Christian Herden of ViewPlus for reporting this.
+- Updates to the SEB British Braille Tables thanks to Paul Wood
+- Massive improvements to French back-translation thanks to Michel
+ Such and André-Abush Clause
+** Other changes
+*** Improved documentation
+- Bue Vester-Andersen added some notes about back-translation and
+ documented all possible values of the ~mode~ parameter. Also the
+ description of ~decpoint~ and ~litdigit~ was improved.
+- The ~match~ opcode is now documented thanks to Mike Gray and
+ Christian Egli.
+
+*** lou_maketable
+Numerous bug fixes and performance enhancements thanks to Bert Frees
+
+*** Code refactoring
+Many global variables have been removed thanks to Bert Frees
+
+*** Code formatting
+Thanks to clang-format There is now a uniform coding style over the
+whole code base
+
+*** Fix broken NMakefile
+Thanks to Davy Kager building with nmake should work again
+
+** Deprecation notice
+The ~pass1Only~ flag has been deprecated. Its use should be avoided,
+and it will be completely removed from the code in the next version of
+Liblouis. When using the ~pass1Only~ flag in this release you will get
+a warning.
+
+** Backwards incompatible changes
+None
+
+** New, renamed or removed tables
+*** New
+- no-no-braillo-047-01.dis
+- lt-6dot.utb
+*** Renamed
+None
+*** Removed
+None
+
+* Noteworthy changes in release 3.3.0 (2017-09-04)
+This release brings a slew of Braille table improvements, fixes a
+number of security related bugs and introduces a new tool to generate
+liblouis Braille tables based on a corpus of know good Braille
+translations. For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/13?closed=1][the list
+of closed issues]].
+
+** New features
+*** maketable tool
+A new tool ~lou_maketable~ enables the creation of tables based on a
+corpus of known good Braille translations. This has huge potential to
+simplify table maintenance for tables that have so far been dominated
+by large exception lists. Thanks to Bert Frees.
+*** Meta data query API
+A new API and a corresponding command line tool to query table meta
+data thanks to Bert Frees
+
+** Bug fixes
+*** Back translation
+- UEB grade 2
+ - Fix back-translation of whole word contractions followed by other
+ contractions thanks to James Teh.
+ - Fix back-translation for contractions followed by punctuation
+ thanks to James Teh.
+*** Security
+- Fix a number of CVEs (illegal address access, buffer overflow and
+ use-after-free or in terms of CVEs: CVE-2017-13738, CVE-2017-13739,
+ CVE-2017-13740, CVE-2017-13741, CVE-2017-13742 and CVE-2017-13744)
+ thanks to Mike Gorse.
+- Fix CVE-2017-13743 thanks to Christian Egli.
+
+** Braille table improvements
+- New table for Croatian grade 1 Braille thanks to Zlatko Sobočan.
+- Fixes and tests for Slovak Braille thanks to Simon Aittamaa
+- Numerous fixes in the character definitions of the Spanish tables
+ thanks to Simon Aittamaa
+- Unified French 6 dots and 8 dots improvements for back-translation
+ thanks to Michel Such
+- Updates to the Chinese braille table thanks to Coscell Kao
+- Updates to Nemeth character definitions thanks to Attila Hammer
+- The Hungarian tables now conform to the new 2017 standard thanks to
+ Attila Hammer
+
+** Backwards incompatible changes
+- The constant ~otherTrans~ has been removed in both the C API and the
+ corresponding Python bindings.
+- The constants ~ucBrl~, ~noUndefinedDots~ and ~partialTrans~ have
+ different values now in both the C API and the corresponding Python
+ bindings.
+
+** New, renamed or removed tables
+*** New
+- hr-g1.ctb
+*** Renamed
+- hr.ctb -> hr-comp8.utb
+*** Removed
+
+* Noteworthy changes in release 3.2.0 (2017-06-06)
+Aside from the usual improvements to Braille tables this release
+focuses on improving the internal infrastructure. Numerous bugs have
+been fixed, the CI infrastructure also checks mingw builds now and MSVC
+compatibility has been massively improved. For a detailed list of all
+the changes refer to [[https://github.com/liblouis/liblouis/milestone/10?closed=1][the list of closed issues]].
+
+** Bug fixes
+- Fix capsnocont opcode. Also mark capital letters with capsletter
+ symbol when capsnocont is defined but no begcapsword indicator is
+ defined. Thanks to Bue Vester-Andersen.
+- Fix the syllable opcode. It had been broken under some circumstances
+ since 3.0. Thanks to Bert Frees and Christian Egli.
+** Other changes
+- Fix building of Python bindings when cross-compiling. Thanks to
+ Chris Brannon
+- lou_checkyaml is now only installed if libyaml is available. Thanks
+ to Christian Egli
+- Major internal changes to improve MSVC compatibility. Thanks to Davy
+ Kager
+- Enhance documentation on usage of display tables in particular
+ in conjunction with Unicode dot patterns. Thanks to Bert Frees
+** Braille table improvements
+- Improvements to the Swedish 8-dots table (~se-se.ctb~) thanks to
+ Kevin Derome
+- Improvements to the Simplified-Chinese Braille table thanks to
+ Roshanson
+- Fixes for the International Phonetic Alphabet Braille table thanks
+ to Ludovic Oger
+- Added more Unicode symbols (fractions and not equal) to the UEB
+ tables. Thanks to Paul Wood and James Bowden.
+- Fixes to UEB grade 2 (en-ueb-g2.ctb) thanks to Mike Gray.
+- Vastly improved Danish tables thanks to Bue Vester-Andersen.
+ - New literary tables for 6 dots, mainly for embossing (no
+ back-translation).
+ - Improved back-translation in 6 dots tables, all grades.
+ - New support for many Unicode characters in all 6 dots tables.
+ - Strengthened internal tests to prevent breaking of tables due to
+ changes in the code.
+ - Fixed 8 dots tables which were broken in the previous version.
+- New Braille tables for Sinhala script thanks to Ashoka Bandula
+ Weerawardhana.
+- New Hungarian grade 2 Braille table thanks to Attila Hammer.
+- Improvements to UEB in particular to symbols specified mostly on the
+ Appendix 3 (Symbols List) from the Rules of Unified English Braille
+ Second Edition 2013 document thanks to Victor Montalvão.
+- Improvements to Persian 8 dot computer Braille table thanks to
+ Mohammadreza Rashad.
+** Backwards incompatible changes
+- The old Greek table gr-gr-g1.utb is gone. Use el.ctb instead
+- The doctests are gone. They have been superseded by the YAML tests.
+- The internal API which was previously in louis.h has been made
+ internal, i.e. the file is renamed to internal.h and the function
+ names are prepended with underscores ('_').
+
+** New, renamed or removed tables
+*** New
+- sin.cti
+- sin.utb
+- hu-hu-g2.ctb (new)
+- da-dk-6miscChars.cti (new)
+- da-dk-g16-lit.ctb (new)
+- da-dk-g26-lit.ctb (new)
+- da-dk-g26l-lit.ctb (new)
+*** Renamed
+- gr-gr-g1.utb (removed and replaced by el.ctb)
+*** Removed
+- da-chardefs6.cti
+- da-dk-common6.uti
+- da-dk-g26-patches.cti
+- da-dk-g2core.cti
+- da-dk-nocaps.uti
+
+* Noteworthy changes in release 3.1.0 (2017-03-06)
+An influx of new contributors have made sure that liblouis continues
+to improve. Back translation has seen major improvements, there are
+some additional modes to help screen readers, for many tables meta
+data has been added, the Python bindings are more robust, Windows
+support has been improved, the YAML test suite has been generalized
+and as usual new and improved braille tables have been included. On
+the licensing front we managed to get almost all tables re-licensed to
+LGPLv2.1+.
+
+** New features
+*** Meta data
+Most of the translation tables now contain meta data. This makes them
+discoverable. Programs can use the lou_findTable function to find a
+table based on a query.
+
+*** noUndefinedDots mode
+Add a noUndefinedDots mode to disable the output of dot numbers when
+back-translating undefined patterns. Thanks to James Teh.
+
+When back translating input from a braille keyboard cell by cell, it is
+desirable to output characters as soon as they are produced.
+Similarly, when back translating contracted braille, it is desirable to
+provide a "guess" to the user of the characters they typed. To achieve
+this, liblouis needs to have the ability to produce no text when
+indicators (which don't produce a character by themselves) are not
+followed by another cell. This works already for indicators liblouis
+knows about such as capital sign, number sign, etc., but it does not
+work for indicators which are not (and cannot be) specifically defined
+as indicators. For example, in UEB, dots 4 5 6 alone produces the text
+"\456/". Setting the noUndefinedDots mode suppresses this dot number
+output.
+
+*** partialTrans mode
+Add a partialTrans mode to specify that back-translation input should
+be treated as an incomplete word. Thanks to James Teh.
+
+If this mode is set, rules that apply only for complete words or at
+the end of a word will not take effect. This is intended to be used
+when translating input typed on a braille keyboard to provide a rough
+idea to the user of the characters they are typing before the word is
+complete.
+
+*** YAML test framework
+The YAML framework has been extended and is much more useful now. You
+can test multiple tables within one YAML file, you can define test
+tables directly inline and you can test multiple tables using the same
+test data. Refer to the documentation for the details.
+
+If really not wanted the YAML tests can be disabled by specifying
+~configure --without-yaml~.
+
+** Bug fixes
+- Fixes implicit declaration of 'pattern_check' thanks to Reiner Dolp
+- Fix a stackoverflow crash on applications with smaller stack size.
+ Thanks to Victor Montalvão.
+- Fix the \v escape sequence. Thanks to Davy Kager.
+- The Python bindings now give a helpful error if liblouis has been
+ compiled with a different character size than Python. Thanks to Matt
+ Wenn.
+- Massive bug fixes in multipass rules. Dave Mielke has done a
+ tremendous job improving the multipass machinery also in the
+ context of back-translation. Where needed nofor/noback has been
+ added to the multipass rules.
+
+** Other changes
+- Improvements to the Emacs mode for editing liblouis tables thanks to
+ Christian Egli
+- Documenting lou_charSize thanks to Reiner Dolp
+- Support for relative table paths in the tests. This will make sure
+ you always know which table a test actually uses.
+- Infrastructure to build windows binaries in a Docker container,
+ thanks to Bert Frees
+
+** Braille table improvements
+- UEB improvements, thanks to Mike Gray
+ - Fixed apostrophe and back translation
+ - Added rules for Unicode apostrophe handling
+ - Improvements to UEB and Nemeth math
+- Complete overhaul of Lithuanian 8-dots table, thanks to Rimas
+ Kudelis
+- New Urdu 6 Dot Grade 1 and 2 Braille tables thanks to Jake Kyle
+- Improvements to Italian 8 dots computer braille, thanks to Simone
+ Dal Maso.
+- New table ~unicode-braille.utb~ that helps to back translate braille
+ input to Unicode braille output, thanks to Leonard de Ruijter.
+- Improvements to the Chinese braille table thanks to Coscell Kao.
+- New Turkish braille table for grade 1 that should replace the
+ old ~tr.ctb~ table, thanks to Arend Arends.
+- New Persian grade 1 table and 8-dots computer table thanks to
+ Mohammadreza Rashad.
+- New table for the International Phonetic Alphabet thanks to Ludovic
+ Oger
+- Fixes for the French 6 and 8 dots tables thanks to Michel Such. Some
+ errors have been fixed and many Unicode characters have been added.
+- Add an extended 8-dot computer braille table for U.S. English thanks
+ to Davy Kager. The table is tailored for use on Windows (CP-1252)
+ and uses dot patterns from Windows screen readers, but should be
+ useful on other platforms too.
+- New Greek table that is better than the existing Greek Grade 1
+ Braille Table (gr-gr-g1.utb) thanks to Dave Mielke.
+- Improved number back-translations on fr-fr-g1 and vi-g1 tables
+ thanks to Victor Montalvao.
+- New Chinese Braille table for use in the mainland of China thanks to
+ Kaifang Bao of RejoinTech.
+- The Black Circle character is commonly used for displaying password
+ characters. The absence of its definition leads to users not being
+ able to know how many characters were typed in such fields. This has
+ been improved for many tables thanks to Victor Montalvao.
+
+** License changes
+- DocArch has agreed to re-license their tables, so we have 8 more
+ tables under the LGPLv2.1+.
+
+** Backwards incompatible changes
+- The naming in the YAML test framework has changed slightly from
+ `tables:` to `table:`.
+
+* Noteworthy changes in release 3.0.0 (2016-07-14)
+This is the biggest release of liblouis in years. The major news are
+that we now have proper support for UEB and secondly that liblouis is
+now licensed under [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].
+
+In order to support UEB the internals of liblouis have seen a major
+rewrite. New Opcodes have been added to support the requirements for
+proper UEB for example for emphasis handling or to handle proper
+translation of numbers. Changes to the opcodes are described in the
+documentation. Some of these changes are not backwards compatible. All
+tables that come with liblouis have been migrated. If you have private
+tables look at the section on upgrading from previous versions in the
+[[https://github.com/liblouis/liblouis/wiki/Emphasis-Opcodes#upgrade-from-previous-versions][wiki]].
+
+This release also changes the C API. External applications will have
+to adapt the way they call liblouis. In particular the typeform
+parameter has changed.
+
+The license of the library and most of the tables has been changed to
+LGPLv2.1. For a detailed list which tables are still in the process of
+migrating the license refer to the [[https://github.com/liblouis/liblouis/wiki/Licensing-of-liblouis-tables][wiki page about the license change]].
+
+** New features
+- Numerous features to support UEB properly. Thanks to Mike Gray,
+ William Freeman, Davy Kager, Keith Creasy and the American Printing
+ House for the Blind for sponsoring this work.
+ - support the many emphasis classes needed for UEB.
+ - support translation of numbers according to the rules of UEB.
+ - Capitalization is now handled just like emphasis.
+ - support for numeric mode
+- UTF-8 support for all tools thanks to Christian Egli.
+- The YAML tests now allow for an optional test description. See the
+ documentation for more details.
+- Add ~lou_checkTable~ and ~lou_getTypeformForEmphClass~ to the C API
+ and to the Python bindings
+** Bug fixes
+- Stop buffer overrun in ~lou_getProgramPath~, and also free memory
+ after usage. Thanks to Michael Curran.
+** Other changes
+- The license of the library and most of the tables has been changed
+ to [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].
+- Improvements to the test suite:
+ - Output is printed to ~stderr~. This helps with locating errors when
+ testing with the YAML test suite.
+ - typeform is included in output.
+** Braille table improvements
+- Improved Finish 6-dot braille thanks to Jukka Eerikäinen
+- Improvements to the Chinese braille table thanks to Coscell Kao
+- Improvements to Mongolian thanks to Tsengel Maidar and Sreeja Param
+- Added new Slovak tables based off the official Slovak braille
+ standard thanks to Peter Vagner
+- Changes to the Norwegian tables. There are now three Norwegian 8-dot
+ tables
+ - ~no-no-comp8.ctb~: Norwegian 8-dot computer braille table
+ - ~no-no-8dot.utb~: Norwegian 8-dot braille table
+ - ~no-no-8dot-fallback-6dot-g0.utb~: Norwegian 8-dot braille table
+ with uncontracted 6-dot fallback
+- Changes to the Dutch tables
+ - Conforms better to the standard.
+ - ~nl-BE-g1.ctb~ renamed to ~nl-BE-g0.utb~
+ - ~nl-NL-g1.ctb~ renamed to ~nl-NL-g0.utb~
+- Improvements to Danish tables: Added grade 2 with limited
+ contractions to 6 and 8 dots. Corrected contraction of many words.
+ - Renamed:
+ - ~da-ansi8.dis~ -> ~da-dk-octobraille.dis~
+ - ~da-dk-g16.utb~ -> ~da-dk-g16.ctb~
+ - ~da-dk-g18.utb~ -> ~da-dk-g18.ctb~
+ - ~hyph_da_DK.dic~ -> ~hyph_brl_da_dk.dic~
+ - Removed: ~da-dk-g28caps.cti~, ~da-dk-g28-patches.cti~ and
+ ~da-chardefs8.cti~
+** Backwards incompatible changes
+- The json based harness test suite has been removed as its
+ functionality has been superceded by the YAML tests. Please use
+ these from now on.
+- A number of opcodes to handle emphasis have been renamed.
+- The C API regarding the typeform parameter has changed.
+
+* Noteworthy changes in release 2.6.5 (2015-12-1)
+This minor release introduces new tables (Mongolian and Norwegian 8
+dot) and new features to the tracing tool. But the most exiting news
+about this release is probably the fact that 12 developers have
+contributed to it, showing how widely used liblouis is and how
+actively the development progresses.
+
+** New features
+- A DEF file is now generated automatically for the windows builds.
+ Thanks to Christian Egli
+- lou_trace supports backtranslation now. Thanks to Bert Frees
+
+** Bug fixes
+- Fix a bug in the findtable code. Thanks to Michael Katzmann for the
+ report.
+- Fix some compile time warnings on Windows, thanks to Bue
+ Vester-Andersen.
+- Fixes to the logging code by Arend Arends.
+
+** Other changes
+- Add test data for EUB symbols, thanks to Paul Wood
+- Clean up dead code i.e. remove support for (undocumented) nobreak
+ opcode. Thanks to Bue Vester-Andersen.
+
+** Braille table improvements
+- New Mongolian table thanks to Tsengel Maidar and Sreeja Param.
+- Improvements to the Chinese braille table thanks to Coscell Kao.
+- Massive improvements to Norwegian, thanks to Lars Bjørndal, Ammar
+ Usama and Jostein Austvik Jacobsen. They added a 8 dot table and
+ lots of test data.
+- Improvements to Hungarian, thanks to Attila Hammer
+
+* Noteworthy changes in release 2.6.4 (2015-08-31)
+This is a minor release in terms of features. But in terms of test
+coverage and stability it is a vast improvement over previous versions
+of Liblouis. The new YAML based test suite contains more than a
+million of validated translations. Every change in Liblouis is tested
+against this corpus ensuring the change doesn't break anything.
+
+** New features
+- YAML based harness tests. Harness tests can now be written in simple
+ YAML notation and they are integrated with the normal `make check`
+ command. They can be used for both ucs2 and ucs4 and no Python is
+ required. Thanks to Christian Egli.
+
+** Bug fixes
+- Use a separate gnulib instance for the library and the tools. Use
+ the strndup module to avoid build problems on windows.
+- Fix a problem with the nocross opcode when used in combination with
+ the opcodes nocont and compbrl, thanks to Bue Vester-Andersen.
+- Fix a problem with the decoding of the harness test files. Thanks to
+ Bert Frees.
+- Fix numerous problems in the way braille indicators are handled.
+ There is now a safe version of the checkAttr function which makes
+ sure that no attributes are checked beyond the boundaries of the
+ currentInput. This fixes the random behavior with tests where the
+ emphasis extends to the end of the input string. Thanks to Christian
+ Egli.
+
+** Other changes
+- if found use texi2any to build the documentation, thanks to Martin
+ Michlmayr.
+- Fix permissions of Korean tables, thanks to Peter Lundblad.
+- Update the windows build instructions, thanks to Bue
+ Vester-Andersen.
+
+** Braille table improvements
+- Improvements to Hungarian, thanks to Attila Hammer
+- Improvements to Hungarian 8 dot and Serbian grade 1, thanks to
+ Zvonimir Stanecic
+
+* Noteworthy changes in release 2.6.3 (2015-06-01)
+Given the release number you might think this is only a minor release.
+However looking at the number of developers who contributed to it and
+the number of pull requests and issues that were solved this turns out
+to be a very impressive and solid release. Most prominently we have a
+new function to discover tables based on meta data in table headers.
+Also makeinfo is no longer required to build liblouis. And lastly we
+have numerous improvements in Braille tables such as Korean,
+Vietnamese and UEB to name just a few.
+
+** New features
+- [beta] The new function lou_findTable can be used for table
+ discovery based on meta data in table headers. Thanks to Bert Frees.
+- The Python API now has a new function to check tables aptly named
+ ~checkTable~. Thanks to Davy Kager.
+
+** Bug fixes
+- Fixed a problem in resolveTable when using a Java resolver, thanks
+ to Bert Frees
+
+** Other changes
+- The build dependency on makeinfo is now optional. If it is not
+ installed we simply do not build the documentation.
+
+** Braille table improvements
+- Improvements to Bengali, Devanagari, Kannada, Gujarati, Malayalam,
+ Telugu and Oriya, thanks to Sreeja Param
+- Corrections and improvements made to en-GB tables thanks to Paul
+ Wood
+- Vast restructuring to Korean tables. In 2006 the Institute for Korean
+ Braille modified some dots in Korean Braille. Specifically, some
+ punctuation dots are now based on English. To accommodate this change
+ and to retain the old tables, the Korean table set was revised as
+ follows:
+ - Added three files: ko-chars, the Korean characters dictionary, and
+ rules for g1 and g2.
+ - ko-g1 and ko-g2 are now interface files that includes needed
+ files.
+ - Added three files for Korean Braille 2006 revision along with a
+ test harness.
+- New table for Polish 8 dot computer braille. Thanks to Karol Pecyna.
+- New table for Vietnamese 6 dot. Thanks to Harri Pasanen.
+- Corrections and improvements made to UEB tables thanks to Paul Wood
+ - Typeform passage indicators
+ - Degree sign
+ - Dash signs
+ - Math signs
+ - Accent modifiers
+ - Accented letters
+
+* Noteworthy changes in release 2.6.2 (2015-03-02)
+This release, which was mostly pushed out the door by Bert and Mesar,
+fixes a long standing emphasis bug, adds more functionality to the
+harness test suite and improves, as usual, on Braille tables. Notably
+there is a brand new finish table backed by Celia.
+
+** New features
+- Harness tests now can test for typeform differences.
+
+** Bug fixes
+- Fix for emphasis bug, thanks to Michael Gray
+
+** Braille table improvements
+- Correction to comments in Norwegian generic tables, thanks to Lars
+ Bjørndal
+- Corrections to dot patterns in no-no-g0.utb thanks to Lars Bjørndal
+- Corrections and additional test cases for Hungarian grade 1, thanks
+ to Hammer Attila.
+- New 6-dot table for Finnish thanks to Jukka Eerikäinen from
+ Celia. The existing tables for Finnish were 8-dot, but there is an
+ official specification only for 6-dot braille in Finnish.
+
+* Noteworthy changes in release 2.6.1 (2014-12-01)
+This release focuses on table and documentation improvements. The
+documentation has been restructured to cater to people starting with
+writing Braille tables. End users will see improvements to Braille for
+Danish, Dutch, Hungarian, Irish and UK English.
+
+** New features
+*** New Braille tables
+- New grade 1 and grade 2 Gaeilge tables implementing the 2014 UIB
+ standard. Including tests, thanks to Ronan McGuirk, Mesar Hameed.
+
+** Braille table improvements
+- Updates and correction to Hungarian braille tables, thanks to Hammer
+ Attila.
+- Correction to English UK grade 2 braille tables and new tests,
+ thanks to Paul Wood, Mesar Hameed
+- Vastly improved Danish tables thanks to Bue Vester-Andersen
+ - back-translation, both in 6 dots grade 2 and 8 dots grade 2.
+ - Better handling of dash, slash, and other punctuation within words
+ in 8 dots grade 2.
+- New table for Dutch (Netherlands) thanks to Henri Apperloo from CBB
+
+** Bug fixes
+- fix a compiler warning in the logging code. Thanks Peter Lundblad
+ for reporting it and Michael Whapples for fixing the problem.
+
+** Documentation updates
+- The documentation has been restructured to be more beginner friendly
+ and a short introduction to translation table writing has been
+ added. Thanks to Joseph Lee and Christian Egli
+
+** Other changes
+- When compiling with mingw or cygwin resulting dll is liblouis.dll.
+- runHarness.py: add new output format, compact output mode suitable
+ for grepping.
+
+** Backwards incompatible changes
+- Deleted ga.ctb now superseded by ga-g1.utb and ga.g2.ctb.
+- Nl-Nl-g1.utb has been removed. It is superseded by nl-NL-g1.ctb.
+- nl-be-g1.utb has been removed. It is superseded by nl-BE-g1.ctb.
+
+* Noteworthy changes in release 2.6.0 (2014-09-01)
+This is the first release by the new maintainer team. A lot of work by
+people from across the community contributed to this release. There
+are massive additions and updates to the Braille tables (e.g.
+Afrikaans, Hebrew, many Indian languages, Korean) and also changes to
+the C API to enable call backs for error messages and warnings.
+
+** New features
+*** New Braille tables
+- Tables for Afrikaans, Cherokee, Hawaiian, Maori, Sotho and Tswana
+ were donated by Greg Kearney. Afrikaans, Cherokee, Maori and Hawaiian
+ all are grade 1 tables and with the exception of Cherokee were
+ derived from World Braille Usage 2013. The Cherokee was taken from
+ the specification published at www.cbtbc.org/cherokee/.
+*** Logging callback
+There is now a callback system in place to get error messages and
+warnings. This can be used from programs that use liblouis to log
+warnings for example.
+
+** Bug fixes
+- fix back translation problems when word gets split in unusual places
+ causing back translation of whole words for example K5 back
+ translates to Knowledgeen, M>k back translates to Moreark, and M5
+ back translates to Moren. This caused over 8400 extra back
+ translation errors in en-us-g2 and 5000 in en-ueb-g2. Thanks to Ken
+ Perry.
+- Fixed bug to prevent removal of \xffff between largesign rules. This
+ solves a Liblouisutdml bug where \xffff is used as a segment
+ delimiter.
+- Fixed a bug in back translation, when a letsign was encountered, the
+ letsign was being applied beyond the element it applied to.
+- Fix memory leaks in the default table resolver introduced in the
+ previous release.
+- Fixes to the build system by Simon Aittamaa
+
+** Braille table improvements
+- Major improvements to Indian tables thanks to the Indian National
+ Institute for Visually Handicapped, in particular Dipendra Manocha,
+ Mesar Hameed, Dinesh Kaushall and Sreeja Parameswaran:
+ - Corrected opcodes for letters, punctuation marks, digits, signs
+ etc.
+ - Updated braille codes according to prescribed braille codes for
+ each Unicode character by the Braille Council of India for all
+ Indian languages.
+ - defined rules for dealing with Nukhta character in Hindi table
+ - defined rule to insert dot-1 between consonant followed by full
+ vowel character in all Indian Languages
+ - defined rules for shifting of halant character before the
+ consonant. This character is placed after the consonant in normal
+ typing but need to be before the consonant in braille. This rule
+ is applicable for all Indian languages.
+ - defined rules for two conjunct characters "ksha and gya" used in
+ all Indian Languages for which there are specific codes in
+ Braille.
+- New Hebrew table that is based on the new unified Hebrew Braille
+ code standard that was put together on January 2014 after a
+ conference with all of the specialists in this field in Israel. It
+ includes improved representation of Hebrew letters, special letters
+ that are called Nikud, and punctuation symbols. The old Braille
+ standard is not relevant any more. Thanks to Adi Kushnir.
+- UEB table fixes: Fix ity contraction, fixed the missing end word
+ contraction ;n ;d sign 46. thanks to Ken Perry.
+- Fix for Norwegian where letsign is affecting some extra characters
+ thanks to Lars Bjørndal
+- Much improved hyphenation for Norwegian thanks to Lars Bjørndal
+- Korean Grade 2 now includes support for reading English text using
+ grade 2.
+- en-us-g1.ctb and en-ueb.g1.ctb are now able to display 8 dot Unicode
+ braille.
+
+* Noteworthy changes in release 2.5.4 (2014-03-03)
+This release contains nine months worth of braille table improvements
+for example for Danish, UEB, en-us, Nemeth, Bulgarian, Slovenian and
+many more. Also there are fixes to the core for table path resolving
+and back-translation.
+
+** New features
+ - Added function lou_registerTableResolver for plugging in a table
+ resolver callback from your host language.
+
+** Bug fixes
+ - Fixed ENDSEGMENT indicator in computer Braille thanks to John
+ Boyer.
+ - Emphasized words should now be contracted consistently thanks to
+ John Boyer.
+ - Fixed several problems with back-translation. A slash within a
+ number and strings such as 5-inch-diameter and 25-year-old-man
+ should now back-translate correctly. Thanks to John Boyer.
+ - Fixed a problem with syllable opcode. Thanks to John Boyer.
+ - Fix warnings with gcc 4.8.2. Thanks to Peter Lundblad.
+ - When a table is specified with an absolute or relative path, the
+ "includes" in that table will now work as expected, meaning files
+ in the same directory will be found.
+
+** Braille table improvements
+ - fr-bfu-comp8.utb: corrections, zero was wrongly displayed in some
+ instances.
+ - en-us-g2.ctb, en-ueb-g2.ctb: Fixes for that's, can't and s'
+ thanks to Ken Perry.
+ - en-us-g2.ctb: Fix for back-translation of things like
+ http://address.com, words including after, capsigns. thanks to
+ Ken Perry.
+ - Further corrections and testcases to the Hungarian tables thanks
+ to Hammer Attila
+ - Fixed letter sign in en-us and en-ueb tables. Thanks to John
+ Boyer and Ken Perry.
+ - UEB Fixes thanks to Mesar Hameed, Ken Perry and Joseph Lee:
+ - chardefs - correct title and fixed a long standing bug
+ where dots 46 was inserted between letters (especially for web
+ addresses).
+ - Fix problem with at sign.
+ - Removed section of accented letters, that were left behind from
+ US table.
+ - Added todo for accents, to define according to the formal docs.
+ - Corrected mathematical forall symbol.
+ - Modified emphasis dot combinations to follow UEB standard.
+ - Corrected the display of period when used as a midword.
+ - Ensure 'inin' is correctly back-translated in words such as
+ asinine, feminine and others.
+ - Bulgarian bg.ctb: updated to meet modern standards (added Latin
+ letters, corrected punctuation/mathematical symbols, misc typos).
+ Thanks to Rumiana Kamenska
+ - en-gb-g1.utb: Fixes thanks to Paul Wood
+ - Fix for the lich sign in the German tables. Thanks to Halim
+ Sahin.
+ - Nemeth improvements thanks to John Boyer.
+ - Spaces in nemethdefs.cti were changed to unbreakable spaces.
+ This was done so that Nemeth expressions would not be broken
+ between lines.
+ - The number sign is now inserted between the minus sign and the
+ number at the beginning of an expression. Some problems with
+ pass2 opcodes have also been corrected.
+ - The Esperanto table has additional punctuation characters and a
+ test harness. Thanks to Aaron Cannon.
+ - Added missing symbols to the US English BRF display table. Thanks
+ to Aaron Cannon.
+ - Improvements to the Slovenian table and a new Slovenian eight dot
+ computer table provided by Jožef Gregorc.
+ - Fixes to the Norwegian tables thanks to Lars Bjørndal
+ - Fixes for less than / greater than.
+ - Add entries for URLs, domains and file names.
+ - Added ne.utb, an alternative Nepali braille table. One of ne.utb
+ or ne.ctb will be removed/merged in a future version. Keeping
+ both for the time being so that users can test and give feedback
+ on which is most correct. Thanks to Him Prasad Gautam, and Mesar
+ Hameed
+ - Much improved danish grade 1 and grade 2 6 and 8 dot braille,
+ thanks to Bue Vester-Andersen and Mesar Hameed
+
+** Backwards incompatible changes
+ - Delete the table chardefs-ueb.cti as these rules are now provided
+ by en-ueb-chardefs.uti
+
+** Invisible changes
+ - Refactoring in compileTranslationTable.c: separated more clearly
+ the compilation from the table resolving, removed duplicate code,
+ etc.
+
+* Noteworthy changes in release 2.5.3 (2013-06-21)
+** New features
+*** New Braille tables
+ - Korean grade 1 and grade 2 thanks to Joseph Lee
+ - U.K. English 8 dot computer braille table thanks to David
+ Reynolds
+ - New Russian literary and computer braille tables thanks to Igor
+ B. Poretsky. These replace the older Russian tables which are
+ left for backwards compatibility.
+ - New hyphenation dictionary for Russian thanks to Igor B.
+ Poretsky.
+ - Updated hyphenation tables for the Norwegian language (nynorsk
+ and bokmål) thanks to Lars Bjørndal.
+ - New hyphenation dictionary for Esperanto thanks to Aaron Cannon.
+ - New Esperanto grade 1 table, using the x system for accented
+ letters, thanks to Aaron Cannon.
+
+*** runHarness.py:
+ Accept filename globs on the commandline to run specific harness files.
+ In tests/harness, one can do make <filename> or make runall
+ Removed from make check because these checks are checking the validity
+ of our tables, rather than validity of the code.
+
+** Braille Table Improvements
+ - da-dk-g2.ctb, mostly rewritten to use nocross and hyphenation
+ table.
+ - Most tables: removed the default collapse whitespace statements,
+ if you need to compress whitespace, consider adding compress.ctb
+ to the list of tables when processing.
+ - Corrections to Unified English Braille Code (Grade 1 and 2),
+ thanks to Joseph Lee
+ - Corrections to apostrophes in the Computer Spanish 8 dots Braille
+ table (Es-Es-G0.utb). Thanks to Juan C. Buno.
+ - Corrections for double angle quotation marks and emphasis marks
+ in the Norwegian Grade 0 Braille Table. Thanks to Knut Arne
+ Bjørndal.
+ - Fixes for a minor problem regarding the noletsign in Norwegian
+ contracted braille. Thanks to Lars Bjørndal.
+ - Corrections to the Italian table thanks to Igor B. Poretsky.
+ - Corrections to the Hungarian grade 1 table thanks to Hammer
+ Attila
+ - Corrections to English, U.S. Grade 2 (ABAE) table. Thanks to Ken
+ Perry for reporting the bug and John J. Boyer for fixing it.
+ - Further reorganization of the tables to remove duplication. Move
+ litdigit opcode common parts and include where needed.
+ - Removed obsolete en-us-g1.utb, which has been replaced by
+ en-us-g1.ctb.
+ - Added dictionary harness tests for: en-ueb-g2.ctb, en-us-g2.ctb.
+ - Corrections to Nemeth character definitions thanks to Neil
+ Soiffer.
+ - Corrections to the Esperanto table thanks to Aaron Cannon.
+
+** Bug Fixes
+ - Cursor position calculation is now based on the same code that
+ calculates inpos and outpos. This probably solves a number of
+ bugs.
+ - Fix nocross opcode processing.
+ - Fix several buffer over/under runs in
+ lou_translateString.c:hyphenate.
+ - Fix the '=' problem, i.e. fix inputPositions calculation for the
+ case where the equals sign is used as the dots operand. Thanks to
+ Bert Frees
+ - Fix a bug when resizing a table. Previously not all references to
+ this table were updated.
+
+** Backwards incompatible changes
+ - The feature that allowed a mapping between language code and
+ Braille table was removed as it contained a out-of-bounds access
+ bug, was never documented and probably never used. Thanks to
+ Peter Nilsson Lundblad and Jeremy Roman for analyzing this
+ problem and providing a patch.
+
+* Noteworthy changes in release 2.5.2 (2012-12-18)
+
+While initially planned as mainly a bug fix release this release
+contains some notable new features: There is a new tool to trace which
+rules have been used to perform a translation. Also along with other
+new tables the long awaited table for UEB is finally here.
+
+** New features
+*** New tool to trace rule application
+ There is a new tool (lou_trace) which helps to trace which rules
+ have been used to perform a Braille translation. This is helpful
+ for writing Braille tables. See the documentation for more
+ information.
+*** New Braille tables
+ - Inuktitut grade 1, thanks to Greg Kearney.
+ - UEB grade 1 and 2, thanks to Joseph Lee. These tables replace
+ the old UEB tables (UEBC-g1.utb and UEBC-g2.ctb).
+ - Korean table thanks to Joseph Lee
+
+** Braille Table Improvements
+ - da-dk-g2.ctb, fixes for transposed â, å, æ, ä, ø and ö,
+ corrected/improved harness tests.
+ - Corrections for en-GB-g2.ctb thanks to Paul Wood
+ - Corrections to the Hungarian grade 1 table thanks to Hammer
+ Attila
+
+** Bug Fixes
+ - Update gnulib
+ - Fix a bug in the correct opcode which causes sometimes random
+ results when translating. Thanks to Bert Frees.
+ - Fixes for compiler warnings.
+ - Fix some Valgrind warnings about invalid reads
+
+* Noteworthy changes in release 2.5.1 (2012-9-24)
+
+** Braille Table Improvements
+- Fix encoding problem in italian table and added more character
+ definitions. Thanks to Simone Dal Maso <simone.dalmaso@juvox.it>.
+- Rename it-it-g1.utb to it-it-comp6.utb and it-it-g1.utb2 to
+ it-it-comp8.utb.
+
+** Bug fixes
+- Fix outputPos and inlen where an input character generates multiple
+ output characters.
+
+* Noteworthy changes in release 2.5.0 (2012-9-10)
+
+This release contains a tremendous amount of work many developers.
+Many long standing bugs have been fixed. The tables can finally be in
+UTF-8. A grand table cleanup removed duplication from the tables.
+There are now two extensive test frameworks for table writers. A
+number of new tables have been contributed on top of the usual
+assortment of table improvements. Thanks to all of this liblouis has
+already seen quite a bit of uptake in a number of places, notably the
+new DAISY pipeline will ship with this release of liblouis.
+
+NOTE: If you have private tables you might want to migrate them to
+utf-8. To do this just use iconv as follows:
+
+ $ iconv -f latin-1 -t utf-8 <input >output
+
+** New features
+*** New Braille tables
+ - Estonian grade 0, thanks to Jürgen Dengo.
+ - Portuguese 8 dot Computer braille, Thanks to Rui Fontes
+*** UTF-8 support in tables
+ Braille tables can now contain UTF-8 in the opcode arguments.
+*** Improvements to the python bindings
+ All constants defined in liblouis.h are now exposed in the bindings.
+*** Add a doctest infrastructure
+ These tests are based on the Python doctest framework and are only
+ run if there is a Python interpreter on the system
+*** Add a test harness
+ This test infrastructure allows the user to do table tests in a
+ simple and concise syntax. These tests are based on the Python
+ nose testing framework and are only run if either Python 2.x or
+ 3.x with the related nose python module is installed on the
+ system. See the documentation for more information. Thanks to
+ Mesar Hameed.
+*** Add a test harness generator
+ A harness generator that uses simple text files with a little
+ formatting to help to generate the json harness files. The purpose
+ of this tool is to make it much easier and faster to add checks
+ for a given table. You are expected to read the generated harness
+ file and make necessary changes, the tool only helps you to get
+ the tests into the harness format, not check their validity.
+*** Support for Python 3 in the Python bindings
+ The Python bindings now work for both Python 2 and Python 3.
+ Thanks to Michael Whapples.
+
+** Improved C-based test framework
+ - Improved the test framework to be able to test translations
+ involving Unicode.
+ - Added numerous tests, e.g. for lowercase and Unicode, for the
+ input position, for repeated, etc.
+
+** Improved the documentation
+ - Document the test harness (json format, fields, flags).
+ - Document the use of Valgrind to find memory leaks
+ - Improve the documentation on the display opcode
+
+** Bug fixes
+ - lou_allround and lou_translate now properly handle Unicode
+ characters
+ - Fix some issues reported by Valgrind
+ - Fix inputPos for situation where context and multipass opcodes
+ are involved
+ - Fixed a number of bugs with the letter, uppercase and lowercase
+ opcodes when dealing with Unicode
+ - Fixed a couple of bugs with hyphenation (documentation, Python
+ bindings and a number of buffer overruns in the C library).
+ Thanks Milan Zamazal <pdm@brailcom.org> for reporting this.
+ - Fix a bug in the $a. matcher in the multipass rules where only 32
+ chars were matched. It now matches 0xffff chars.
+ - Fix a bug reported by James Teh related to pass1Only
+
+** Braille Table Improvements
+ - all table files have consistent encoding, UTF-8.
+ - The grand table cleanup: Reorganize the tables to remove
+ duplication. Move common parts such as Latin letter, eight and
+ six dot digit definitions to separate files which are then
+ included. This should ease table maintenance. Thanks to Mesar Hameed.
+ - Fixes to de-de-comp8.ctb thanks to Aliminator83@gmail.com
+ - hu1.ctb renamed to hu-hu-g1.ctb
+ - hu.ctb renamed to hu-hu-comp8.ctb
+ - eo.ctb renamed to eo-g1.ctb
+ - Fixes to eo-g1.ctb thanks to Aaron Cannon <cannona@fireantproductions.com>
+ - hu-hu-g1.ctb: improvements and extensive test harness, with
+ working back-translation, Thanks to Hammer Attila
+ - Fixes to fr-bfu-comp6.utb and fr-bfu-comp8.utb thanks to Michel
+ Such <michel.such@free.fr>
+ - Reworked and extended Ethiopic braille table ethio-g1.ctb,
+ superseeds gez*, thanks to Dr. Tamru E. Belay
+ <g.braille@sympatico.ca>
+ - Fixes to no-no-g3.ctb thanks to Lars Bjørndal <lars@lamasti.net>
+
+* Noteworthy changes in release 2.4.1 (2012-2-22)
+
+** New features
+ - Czech hyphenation table thanks to Jan Hegr
+ - Spanish grade 1 table provided by José Enrique Fernández del
+ Campo and Juan Carlos Buño Suárez
+ - New Tamil table thanks to Mesar Hameed
+
+** Braille Table Improvements
+ - Improvements to the Portuguese grade1 braille tables
+ - Updates and additions to Icelandic 8-dot braille table.
+ - Improvements to the uncontracted Spanish computer braille table.
+ - Improvements to the Norwegian braille table thanks to David Hole.
+
+* Noteworthy changes in release 2.4.0 (2012-01-31)
+
+** New features
+ - New Generic Farsi Grade 1 table: A new table for Generic Farsi
+ Grade 1 braille has been provided by Mesar Hameed.
+ - Emacs mode for editing Braille tables thanks to Christian Egli
+
+** Braille Table Improvements
+ - Improvements to the French comp6 and comp8 braille tables
+ - Improvements to the Romanian braille table
+ - Improvements to the Generic Arabic Grade 1 table
+ - Improvements to the Czech tables thanks to Jan Halousek and to
+ Jan Hegr
+
+* Noteworthy changes in release 2.3.0 (2011-05-09)
+
+This release contains support for many more languages than before
+(Swedish, Kurdish, Ethiopic, Serbian, many Indian languages). The
+search path for tables is now a list of paths. Finally there is the
+usual assortment of bug fixes.
+
+** New features
+*** Multiple table search path
+ The environment variable LOUIS_TABLEPATH can now contain a list of
+ paths (separated by commas) where liblouis should look for tables.
+ This allows the user to keep local tables.
+*** New --quiet option for lou_checktable
+ lou_checktable writes to stderr even in the case of success. This
+ can now be suppressed with the new option --quiet.
+*** New Swedish table
+ A new table for Swedish braille has been provided by Samuel
+ Thibault.
+*** New table for Sorani (Kurdish)
+ A new table for Sorani (Kurdish) Braille has been donated by Peter
+ Engström from Index Braille
+*** New table for Ethiopic
+ A new table for Ethiopic Braille has been donated by Tamru E.
+ Belay PH.D from Adaptive Technology Center for the Blind (ATCB)
+*** New table for Serbian
+ A new table for Serbian Braille has been donated by Peter Engström
+ from Index Braille
+
+** Improved the documentation
+ The deprecated opcodes have been moved to a separate section
+
+** Bug fixes
+ - Fixed a long standing bug with an infinite loop in the table
+ compiler
+
+** Braille Table Improvements
+ - Improvements to the Chinese braille table
+ - Improvements to the Flemish Braille Math Code tables
+ - Improvements to the Dutch Braille tables
+ - Improvements to the Spanish Braille tables.
+ - Fixes for the uncontracted French 6 and 8 dot tables
+ - Improved support for Italian 8 dot
+ - Improvements to the Generic Arabic Grade 1 table
+
+* Noteworthy changes in release 2.2.0 (????-??-??)
+
+** New features
+*** New tables
+ - Support for many indian languages
+ - Support for Icelandic 6- and 8-dot
+ - Support for Catalan
+ - Support for Dutch Braille (for Belgium and the Netherlands)
+ - Support for Flemish Braille Math Code (a.k.a. Woluwe code)
+
+
+*** New functions to make libraries relocatable
+ Two new functions, to set the search path for tables and files.
+ They make the library relocatable. See the in the documentation
+ for lou_setDataPath and lou_getDataPath.
+
+** Bug fixes
+ - Improved support for Spanish
+ - Improved Norwegian tables
+
+* Noteworthy changes in release 2.1.1 (2010-8-23)
+
+** Bug fixes
+ - Fixed problems with the Danish grade 2 table
+ - Fixed problems with the Marburg maths table for mathematics and
+ the UK maths table for mathematics
+
+* Noteworthy changes in release 2.1.0 (2010-8-19)
+
+** New features
+*** New tables
+ - Added tables for Portuguese grade 1 and 2
+ - Added unicode.dis for Unicode braille
+*** Modified tables
+ - Updated Danish tables
+*** Implemented language to table mapping
+*** New format of error messages
+ The error messages are now reported in a format similar to the one
+ used in gcc.
+*** New opcode
+ - added undefined opcode
+*** Python bindings
+ - Allow the user to configure the maximum output length by
+ specifying a number by which the input length is multiplied
+ using the outlenMultiplier module variable. The default will
+ handle the case where every input character is undefined in the
+ translation table. Previously, this was hard-coded to 2, which
+ was insufficient in some cases.
+ - Add compbrlLeftCursor mode constant.
+ - Add compileString function which wraps lou_compileString.
+ - Corrections/clarifications to docstrings.
+ - Add python binding for the lou_hyphenate function.
+ - Added python wrapper for lou_backTranslateString and lou_backTranslate.
+
+*** liblouisxslt as an example
+ Add liblouisxslt as an example to python/examples. This is
+ basically an extension of libxslt that lets you invoke liblouis
+ from an xslt stylesheet to do Braille translation on text nodes
+ for example.
+*** compbrlLeftCursor
+ Added a patch provided by Volker Bijewitz to implement
+ compbrlLeftCursor.
+
+** Bug fixes
+*** output cursorPos
+ Fix the output cursorPos when the compbrlAtCursor mode is enabled
+ and the characters around the cursor translate to multiple braille
+ cells, such as in the Chinese braille tables.
+*** outpos when doing back translation
+ Include a patch by Timothy Lee to fix outpos when doing back translation
+ (issue 11)
+*** inputPos/outputPos for undefined characters
+ Fix the input/output position arrays for characters in the input
+ which are undefined in the translation table.
+*** table fixes
+ - Fixed a bug with back translation of '*n'. (issue 13)
+ - Fixes to the en-us-g2.ctb table
+*** Python bindings
+ - Remove unnecessary imports, allowing the bindings to run in Python
+ 2.7. (issue 12)
+ - lou_translate* writes output information in typeform, so
+ allocate enough bytes for it. Fixes possible buffer overruns and
+ resultant crashes.
+*** Miscellaneous
+ - Fixes to the man page generation to fix issues that were
+ reported by the Debian packaging builder
+ - Do not invoke help2man when cross-compiling
+ - Documentation updates (issue 10)
+ - Removing noletsign defaults
+ - Many small fixes
+
+* Noteworthy changes in release 2.0.0 (2010-7-6)
+
+** New features
+*** New functions
+ - Adding lou_charSize function
+
+* Noteworthy changes in release 1.9.0 (2010-6-29)
+
+** New features
+*** New functions
+ - lou_dotsToChar and lou_charToDots function
+ - Added lou_compileString for adding entries to tables at
+ run-time.
+
+* Noteworthy changes in release 1.8.0 (2009-11-23)
+
+This release contains a number of improvements notably the integration
+of gnulib, the automatic generation of man pages and the addition of
+tables for German grade 2.
+
+** New features
+*** New tables
+ - Tables German Grade 2
+ - Swiss German
+ - Swedish (1989 standard)
+ - Swedish (1996 standard)
+
+*** Modified tables
+ - Updated Norwegian tables
+ - Updated Chinese braille table
+
+*** man pages
+ All tools accept the --version and --help options and are
+ documented in man pages
+
+*** Corpus based test cases for tables
+ You can now have corpus based tests for tables. See the README in
+ tests/table_test_corpuses.
+
+** Bug fixes
+ - config.h is no longer exported
+ - Many small fixes
+
+* Noteworthy changes in release 1.7.0 (2009-08-21)
+
+The main new feature of this release is the support for UK and Marburg
+math. Other changes include a new tool to check hyphenation and the
+usual improvement and addition of tables. Also The test suite has been
+enhanced and finally passes.
+
+** New features
+*** New tables
+ - Tables for UK and Marburg math
+ - Hong Kong Cantonese
+ - Hebrew
+ - Hungarian
+ - Slovene
+ - Tibetan
+ - Irish
+ - Maltese
+
+*** Modified tables
+ - Updated Norwegian tables
+ - Bug fixes in Russian tables
+ - Updated French tables
+
+*** lou_checkhyphens tool
+ New tool to check hyphenation
+*** rpm spec file
+*** Test cases for tables
+ The tables can now be tested with `make check'
+*** New opcodes
+ - noback and nofor opcode prefixes
+ - grouping opcode
+ - multipass subopcodes
+
+** Bug fixes
+ - Fix for library name and Python bindings
+ - Documentation fixes
+ - Many small fixes
+
+* Noteworthy changes in release 1.6.2 (2009-05-01)
+
+This release contains a new opcode for Malaysian Braille. See the
+documentation for a description of the new opcode.
+
+** New features
+
+*** repword opcode
+The repword opcode is needed for Malaysian Braille
+
+* Noteworthy changes in release 1.6.1 (2009-04-21)
+
+This is mostly a bug fix release. It contains many bug fixes that were
+discovered in the course of developing UK Math tables.
+
+** Bug fixes
+
+*** bug fixes for correct, context and multipass opcodes
+*** bug fixes for largesign opcode
+*** fixed bug with French back-translation
+*** fixed the installation path for docs
+*** documentation improvement
+
+* Noteworthy changes in release 1.6 (2009-03-04)
+
+This release features support for Danish and Russian and updated
+tables for French and Norwegian. The search path for tables can now be
+specified using an environment variable. Finally there is the usual
+assortment of bug fixes.
+
+** New features
+
+*** exactdots opcode
+The exactdots opcode is intended for use in liblouisxml
+semantic-action files to specify exact dot patterns, as in
+mathematical codes.
+*** LOUIS_TABLEPATH env variable
+You can now specify where liblouis is to look for tables with the
+LOUIS_TABLEPATH environment variable.
+*** New Tables for Danish and Russian
+There is now support for Danish and Russian.
+
+** Bug fixes
+
+*** Updated French and Norwegian tables
+*** Use stdcall calling convention if building for Windows
+
+** Changes in behavior
+
+None
+
+* Noteworthy changes in release 1.5 (2009-01-21)
+
+This is a big release for liblouis. It's the first time that it is
+done from the Google code page. A number of people have contributed,
+namely John Boyer (table debugger, bug fixes), Eitan Isaacson (Python
+bindings), James Teh (Python bindings, bug fixes), Christian Egli
+(documentation) and Michel Such (table for French grade 2).
+
+
+** New features
+
+*** Python bindings
+The liblouis library can now be used from Python. For more info
+consult the README file in the python directory.
+
+*** Table debugger
+liblouis now comes with a debugger that can help to find problems with
+translation tables.
+
+*** French table for grade 2
+There is now a translation table for French grade 2.
+
+*** pass1Only mode bit
+The new pass1Only mode bit will help developers of screen readers as
+the cursor will stay where it is expected to.
+
+** Bug fixes
+
+Fix the inpos array values for the case where a rule has an output
+length which is larger than its input length.
+
+fixed multi-word phrases
+
+fixed bug in character display
+
+fixed bug in findOpcodeName
+
+lou_version now returns the correct liblouis version
+
+** Changes in behavior
+
+None
+
+#+OPTIONS: toc:nil num:nil
diff --git a/README b/README
new file mode 100644
index 0000000..76a9712
--- /dev/null
+++ b/README
@@ -0,0 +1,111 @@
+# Introduction
+
+[![Build Status](https://travis-ci.org/liblouis/liblouis.svg?branch=master)](https://travis-ci.org/liblouis/liblouis)
+
+Liblouis is an open-source braille translator and back-translator
+named in honor of [Louis Braille][]. It features support for computer
+and literary braille, supports contracted and uncontracted translation
+for [many languages][] and has support for hyphenation. New languages
+can easily be added through tables that support a rule- or dictionary
+based approach. Tools for testing and debugging tables are also
+included. Liblouis also supports math braille (Nemeth and Marburg).
+
+Liblouis has features to support screen-reading programs. This has led
+to its use in two open-source screenreaders, [NVDA][] and [Orca][]. It
+is also used in some commercial assistive technology applications for
+example by [ViewPlus][].
+
+Liblouis is based on the translation routines in the [BRLTTY][]
+screenreader for Linux. It has, however, gone far beyond these
+routines. In Linux and Mac OSX it is a shared library, and in Windows
+it is a DLL.
+
+Liblouis is free software licensed under the [GNU LGPLv2.1+][] (see
+the file COPYING.LESSER).
+
+The command line tools, are licensed under the [GNU GPLv3+][] (see the
+file COPYING).
+
+# Documentation
+
+For documentation, see the [liblouis documentation][] (either as info
+file, html, txt or pdf) in the doc directory. For examples
+of translation tables, see `en-us-g2.ctb`, `en-us-g1.ctb`,
+`chardefs.cti`, and whatever other files they may include in the
+tables directory. This directory contains tables for many languages.
+The Nemeth files will only work with the sister library
+[liblouisutdml][].
+
+# Installation
+
+After unpacking the distribution tarball from [releases][] go to the directory it creates.
+You now have the choice to compile liblouis for either 16- or 32-bit
+unicode. By default it is compiled for the former. To get 32-bit Unicode
+run configure with `--enable-ucs4`.
+
+After running `./configure` run `make` and then `make install`. You
+must have root privileges for the installation step.
+(For other ways of installation, see the file HACKING)
+
+This will produce the liblouis library and the programs `lou_allround`
+(for testing the library), `lou_checkhyphens`, `lou_checktable` (for
+checking translation tables), `lou_debug` (for debugging translation
+tables), `lou_translate` (for extensive testing of forward and
+backwards translation) and `lou_trace` (for tracing if individual
+translations). For more details see the liblouis documentation.
+
+If you wish to have man pages for the programs you might want to
+install `help2man` before running configure.
+
+If you want to run the test suite with `make check` you should install
+`libyaml` as that will enable extensive tests on the tables. If you
+want to skip those tests you can do so by running `configure --without-yaml`.
+
+# Participating
+
+You can contribute to Liblouis in several different ways:
+
+ - If you have comments, questions, or want to use your knowledge to
+ help others, come join the conversation on either the mailing list
+ or on IRC. You can reach us at liblouis-liblouisxml@freelists.org
+ or in channel #liblouis on irc:irc.oftc.net.
+
+ - To report a problem or request a feature, please file an issue.
+
+ - Of course, we welcome pull requests and patches.
+
+Finally, if you want to see what we have for the future and learn more
+about our release cycles, all this information is detailed on the
+[wiki](https://github.com/liblouis/liblouis/wiki/Release-schedule)
+
+# Release Notes
+
+For notes on the newest and older releases see the file NEWS.
+
+# History
+
+Liblouis was begun in 2002 largely as a business decision by
+[ViewPlus][]. They believed that they could never have good braille
+except as part of an open source effort and knew that John Boyer was
+dying to start just such a project. So ViewPlus did start it on the
+agreement that they would give a small monthly stipend to John Boyer
+that allowed him to pay for sighted assistants. While ViewPlus has not
+contributed much to the coding, it certainly has contributed and
+continues to contribute to liblouis through that support of John
+Boyer.
+
+[Louis Braille]: http://en.wikipedia.org/wiki/Louis_Braille
+[many languages]: https://github.com/liblouis/liblouis/tree/master/tables
+[NVDA]: http://www.nvda-project.org/
+[Orca]: http://live.gnome.org/Orca
+[ViewPlus]: http://www.viewplus.com
+[BRLTTY]: http://mielke.cc/brltty/
+[GNU LGPLv2.1+]: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+[GNU GPLv3+]: https://www.gnu.org/licenses/gpl.html
+[liblouisutdml]: http://www.liblouis.org/
+[liblouis documentation]: http://www.liblouis.org/documentation/liblouis.html
+[releases]: https://github.com/liblouis/liblouis/releases
+
+<!-- Local Variables: -->
+<!-- mode: markdown -->
+<!-- End: -->
diff --git a/README.md b/README.md
new file mode 120000
index 0000000..100b938
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+README
\ No newline at end of file
diff --git a/README.windows b/README.windows
new file mode 100644
index 0000000..6547c4d
--- /dev/null
+++ b/README.windows
@@ -0,0 +1,30 @@
+This file describes how to build liblouis.dll That is the only binary
+file needed by someone who wishes to use liblouis in an application. The
+tables are in the tables subdirectory of the liblouis distribution. For
+an overview of liblouis see README.
+
+First, obtain the liblouis source, either by downloading the latest
+tarball or from the Git repository. See HACKING for instructions.
+If you downloaded the tarball, unpack it.
+
+To build liblouis.dll you will need the Microsoft command-line C/C++
+tools. You will also have to set environment variables correctly. You
+can download the Community version of Microsoft Visual Studio, including
+Visual C++, and the Microsoft Windows SDK for free. It has a batch file
+that sets environment variables and then displays a command prompt.
+
+You might have to add the Visual Studio path
+(C:\Program Files (x86)\Microsoft Visual Studio\2017\Community) to the
+"Path" of the environment variables manually.
+
+Next, go to the subdirectory windows. Edit the file configure.mk. If you
+want 32-bit Unicode change the 2 in the line UCS=2 to a 4.
+
+Open the "VS 2017 Developer Command Prompt" from the Start menu and use the
+"cd" command goto the "\liblouis-x.x.x\windows" folder, then type:
+
+nmake /f Makefile.nmake
+
+The directory will contain liblouis.dll and liblouis.lib, along with
+object files. Note that those liblouis.dll and liblouis.lib only are for
+32-bit usage.
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..9b766af
--- /dev/null
+++ b/TODO
@@ -0,0 +1,71 @@
+This file describes the TODO items for the liblouis project. -*- org -*-
+
+When a task is done and accepted, consider moving it into the NEWS
+file, with a bit of extra info.
+
+* 2.6
+** Document the changes to LOUIS_TABLEPATH
+** Extend and document the scripting language
+http://www.freelists.org/post/liblouis-liblouisxml/Very-preliminary-documentation-of-scripting-language
+
+* near term
+** (google issue 9) bindings should provide variable to pick up table location at runtime.
+
+** Fix the problem that LOUIS_TABLEPATH always looks in the standard PATH
+even if that was not in the environment var
+
+** fix bug described by squash_space.c
+
+** Esperanto table should not be blacklisted, work out whats wrong and make sure it is usable.
+
+* unallocated
+** (google issue 16) infinite loop in lou_backtranslate.
+
+** (google issue 6) italword opcode not documented
+
+** (google issue 4) problem with contraction cursor position and compBrlAtCursor.
+
+** Add java bindings
+It would be nice to have some canonical java bindings. There are
+several potential candidates:
+- Bindings by Michael Whapples
+- Minimal jna bindings by SBS
+- port jni bindings from utdml
+- new jna bindings by Bert Frees
+
+** Enhance the API to handle pre-hyphenated text
+This basically just means to port the code which is in the java
+bindings to C so that it can be used from other bindings
+
+** Add readline support to all the tools
+
+** Use portable malloc from gnulib
+to get rid of the windows #ifdefs
+
+** Enhance translation table compiler to issue warnings
+[jb]: It should be an error to define the same single-cell dot pattern
+for two different characters. I am considering issuing an error
+message and rejecting the table if this happens.
+
+[mh]: It would also be very helpful if we could issue a warning when a
+character has been defined as two or more braille representations.
+Could we have these as warnings, not errors please.
+
+** followup to above enhancement, either at the terminal or when called by
+bindings, we should be able to give more useful feedback, i.e. could
+not translate because table not found, or table found but has errors,
+or characters undefined, etc. also see:
+http://www.nvda-project.org/ticket/2448
+
+** Optimize for use with large tables
+When used with dictionary based tables liblouis is very slow. The
+issue is probably that the hash key is not very well suited for this
+use case and there will be tons of collisions, making the lookup
+essentially linear.
+
+There was a discussion about this on the mailing list
+(http://www.freelists.org/post/liblouis-liblouisxml/Improved-hash-function-for-tables).
+
+** apply the the patch by Igor B. Poretsky
+
+** apply the jptest_patch
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..e0eadec
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright 2008 Eitan Isaacson
+# Copyright 2008 Christian Egli
+# Copyright 2012 Michael Whapples
+#
+# This file is part of liblouis.
+#
+# liblouis is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# liblouis is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with liblouis. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+# autogen.sh glue for liblouis
+#
+# Requires: automake 1.9, autoconf 2.57+
+# Conflicts: autoconf 2.13
+set -e
+
+# Refresh GNU autotools toolchain.
+echo Cleaning autotools files...
+find -type d -name autom4te.cache -print0 | xargs -0 rm -rf \;
+find -type f \( -name missing -o -name install-sh -o -name mkinstalldirs \
+ -o -name depcomp -o -name ltmain.sh -o -name configure \
+ -o -name config.sub -o -name config.guess -o -name config.h.in \
+ -o -name mdate-sh -o -name texinfo.tex \
+ -o -name Makefile.in -o -name aclocal.m4 \) -print0 | xargs -0 rm -f
+
+echo Running autoreconf...
+autoreconf --force --install
+
+exit 0
diff --git a/build-aux/link-warning.h b/build-aux/link-warning.h
new file mode 100644
index 0000000..fda0194
--- /dev/null
+++ b/build-aux/link-warning.h
@@ -0,0 +1,28 @@
+/* GL_LINK_WARNING("literal string") arranges to emit the literal string as
+ a linker warning on most glibc systems.
+ We use a linker warning rather than a preprocessor warning, because
+ #warning cannot be used inside macros. */
+#ifndef GL_LINK_WARNING
+ /* This works on platforms with GNU ld and ELF object format.
+ Testing __GLIBC__ is sufficient for asserting that GNU ld is in use.
+ Testing __ELF__ guarantees the ELF object format.
+ Testing __GNUC__ is necessary for the compound expression syntax. */
+# if defined __GLIBC__ && defined __ELF__ && defined __GNUC__
+# define GL_LINK_WARNING(message) \
+ GL_LINK_WARNING1 (__FILE__, __LINE__, message)
+# define GL_LINK_WARNING1(file, line, message) \
+ GL_LINK_WARNING2 (file, line, message) /* macroexpand file and line */
+# define GL_LINK_WARNING2(file, line, message) \
+ GL_LINK_WARNING3 (file ":" #line ": warning: " message)
+# define GL_LINK_WARNING3(message) \
+ ({ static const char warning[sizeof (message)] \
+ __attribute__ ((__unused__, \
+ __section__ (".gnu.warning"), \
+ __aligned__ (1))) \
+ = message "\n"; \
+ (void)0; \
+ })
+# else
+# define GL_LINK_WARNING(message) ((void) 0)
+# endif
+#endif
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..927aa61
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,221 @@
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.68)
+AC_INIT([Liblouis], [3.12.0], [liblouis-liblouisxml@freelists.org], [liblouis], [http://www.liblouis.org])
+AC_CONFIG_SRCDIR([liblouis/lou_backTranslateString.c])
+AM_CONFIG_HEADER(liblouis/config.h)
+
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE([-Wall dist-zip])
+
+# Checks for programs.
+# Try to compile using C99
+AC_PROG_CC_C99
+
+# gnulib for the library
+gl_EARLY
+# gnulib for the tools
+gl_tools_EARLY
+
+gl_INIT
+gl_tools_INIT
+
+# Checks for more programs.
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AM_PROG_AR
+
+# Check if the user wants to enable yaml tests
+AC_ARG_WITH([yaml],
+ [AS_HELP_STRING([--with-yaml], [enable YAML-based tests @<:@default=yes@:>@])],
+ [with_yaml=$withval],
+ [])
+
+# Checks for libraries.
+if test "x$with_yaml" == xno; then
+ AC_DEFINE([WITHOUT_YAML],[1],[Disable YAML tests])
+else
+ AC_CHECK_LIB([yaml], [yaml_parser_initialize])
+fi
+
+AM_CONDITIONAL([WITH_YAML], [test "x$ac_cv_lib_yaml_yaml_parser_initialize" == xyes -a "x$with_yaml" != xno])
+
+# If libyaml is missing warn or die depending on --with-yaml
+if test x$ac_cv_lib_yaml_yaml_parser_initialize != xyes; then
+ case "$with_yaml" in
+ yes) AC_MSG_ERROR([--with-yaml was given, but libyaml was not found]);;
+ no) ;;
+ *) AC_MSG_WARN([libyaml was not found. YAML tests will be skipped]);;
+ esac
+fi
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+
+# Checks for library functions.
+AC_FUNC_MEMCMP
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([memset])
+
+# This is for stuff that absolutely must end up in pyconfig.h.
+# Please use pyport.h instead, if possible.
+AH_TOP([
+#ifndef LOUISCFG_H
+#define LOUISCFG_H
+])
+AH_BOTTOM([
+#endif /*LOUISCFG_H*/
+])
+
+# increment if the interface has additions, changes, removals.
+LIBLOUIS_CURRENT=20
+
+# increment any time the source changes; set to 0 if you increment
+# CURRENT
+LIBLOUIS_REVISION=0
+
+# increment if any interfaces have been added; set to 0 if any
+# interfaces have been changed or removed. removal has precedence over
+# adding, so set to 0 if both happened.
+LIBLOUIS_AGE=0
+
+AC_SUBST(LIBLOUIS_CURRENT)
+AC_SUBST(LIBLOUIS_REVISION)
+AC_SUBST(LIBLOUIS_AGE)
+
+# needed to build the liblouis.def
+DLL_VERSION=`expr ${LIBLOUIS_CURRENT} - ${LIBLOUIS_AGE}`
+AC_SUBST(DLL_VERSION)
+
+AC_ISC_POSIX
+AC_HEADER_STDC
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+# catch as many warnings as possible with the help of the gnulib manywarnings module
+gl_MANYWARN_ALL_GCC([warnings])
+# Set up the list of the pointless, undesired warnings.
+nw=
+nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings
+nw="$nw -Wsuggest-attribute=pure" # ignore recommendations to use
+nw="$nw -Wsuggest-attribute=format" # attributes, most of these only
+nw="$nw -Wsuggest-attribute=const" # work in gcc
+nw="$nw -Wsuggest-attribute=noreturn"
+# Enable all GCC warnings not in this list.
+gl_MANYWARN_COMPLEMENT([warnings], [$warnings], [$nw])
+for w in $warnings; do
+ gl_WARN_ADD([$w])
+done
+
+# define an additional recursive make target to format the sources.
+# Also check if clang-format is installed
+AM_EXTRA_RECURSIVE_TARGETS([format-sources])
+AC_CHECK_PROG([SOURCE_FORMATTER], [clang-format], [clang-format])
+AM_CONDITIONAL([HAVE_SOURCE_FORMATTER], [test x$SOURCE_FORMATTER = xclang-format])
+
+# GNU help2man creates man pages from --help output; in many cases,
+# this is sufficient, and obviates the need to maintain man pages
+# separately. However, some developers do not have it so we do not
+# make its use mandatory.
+if test "x$cross_compiling" = xyes; then
+ AC_MSG_WARN([cannot generate manual pages while cross compiling])
+else
+ AC_CHECK_PROG([HELP2MAN], [help2man], [help2man])
+fi
+AM_CONDITIONAL([HAVE_HELP2MAN], [test x$HELP2MAN = xhelp2man])
+
+# Only run parts of the tests if we are cross compiling
+AM_CONDITIONAL([CROSS_COMPILING], [test "x$cross_compiling" = xyes])
+
+# Check for makeinfo version >= 5, required for building documentation.
+have_makeinfo_5=false
+AC_PROG_SED
+AC_CHECK_PROG([MAKEINFO_FOUND], [makeinfo], [yes])
+if test x"${MAKEINFO_FOUND}" = xyes
+then
+ MAKEINFO_VERSION_REQ=5
+ AC_MSG_CHECKING([for makeinfo version >= $MAKEINFO_VERSION_REQ])
+ MAKEINFO_VERSION=`makeinfo --version | sed -ne 's/^\(makeinfo\|texi2any\) .* \([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*.*$/\2/p'`
+ if test x$MAKEINFO_VERSION = x -o 0$MAKEINFO_VERSION -lt $MAKEINFO_VERSION_REQ
+ then
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([Program 'makeinfo' version >= $MAKEINFO_VERSION_REQ is required. Documentation will not be built.])
+ else
+ AC_MSG_RESULT([yes])
+ have_makeinfo_5=true
+ fi
+else
+ AC_MSG_WARN([Missing program 'makeinfo', Documentation will not be built. Please install you you want documentation or refer to online resources.])
+fi
+AM_CONDITIONAL([HAVE_MAKEINFO_5], [test x$have_makeinfo_5 = xtrue])
+
+AC_ARG_ENABLE(ucs4,
+ AC_HELP_STRING(--enable-ucs4, Enable 4 byte-wide characters),
+ [AC_DEFINE([WIDECHARS_ARE_UCS4], [1], [Define if widechars are ucs4])],
+ [enable_ucs4=no])
+
+AC_MSG_CHECKING([whether 4 byte-wide characters should be supported])
+AC_MSG_RESULT($enable_ucs4)
+
+case "$enable_ucs4" in
+yes) WIDECHAR_TYPE='unsigned int';;
+*) WIDECHAR_TYPE='unsigned short int';;
+esac
+AC_SUBST(WIDECHAR_TYPE)
+AM_CONDITIONAL([HAVE_UCS4], [test x$enable_ucs4 = xyes])
+
+case $host in
+ *mingw* | *cygwin*)
+ CFLAGS="$CFLAGS -Wl,--add-stdcall-alias"
+ LDFLAGS="$LDFLAGS -avoid-version"
+ ;;
+esac
+
+AC_CANONICAL_HOST
+build_macosx=no
+case $host_os in
+ darwin*)
+ build_macosx=yes
+ ;;
+esac
+AM_CONDITIONAL([OSX], [test "$build_macosx" = "yes"])
+
+AC_CONFIG_FILES([
+ Makefile
+ doc/Makefile
+ man/Makefile
+ liblouis/Makefile
+ liblouis/liblouis.h
+ windows/Makefile
+ windows/include/Makefile
+ windows/utils/Makefile
+ tables/Makefile
+ liblouis.pc
+ tests/Makefile
+ tests/braille-specs/Makefile
+ tests/resolve_table.h
+ tests/tables/Makefile
+ tests/tables/emphclass/Makefile
+ tests/tables/moreTables/Makefile
+ tests/tables/resolve_table/Makefile
+ tests/tables/resolve_table/dir_1/Makefile
+ tests/tables/resolve_table/dir_1/dir_1.1/Makefile
+ tests/tables/resolve_table/dir_2/Makefile
+ tests/tablesWithMetadata/Makefile
+ tests/ueb_test_data/Makefile
+ tests/yaml/Makefile
+ python/Makefile
+ python/setup.py
+ python/louis/Makefile
+ tools/Makefile
+ tools/gnulib/Makefile
+ tools/lou_maketable.d/Makefile
+ tools/lou_maketable.d/lou_maketable
+ gnulib/Makefile])
+AC_OUTPUT
diff --git a/contrib/braille-input.el b/contrib/braille-input.el
new file mode 100644
index 0000000..df7c46a
--- /dev/null
+++ b/contrib/braille-input.el
@@ -0,0 +1,291 @@
+;;; braille-input.el --- A simple input method for braille
+
+;; Copyright (C) 2013 Swiss Library for the Blind, Visually Impaired and Print Disabled
+
+;; This file is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation, either version 3 of the License,
+;; or (at your option) any later version.
+
+;; This file is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+
+;;; Code:
+
+;; This code is inspired by Vim unicode braille () and http://benizi.com/vim/braille.vim
+
+(robin-define-package "braille-numerical"
+ "A simple input method for braille."
+
+ ("b0" ?⠀)
+ ("b1" ?⠁)
+ ("b2" ?⠂)
+ ("b12" ?⠃)
+ ("b3" ?⠄)
+ ("b13" ?⠅)
+ ("b23" ?⠆)
+ ("b123" ?⠇)
+ ("b4" ?⠈)
+ ("b14" ?⠉)
+ ("b24" ?⠊)
+ ("b124" ?⠋)
+ ("b34" ?⠌)
+ ("b134" ?⠍)
+ ("b234" ?⠎)
+ ("b1234" ?⠏)
+ ("b5" ?⠐)
+ ("b15" ?⠑)
+ ("b25" ?⠒)
+ ("b125" ?⠓)
+ ("b35" ?⠔)
+ ("b135" ?⠕)
+ ("b235" ?⠖)
+ ("b1235" ?⠗)
+ ("b45" ?⠘)
+ ("b145" ?⠙)
+ ("b245" ?⠚)
+ ("b1245" ?⠛)
+ ("b345" ?⠜)
+ ("b1345" ?⠝)
+ ("b2345" ?⠞)
+ ("b12345" ?⠟)
+ ("b6" ?⠠)
+ ("b16" ?⠡)
+ ("b26" ?⠢)
+ ("b126" ?⠣)
+ ("b36" ?⠤)
+ ("b136" ?⠥)
+ ("b236" ?⠦)
+ ("b1236" ?⠧)
+ ("b46" ?⠨)
+ ("b146" ?⠩)
+ ("b246" ?⠪)
+ ("b1246" ?⠫)
+ ("b346" ?⠬)
+ ("b1346" ?⠭)
+ ("b2346" ?⠮)
+ ("b12346" ?⠯)
+ ("b56" ?⠰)
+ ("b156" ?⠱)
+ ("b256" ?⠲)
+ ("b1256" ?⠳)
+ ("b356" ?⠴)
+ ("b1356" ?⠵)
+ ("b2356" ?⠶)
+ ("b12356" ?⠷)
+ ("b456" ?⠸)
+ ("b1456" ?⠹)
+ ("b2456" ?⠺)
+ ("b12456" ?⠻)
+ ("b3456" ?⠼)
+ ("b13456" ?⠽)
+ ("b23456" ?⠾)
+ ("b123456" ?⠿)
+ ("b7" ?⡀)
+ ("b17" ?⡁)
+ ("b27" ?⡂)
+ ("b127" ?⡃)
+ ("b37" ?⡄)
+ ("b137" ?⡅)
+ ("b237" ?⡆)
+ ("b1237" ?⡇)
+ ("b47" ?⡈)
+ ("b147" ?⡉)
+ ("b247" ?⡊)
+ ("b1247" ?⡋)
+ ("b347" ?⡌)
+ ("b1347" ?⡍)
+ ("b2347" ?⡎)
+ ("b12347" ?⡏)
+ ("b57" ?⡐)
+ ("b157" ?⡑)
+ ("b257" ?⡒)
+ ("b1257" ?⡓)
+ ("b357" ?⡔)
+ ("b1357" ?⡕)
+ ("b2357" ?⡖)
+ ("b12357" ?⡗)
+ ("b457" ?⡘)
+ ("b1457" ?⡙)
+ ("b2457" ?⡚)
+ ("b12457" ?⡛)
+ ("b3457" ?⡜)
+ ("b13457" ?⡝)
+ ("b23457" ?⡞)
+ ("b123457" ?⡟)
+ ("b67" ?⡠)
+ ("b167" ?⡡)
+ ("b267" ?⡢)
+ ("b1267" ?⡣)
+ ("b367" ?⡤)
+ ("b1367" ?⡥)
+ ("b2367" ?⡦)
+ ("b12367" ?⡧)
+ ("b467" ?⡨)
+ ("b1467" ?⡩)
+ ("b2467" ?⡪)
+ ("b12467" ?⡫)
+ ("b3467" ?⡬)
+ ("b13467" ?⡭)
+ ("b23467" ?⡮)
+ ("b123467" ?⡯)
+ ("b567" ?⡰)
+ ("b1567" ?⡱)
+ ("b2567" ?⡲)
+ ("b12567" ?⡳)
+ ("b3567" ?⡴)
+ ("b13567" ?⡵)
+ ("b23567" ?⡶)
+ ("b123567" ?⡷)
+ ("b4567" ?⡸)
+ ("b14567" ?⡹)
+ ("b24567" ?⡺)
+ ("b124567" ?⡻)
+ ("b34567" ?⡼)
+ ("b134567" ?⡽)
+ ("b234567" ?⡾)
+ ("b1234567" ?⡿)
+ ("b8" ?⢀)
+ ("b18" ?⢁)
+ ("b28" ?⢂)
+ ("b128" ?⢃)
+ ("b38" ?⢄)
+ ("b138" ?⢅)
+ ("b238" ?⢆)
+ ("b1238" ?⢇)
+ ("b48" ?⢈)
+ ("b148" ?⢉)
+ ("b248" ?⢊)
+ ("b1248" ?⢋)
+ ("b348" ?⢌)
+ ("b1348" ?⢍)
+ ("b2348" ?⢎)
+ ("b12348" ?⢏)
+ ("b58" ?⢐)
+ ("b158" ?⢑)
+ ("b258" ?⢒)
+ ("b1258" ?⢓)
+ ("b358" ?⢔)
+ ("b1358" ?⢕)
+ ("b2358" ?⢖)
+ ("b12358" ?⢗)
+ ("b458" ?⢘)
+ ("b1458" ?⢙)
+ ("b2458" ?⢚)
+ ("b12458" ?⢛)
+ ("b3458" ?⢜)
+ ("b13458" ?⢝)
+ ("b23458" ?⢞)
+ ("b123458" ?⢟)
+ ("b68" ?⢠)
+ ("b168" ?⢡)
+ ("b268" ?⢢)
+ ("b1268" ?⢣)
+ ("b368" ?⢤)
+ ("b1368" ?⢥)
+ ("b2368" ?⢦)
+ ("b12368" ?⢧)
+ ("b468" ?⢨)
+ ("b1468" ?⢩)
+ ("b2468" ?⢪)
+ ("b12468" ?⢫)
+ ("b3468" ?⢬)
+ ("b13468" ?⢭)
+ ("b23468" ?⢮)
+ ("b123468" ?⢯)
+ ("b568" ?⢰)
+ ("b1568" ?⢱)
+ ("b2568" ?⢲)
+ ("b12568" ?⢳)
+ ("b3568" ?⢴)
+ ("b13568" ?⢵)
+ ("b23568" ?⢶)
+ ("b123568" ?⢷)
+ ("b4568" ?⢸)
+ ("b14568" ?⢹)
+ ("b24568" ?⢺)
+ ("b124568" ?⢻)
+ ("b34568" ?⢼)
+ ("b134568" ?⢽)
+ ("b234568" ?⢾)
+ ("b1234568" ?⢿)
+ ("b78" ?⣀)
+ ("b178" ?⣁)
+ ("b278" ?⣂)
+ ("b1278" ?⣃)
+ ("b378" ?⣄)
+ ("b1378" ?⣅)
+ ("b2378" ?⣆)
+ ("b12378" ?⣇)
+ ("b478" ?⣈)
+ ("b1478" ?⣉)
+ ("b2478" ?⣊)
+ ("b12478" ?⣋)
+ ("b3478" ?⣌)
+ ("b13478" ?⣍)
+ ("b23478" ?⣎)
+ ("b123478" ?⣏)
+ ("b578" ?⣐)
+ ("b1578" ?⣑)
+ ("b2578" ?⣒)
+ ("b12578" ?⣓)
+ ("b3578" ?⣔)
+ ("b13578" ?⣕)
+ ("b23578" ?⣖)
+ ("b123578" ?⣗)
+ ("b4578" ?⣘)
+ ("b14578" ?⣙)
+ ("b24578" ?⣚)
+ ("b124578" ?⣛)
+ ("b34578" ?⣜)
+ ("b134578" ?⣝)
+ ("b234578" ?⣞)
+ ("b1234578" ?⣟)
+ ("b678" ?⣠)
+ ("b1678" ?⣡)
+ ("b2678" ?⣢)
+ ("b12678" ?⣣)
+ ("b3678" ?⣤)
+ ("b13678" ?⣥)
+ ("b23678" ?⣦)
+ ("b123678" ?⣧)
+ ("b4678" ?⣨)
+ ("b14678" ?⣩)
+ ("b24678" ?⣪)
+ ("b124678" ?⣫)
+ ("b34678" ?⣬)
+ ("b134678" ?⣭)
+ ("b234678" ?⣮)
+ ("b1234678" ?⣯)
+ ("b5678" ?⣰)
+ ("b15678" ?⣱)
+ ("b25678" ?⣲)
+ ("b125678" ?⣳)
+ ("b35678" ?⣴)
+ ("b135678" ?⣵)
+ ("b235678" ?⣶)
+ ("b1235678" ?⣷)
+ ("b45678" ?⣸)
+ ("b145678" ?⣹)
+ ("b245678" ?⣺)
+ ("b1245678" ?⣻)
+ ("b345678" ?⣼)
+ ("b1345678" ?⣽)
+ ("b2345678" ?⣾)
+ ("b12345678" ?⣿))
+
+(register-input-method
+ "braille-numerical"
+ "braille"
+ 'robin-use-package
+ "braille"
+ "A simple numerical braille input method")
+
diff --git a/contrib/liblouis.el b/contrib/liblouis.el
new file mode 100644
index 0000000..3a9bafa
--- /dev/null
+++ b/contrib/liblouis.el
@@ -0,0 +1,141 @@
+;;; liblouis.el --- mode for editing liblouis translation tables
+
+;; Copyright (C) 2009, 2011 Christian Egli
+
+;; This file is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation, either version 3 of the License,
+;; or (at your option) any later version.
+
+;; This file is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(defvar liblouis-mode-hook nil
+ "Normal hook run when entering liblouis mode.")
+
+(defvar liblouis-mode-abbrev-table nil
+ "Abbrev table in use in liblouis mode buffers.")
+(define-abbrev-table 'liblouis-mode-abbrev-table ())
+
+(eval-after-load "compile"
+ '(add-to-list 'compilation-error-regexp-alist
+ ;; WARNING: foo.txt: line 13: section title out of sequence: expected level 3, got level 4
+ ;; ERROR: foo.txt: line 18: only book doctypes can contain level 0 sections
+ '("^\\(ERROR\\|WARNING\\|DEPRECATED\\): \\([^:]*\\): line \\([0-9]+\\):" 2 3)))
+
+(defconst liblouis-comment-regexp "\\(\\s-+.*\\)??")
+
+(defconst liblouis-font-lock-keywords
+ (list
+
+ ;; Comment Lines
+ (cons "^#.*$" 'font-lock-comment-face)
+
+ ;; Opcodes (with one word arg)
+ (list
+ (concat "^"
+ (regexp-opt
+ '("include" "locale" "noletsign" "noletsignbefore" "noletsignafter"
+ "nocont" "compbrl" "contraction" "emphclass") 'words)
+ "\\s-+\\([^ ]+\\)" liblouis-comment-regexp "$")
+ '(1 font-lock-keyword-face)
+ '(2 font-lock-constant-face)
+ '(3 font-lock-comment-face nil t))
+
+ ;; Opcodes (with one dot pattern arg)
+ (list
+ (concat "^"
+ (regexp-opt
+ '("numsign" "capsletter" "firstwordital"
+ "lastworditalbefore" "lastworditalafter"
+ "firstletterital" "lastletterital" "singleletterital"
+ "firstwordbold" "lastwordboldbefore" "lastwordboldafter"
+ "firstletterbold" "lastletterbold" "singleletterbold"
+ "firstwordunder" "lastwordunderbefore" "lastwordunderafter"
+ "firstletterunder" "lastletterunder" "singleletterunder"
+ "begcomp" "endcomp"
+ "begcaps" "endcaps" "letsign" "nocontractsign"
+ "exactdots") 'words)
+ "\\s-+\\([0-9-@]+\\)" liblouis-comment-regexp "$")
+ '(1 font-lock-keyword-face)
+ '(2 font-lock-constant-face)
+ '(3 font-lock-comment-face nil t))
+
+ ;; Opcodes (with two args)
+ (list
+ (concat "^"
+ (regexp-opt
+ '("comp6" "after" "before" "space" "punctuation" "digit" "lowercase" "uppercase"
+ "letter" "uplow" "litdigit" "sign" "math" "display" "repeated" "always"
+ "nocross" "syllable" "largesign" "word" "partword" "joinnum" "joinword"
+ "lowword" "sufword" "prfword" "begword" "begmidword" "midword" "midendword"
+ "endword" "prepunc" "postpunc" "begnum" "midnum" "endnum" "decpoint" "hyphen"
+ "begemphword" "endemphword" "begemphphrase" "lenemphphrase") 'words)
+ "\\s-+\\([^ ]+?\\)\\s-+\\([-0-9=@a-f]+\\)" liblouis-comment-regexp "$")
+ '(1 font-lock-keyword-face)
+ '(2 font-lock-string-face)
+ '(3 font-lock-constant-face)
+ '(4 font-lock-comment-face nil t))
+
+ ;; Opcodes (with three args)
+ (list
+ (concat "^"
+ (regexp-opt
+ '("endemphphrase") 'words)
+ "\\s-+\\([^ ]+?\\)\\s-+\\([^ ]+?\\)\\s-+\\([-0-9=@a-f]+\\)" liblouis-comment-regexp "$")
+ '(1 font-lock-keyword-face)
+ '(2 font-lock-string-face)
+ '(3 font-lock-string-face)
+ '(4 font-lock-constant-face)
+ '(5 font-lock-comment-face nil t))
+
+ ;; Opcodes (with two args where the second one is not a dot pattern)
+ (list
+ (concat "^"
+ (regexp-opt
+ '("class" "replace" "context" "correct" "pass2" "pass3" "pass4" ) 'words)
+ "\\s-+\\([^ ]+?\\)\\s-+\\([^ ]+\\)" liblouis-comment-regexp "$")
+ '(1 font-lock-keyword-face)
+ '(2 font-lock-string-face)
+ '(3 font-lock-constant-face)
+ '(4 font-lock-comment-face nil t))
+ ; FIXME: "multind" "lenitalphrase" lenboldphrase lenunderphrase "swapcd" "swapdd" "capsnocont"
+ )
+ "Default expressions to highlight in liblouis mode.")
+
+;;###autoload
+(define-derived-mode liblouis-mode prog-mode "liblouis"
+ "Major mode for editing liblouis translation tables.
+Turning on liblouis mode runs the normal hook `liblouis-mode-hook'.
+"
+ (modify-syntax-entry ?\' ".")
+ (modify-syntax-entry ?# "< b")
+ (modify-syntax-entry ?\n "> b")
+
+ (set (make-local-variable 'compile-command)
+ (concat "lou_checktable " buffer-file-name))
+
+ (set (make-local-variable 'require-final-newline) t)
+
+ (set (make-local-variable 'font-lock-defaults)
+ '(liblouis-font-lock-keywords
+ nil ; KEYWORDS-ONLY: no
+ nil ; CASE-FOLD: no
+ ((?_ . "w")) ; SYNTAX-ALIST
+ ))
+
+ (set (make-local-variable 'comment-start) "#")
+
+ (run-hooks 'liblouis-mode-hook))
+
+(provide 'liblouis-mode)
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..afefb06
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,19 @@
+doc_DATA = \
+ liblouis.html \
+ liblouis.txt
+
+EXTRA_DIST = \
+ liblouis.html \
+ liblouis.txt
+
+CLEANFILES = $(EXTRA_DIST)
+
+info_TEXINFOS = liblouis.texi
+
+# generate one big html file
+AM_MAKEINFOHTMLFLAGS = --no-headers --no-split
+
+SUFFIXES = .txt
+
+.texi.txt:
+ $(MAKEINFO) --plaintext $< -o $@
diff --git a/doc/liblouis.texi b/doc/liblouis.texi
new file mode 100644
index 0000000..fecfe65
--- /dev/null
+++ b/doc/liblouis.texi
@@ -0,0 +1,3821 @@
+\input texinfo
+@c %**start of header
+@setfilename liblouis.info
+@documentencoding UTF-8
+@include version.texi
+@settitle Liblouis User's and Programmer's Manual
+
+@dircategory Misc
+@direntry
+* Liblouis: (liblouis). A braille translator and back-translator
+@end direntry
+
+@finalout
+
+@c Macro definitions
+
+@defindex opcode
+
+@c Opcode.
+@macro opcode{name, args}
+@opcodeindex \name\
+@anchor{\name\ opcode}
+@item \name\ \args\
+@end macro
+
+@macro opcoderef{name}
+@code{\name\} opcode (@pxref{\name\ opcode,\name\,@code{\name\}})
+@end macro
+
+@c Opcode.
+@macro deprecatedopcode{name, args, replacement}
+@opcodeindex \name\
+@anchor{\name\ opcode}
+@item \name\ \args\
+This opcode is deprecated. Use the @opcoderef{\replacement\} instead.
+@end macro
+
+@copying
+This manual is for liblouis (version @value{VERSION}, @value{UPDATED}),
+a Braille Translation and Back-Translation Library derived from the
+Linux screen reader @acronym{BRLTTY}.
+
+@vskip 10pt
+
+@noindent
+Copyright @copyright{} 1999-2006 by the BRLTTY Team.
+
+@noindent
+Copyright @copyright{} 2004-2007 ViewPlus Technologies, Inc.
+@uref{www.viewplus.com}.
+
+@noindent
+Copyright @copyright{} 2007, 2009 Abilitiessoft, Inc.
+@uref{www.abilitiessoft.org}.
+
+@noindent
+Copyright @copyright{} 2014, 2016 Swiss Library for the Blind, Visually
+Impaired and Print Disabled. @uref{www.sbs.ch}.
+
+@vskip 10pt
+
+@quotation
+This file is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser (or library) General Public License
+(LGPL) as published by the Free Software Foundation; either version 3,
+or (at your option) any later version.
+
+This file is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser (or Library) General Public License LGPL for more details.
+
+You should have received a copy of the GNU Lesser (or Library) General
+Public License (LGPL) along with this program; see the file COPYING.
+If not, write to the Free Software Foundation, 51 Franklin Street,
+Fifth Floor, Boston, MA 02110-1301, USA.
+@end quotation
+@end copying
+
+@titlepage
+@title Liblouis User's and Programmer's Manual
+
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author by John J. Boyer
+
+@c The following two commands start the copyright page.
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c Output the table of contents at the beginning.
+@contents
+
+@ifnottex
+@node Top
+@top Liblouis User's and Programmer's Manual
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Introduction::
+* How to Write Translation Tables::
+* Notes on Back-Translation::
+* Table Metadata::
+* Testing Translation Tables interactively::
+* Automated Testing of Translation Tables::
+* Programming with liblouis::
+* Concept Index::
+* Opcode Index::
+* Function Index::
+* Program Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+How to Write Translation Tables
+
+* Overview::
+* Hyphenation Tables::
+* Character-Definition Opcodes::
+* Braille Indicator Opcodes::
+* Emphasis Opcodes::
+* Special Symbol Opcodes::
+* Special Processing Opcodes::
+* Translation Opcodes::
+* Character-Class Opcodes::
+* Swap Opcodes::
+* The Context and Multipass Opcodes::
+* The correct Opcode::
+* The match Opcode::
+* Miscellaneous Opcodes::
+
+Emphasis Opcodes
+
+* Emphasis class::
+* Contexts::
+* Fallback behavior::
+* Computer braille::
+
+Contexts
+
+* None::
+* Letter::
+* Word::
+* Phrase::
+* Symbol::
+
+Testing Translation Tables interactively
+
+* lou_debug::
+* lou_trace::
+* lou_checktable::
+* lou_allround::
+* lou_translate (program)::
+* lou_checkhyphens::
+* lou_checkyaml::
+
+Programming with liblouis
+
+* Overview (library)::
+* Data structure of liblouis tables::
+* How tables are found::
+* Deprecation of the logging system::
+* lou_version::
+* lou_translateString::
+* lou_translate::
+* lou_backTranslateString::
+* lou_backTranslate::
+* lou_hyphenate::
+* lou_compileString::
+* lou_getTypeformForEmphClass::
+* lou_dotsToChar::
+* lou_charToDots::
+* lou_registerLogCallback::
+* lou_setLogLevel::
+* lou_logFile::
+* lou_logPrint::
+* lou_logEnd::
+* lou_setDataPath::
+* lou_getDataPath::
+* lou_getTable::
+* lou_findTable::
+* lou_indexTables::
+* lou_checkTable::
+* lou_readCharFromFile::
+* lou_free::
+* lou_charSize::
+* Python bindings::
+
+@end detailmenu
+@end menu
+
+@node Introduction
+@chapter Introduction
+
+Liblouis is an open-source braille translator and back-translator
+derived from the translation routines in the BRLTTY screen reader for
+Linux. It has, however, gone far beyond these routines. It is named in
+honor of Louis Braille. In Linux and Mac OSX it is a shared library,
+and in Windows it is a DLL. For installation instructions see the
+README file. Please report bugs and oddities to the mailing list,
+@email{liblouis-liblouisxml@@freelists.org}
+
+This documentation is derived from the BRLTTY manual, but
+it has been extensively rewritten to cover new features.
+
+@section Who is this manual for
+
+This manual has two main audiences: People who want to write or
+improve a braille translation table and people who want to use the
+braille translator library in their own programs. This manual is
+probably not for people who are looking for some turn-key braille
+translation software.
+
+@section How to read this manual
+
+If you are mostly interested in writing braille translation tables
+then you want to focus on @ref{How to Write Translation Tables}. You
+might want to look at @ref{Notes on Back-Translation} if you are
+interested in back-translation. Read @ref{Table Metadata} if you want
+to find out how you can augment your tables with metadata in order to
+make them discoverable by programs. Finally @ref{Testing Translation
+Tables interactively} and @ref{Automated Testing of Translation
+Tables} will show how your braille translation tables can be tested
+interactively and also in an automated fashion.
+
+If you want to use the braille translation library in your own program
+or you are interested in enhancing the braille translation library
+itself then you will want to look at @ref{Programming with liblouis}.
+
+@node How to Write Translation Tables
+@chapter How to Write Translation Tables
+
+For many languages there is already a translation table, so before
+creating a new table start by looking at existing tables to modify
+them as needed.
+
+Typically, a braille translation table consists of several parts.
+First are header and includes, in which you write what the table is
+for, license information and include tables you need for your table.
+
+Following this, you'll write various translation rules and lastly you
+write special rules to handle certain situations.
+
+@cindex Opcode
+A translation rule is composed of at least three parts: the opcode
+(translation command), character(s) and braille dots. An opcode is a
+command you give to a machine or a program to perform something on
+your behalf. In liblouis, an opcode tells it which rule to use when
+translating characters into braille. An operand can be thought of as
+parameters for the translation rule and is composed of two parts: the
+character or word to be translated and the braille dots.
+
+For example, suppose you want to read the word @samp{world} using
+braille dots @samp{456}, followed by the letter @samp{W} all the time.
+Then you'd write:
+
+@example
+always world 456-2456
+@end example
+
+The word @code{always} is an opcode which tells liblouis to always
+honor this translation, that is to say when the word @samp{world} (an
+operand) is encountered, always show braille dots @samp{456} followed
+by the letter @samp{w} (@samp{2456}).
+
+When you write any braille table for any language, we'd recommend
+working from some sort of official standard, and have a device or a
+program in which you can test your work.
+
+@menu
+* Overview::
+* Hyphenation Tables::
+* Character-Definition Opcodes::
+* Braille Indicator Opcodes::
+* Emphasis Opcodes::
+* Special Symbol Opcodes::
+* Special Processing Opcodes::
+* Translation Opcodes::
+* Character-Class Opcodes::
+* Swap Opcodes::
+* The Context and Multipass Opcodes::
+* The correct Opcode::
+* The match Opcode::
+* Miscellaneous Opcodes::
+@end menu
+
+@node Overview
+@section Overview
+
+Many translation (contraction) tables have already been made up. They
+are included in the distribution in the tables directory and can be
+studied as part of the documentation. Some of the more helpful (and
+normative) are listed in the following table:
+
+@table @file
+@item chardefs.cti
+Character definitions for U.S. tables
+@item compress.ctb
+Remove excessive whitespace
+@item en-us-g1.ctb
+Uncontracted American English
+@item en-us-g2.ctb
+Contracted or Grade 2 American English
+@item en-us-brf.dis
+Make liblouis output conform to BRF standard
+@item en-us-comp8.ctb
+8-dot computer braille for use in coding examples
+@item en-us-comp6.ctb
+6-dot computer braille
+@item nemeth.ctb
+Nemeth Code translation for use with liblouisutdml
+@item nemeth_edit.ctb
+Fixes errors at the boundaries of math and text
+
+@end table
+
+The names used for files containing translation tables are completely
+arbitrary. They are not interpreted in any way by the translator.
+Contraction tables may be 8-bit ASCII files, UTF-8, 16-bit big-endian
+Unicode files or 16-bit little-endian Unicode files. Blank lines are
+ignored. Any leading and trailing whitespace (any number of blanks
+and/or tabs) is ignored. Lines which begin with a number sign or hatch
+mark (@samp{#}) are ignored, i.e.@: they are comments. If the number
+sign is not the first non-blank character in the line, it is treated
+as an ordinary character. If the first non-blank character is
+less-than (@samp{<}) the line is also treated as a comment. This makes
+it possible to mark up tables as xhtml documents. Lines which are not
+blank or comments define table entries. The general format of a table
+entry is:
+
+@example
+opcode operands comments
+@end example
+
+Table entries may not be split between lines. The opcode is a mnemonic
+that specifies what the entry does. The operands may be character
+sequences, braille dot patterns or occasionally something else. They
+are described for each opcode, please @pxref{Opcode Index}. With some
+exceptions, opcodes expect a certain number of operands. Any text on
+the line after the last operand is ignored, and may be a comment. A
+few opcodes accept a variable number of operands. In this case a
+number sign (@samp{#}) begins a comment unless it is preceded by a
+backslash (@samp{\}).
+
+Here are some examples of table entries.
+
+@example
+# This is a comment.
+always world 456-2456 A word and the dot pattern of its contraction
+@end example
+
+Most opcodes have both a "characters" operand and a "dots" operand,
+though some have only one and a few have other types.
+
+@cindex Characters operand
+The characters operand consists of any combination of characters and
+escape sequences proceeded and followed by whitespace. Escape
+sequences are used to represent difficult characters. They begin with
+a backslash (@samp{\}). They are:
+
+@table @kbd
+@item \
+backslash
+@item \f
+form feed
+@item \n
+new line
+@item \r
+carriage return
+@item \s
+blank (space)
+@item \t
+horizontal tab
+@item \v
+vertical tab
+@item \e
+"escape" character (hex 1b, dec 27)
+@item \xhhhh
+4-digit hexadecimal value of a character
+
+@end table
+
+If liblouis has been compiled for 32-bit Unicode the following are
+also recognized.
+
+@table @kbd
+@item \yhhhhh
+5-digit (20 bit) character
+@item \zhhhhhhhh
+Full 32-bit value.
+
+Please take a look at the
+@url{https://unicode.org/Public/UNIDATA/,public directory of the
+Unicode Character Database} as well as at the
+@url{https://unicode.org/Public/UNIDATA/NamesList.txt,Unicode names
+list with their code points} to figure out the corresponding Unicode
+code point for a given Unicode character.
+
+@end table
+
+@cindex Dots operand
+The dots operand is a braille dot pattern. The real braille dots, 1
+through 8, must be specified with their standard numbers.
+
+@cindex Virtual dots
+@anchor{virtual dots}
+liblouis recognizes @emph{virtual dots}, which are used for special
+purposes, such as distinguishing accent marks. There are seven virtual
+dots. They are specified by the number 9 and the letters @samp{a}
+through @samp{f}.
+
+@cindex Multi-cell dot pattern
+For a multi-cell dot pattern, the cell specifications must be
+separated from one another by a dash (@samp{-}). For example, the
+contraction for the English word @samp{lord} (the letter @samp{l}
+preceded by dot 5) would be specified as @samp{5-123}. A space may be
+specified with the special dot number 0.
+
+An opcode which is helpful in writing translation tables is
+@code{include}. Its format is:
+
+@example
+include filename
+@end example
+
+It reads the file indicated by @code{filename} and incorporates or
+includes its entries into the table. Included files can include other
+files, which can include other files, etc. For an example, see what
+files are included by the entry @code{include en-us-g1.ctb} in the table
+@file{en-us-g2.ctb}. If the included file is not in the same directory
+as the main table, use a full path name for filename. Tables can also be
+specified in a table list, in which the table names are separated by
+commas and given as a single table name in calls to the translation
+functions.
+
+The order of the various types of opcodes or table entries is
+important. Character-definition opcodes should come first. However, if
+the optional @opcoderef{display} is used it should precede
+character-definition opcodes. Braille-indicator opcodes should come
+next. Translation opcodes should follow. The @opcoderef{context} is a
+translation opcode, even though it is considered along with the
+multipass opcodes. These latter should follow the translation opcodes.
+The @opcoderef{correct} can be used anywhere after the
+character-definition opcodes, but it is probably a good idea to group
+all @code{correct} opcodes together. The @opcoderef{include} can be
+used anywhere, but the order of entries in the combined table must
+conform to the order given above. Within each type of opcode, the
+order of entries is generally unimportant. Thus the translation
+entries can be grouped alphabetically or in any other order that is
+convenient. Hyphenation tables may be specified either with an
+@code{include} opcode or as part of a table list. They should come after
+everything else.
+
+@node Hyphenation Tables
+@section Hyphenation Tables
+
+Hyphenation tables are necessary to make opcodes such as the
+@opcoderef{nocross} function properly. There are no opcodes for
+hyphenation table entries because these tables have a special format.
+Therefore, they cannot be specified as part of an ordinary table.
+Rather, they must be included using the @opcoderef{include} or as part
+of a table list. The liblouis hyphenation algorithm was adopted from the
+one used by OpenOffice. Note that Hyphenation tables must follow
+character definitions and should preferably be the last. For an example
+of a hyphenation table, see @file{hyph_en_US.dic}.
+
+@node Character-Definition Opcodes
+@section Character-Definition Opcodes
+
+These opcodes are needed to define attributes such as digit,
+punctuation, letter, etc. for all characters and their dot patterns.
+liblouis has no built-in character definitions, but such definitions
+are essential to the operation of the @opcoderef{context}, the
+@opcoderef{correct}, the multipass opcodes and the back-translator. If
+the dot pattern is a single cell, it is used to define the mapping
+between dot patterns and characters, unless a @opcoderef{display} for
+that character-dot-pattern pair has been used previously. If only a
+single-cell dot pattern has been given for a character, that dot
+pattern is defined with the character's own attributes.
+
+You may have multiple definitions of a character using the same or
+different dot patterns. If you use different dot patterns for the same
+character, only the first dot pattern will be used during forward
+translation. However, during back-translation, all the relevant dot
+patterns will back-translate to the character you defined.
+
+You can also define a character multiple times using the same dot
+pattern for the character, but using different character classes. The
+following example would define the character @samp{*} (star) as both
+@opcoderef{math} and @opcoderef{sign}.
+
+@example
+math * 16
+sign * 16
+@end example
+
+Likewise, you can define multiple characters as the same dot pattern.
+The characters you define this way will be forward translated to the
+same dot pattern. However, when back-translating, the dot pattern will
+always back-translate to the first character that was defined with
+this pattern.
+
+This technique may be useful when defining characters that have one
+representation in the Windows character set (CP1252) and another
+representation in the Unicode character set, e.g. the Euro sign,
+@samp{€}. It may also be of use when you have to define several
+variants of the same letter with different accents, which may be
+represented in your Braille code by the same dot pattern. This is a
+very common practice for accented letters that are foreign to the
+Braille code. In the following example using the @opcoderef{uplow}
+opcode, both e acute (@samp{é}) and e grave (@samp{è}) are defined as
+dot 4 followed by dots 1 and 5.
+
+@example
+uplow \x00c9\x00e9 4-15 # E acute
+uplow \x00c8\x00e8 4-15 # E grave
+@end example
+
+In this example, the dot pattern would always back-translate to e
+acute, since this is the first definition. You could use the
+@opcoderef{correct} opcode to correct at least the most common errors
+on that account. However, there is no fail-safe way to know what
+accented letter to use when you back-translate from a dot pattern
+representing more than one variant.
+
+@table @code
+@opcode{space, character dots}
+Defines a character as a space and also defines the dot pattern as
+such. for example:
+
+@example
+space \s 0 \s is the escape sequence for blank; 0 means no dots.
+@end example
+
+@opcode{punctuation, character dots}
+Associates a punctuation mark in the particular language with a
+braille representation and defines the character and dot pattern as
+punctuation. For example:
+
+@example
+punctuation . 46 dot pattern for period in NAB computer braille
+@end example
+
+@opcode{digit, character dots}
+Associates a digit with a dot pattern and defines the character as a
+digit. For example:
+
+@example
+digit 0 356 NAB computer braille
+@end example
+
+@opcode{uplow, characters dots [@comma{}dots]}
+The characters operand must be a pair of letters, of which the first
+is uppercase and the second lowercase. The first dots suboperand
+indicates the dot pattern for the upper-case letter. It may have more
+than one cell. The second dots suboperand must be separated from the
+first by a comma and is optional, as indicated by the square brackets.
+If present, it indicates the dot pattern for the lower-case letter. It
+may also have more than one cell. If the second dots suboperand is not
+present the first is used for the lower-case letter as well as the
+upper-case letter. This opcode is needed because not all languages
+follow a consistent pattern in assigning Unicode codes to upper and
+lower case letters. It should be used even for languages that do. The
+distinction is important in the forward translator. for example:
+
+@example
+uplow Aa 17,1
+@end example
+
+@opcode{grouping, name characters dots @comma{}dots}
+This opcode is used to indicate pairs of grouping symbols used in
+processing mathematical expressions. These symbols are usually
+generated by the MathML interpreter in liblouisutdml. They are used in
+multipass opcodes. The name operand must contain only letters (a-z and
+A-Z). The letters may be upper or lower-case but the case matters. The
+characters operand must contain exactly two Unicode characters. The
+dots operand must contain exactly two braille cells, separated by a
+comma. Note that grouping dot patterns also need to be declared with
+the @opcoderef{exactdots}. The characters may need to be declared with
+the @opcoderef{math}.
+
+@example
+grouping mrow \x0001\x0002 1e,2e
+grouping mfrac \x0003\x0004 3e,4e
+@end example
+
+@opcode{letter, character dots}
+Associates a letter in the language with a braille representation and
+defines the character as a letter. This is intended for letters which
+are neither uppercase nor lowercase.
+
+@opcode{lowercase, character dots}
+Associates a character with a dot pattern and defines the character as
+a lowercase letter. Both the character and the dot pattern have the
+attributes lowercase and letter.
+
+@opcode{uppercase, character dots}
+Associates a character with a dot pattern and defines the character as
+an uppercase letter. Both the character and the dot pattern have the
+attributes uppercase and letter. @code{lowercase} and @code{uppercase}
+should be used when a letter has only one case. Otherwise use the
+@opcoderef{uplow}.
+
+@opcode{litdigit, digit dots}
+Associates a digit with the dot pattern which should be used to
+represent it in literary texts. For example:
+
+@example
+litdigit 0 245
+litdigit 1 1
+@end example
+
+@opcode{sign, character dots}
+Associates a character with a dot pattern and defines both as a sign.
+This opcode should be used for things like at sign (@samp{@@}),
+percent (@samp{%}), dollar sign (@samp{$}), etc. Do not use it to
+define ordinary punctuation such as period and comma. For example:
+
+@example
+sign % 4-25-1234 literary percent sign
+@end example
+
+@opcode{math, character dots}
+Associates a character and a dot pattern and defines them as a
+mathematical symbol. It should be used for less than (@samp{<}),
+greater than(@samp{>}), equals(@samp{=}), plus(@samp{+}), etc. For
+example:
+
+@example
+math + 346 plus
+@end example
+
+@end table
+
+@node Braille Indicator Opcodes
+@section Braille Indicator Opcodes
+
+Braille indicators are dot patterns which are inserted into the
+braille text to indicate such things as capitalization, italic type,
+computer braille, etc. The opcodes which define them are followed only
+by a dot pattern, which may be one or more cells.
+
+@table @code
+@opcode{capsletter, dots}
+The dot pattern which indicates capitalization of a single letter. In
+English, this is dot 6. For example:
+
+@example
+capsletter 6
+@end example
+
+@opcode{begcapsword, dots}
+The dot pattern which begins a block of capital letters at the
+beginning or within a word. The block is automatically terminated
+by any character that is not a capital letter, e.g. small letters,
+punctuation, numbers etc.
+
+Apart from capital letters, you can define a list of characters that
+can appear within a word in capitals without terminating the block.
+Do this by using the @opcoderef{capsmodechars} opcode.
+
+Example:
+
+@example
+begcapsword 6-6
+@end example
+
+@opcode{endcapsword, dots}
+The dot pattern which ends a block of capital letters within a word.
+It is used in cases where the block is not terminated automatically
+by a word boundary, a number or punctuation. A common case is when
+an uppercase block is followed directly by a lowercase letter.
+
+For example:
+
+@example
+endcapsword 6-3
+@end example
+
+@opcode{capsmodechars, characters}
+
+Normally, any character other than a capital letter will cancel the
+@opcoderef{begcapsword} indicator. However, by using the
+@code{capsmodechars} opcode, you can specify a list of characters
+that are legal within a capitalized word. In some Braille codes,
+this might be the case for the hyphen character, @samp{-}.
+
+Example:
+
+@example
+capsmodechars -
+@end example
+
+@opcode{begcaps, dots}
+The dot pattern which begins a block of capital letters defined by the
+provided @code{typeform} without regard for any other rules.
+This construct is sometimes also called a capsphrase. It is used
+in some Braille codes to mark a whole phrase or sentence as capital
+letters. The block can contain capital letters as well as
+none-alphabetic characters, punctuation, numbers etc. The
+block is terminated when a small letter is encountered or at the end of the input string.
+
+Example:
+
+@example
+begcaps 6-6-6
+@end example
+
+@opcode{endcaps, dots}
+The dot pattern which ends a block of capital letters defined by the
+provided @code{typeform} without regard for any other rules. For
+example:
+
+@example
+endcaps 6-3
+@end example
+
+@opcode{letsign, dots}
+This indicator is needed in Grade 2 to show that a single letter is
+not a contraction. It is also used when an abbreviation happens to be
+a sequence of letters that is the same as a contraction. For example:
+
+@example
+letsign 56
+@end example
+
+@opcode{noletsign, letters}
+
+The letters in the operand will not be proceeded by a letter sign.
+More than one @code{noletsign} opcode can be used. This is equivalent
+to a single entry containing all the letters. In addition, if a single
+letter, such as @samp{a} in English, is defined as a @code{word}
+(@pxref{word opcode,word,@code{word}}) or @code{largesign}
+(@pxref{largesign opcode,largesign,@code{largesign}}), it will be
+treated as though it had also been specified in a @code{noletsign}
+entry.
+
+@opcode{noletsignbefore, characters}
+If any of the characters proceeds a single letter without a space a
+letter sign is not used. By default the characters apostrophe
+(@samp{'}) and period (@samp{.}) have this property. Use of a
+@code{noletsignbefore} entry cancels the defaults. If more than one
+@code{noletsignbefore} entry is used, the characters in all entries
+are combined.
+
+@opcode{noletsignafter, characters}
+If any of the characters follows a single letter without a space a
+letter sign is not used. By default the characters apostrophe
+(@samp{'}) and period (@samp{.}) have this property. Use of a
+@code{noletsignafter} entry cancels the defaults. If more than one
+@code{noletsignafter} entry is used the characters in all entries are
+combined.
+
+@opcode{nocontractsign, dots}
+
+The dots in this opcode are used to indicate a letter or a sequence of
+letters that are not a contraction, e.g. @samp{CD}. The opcode is
+similar to the @opcoderef{letsign}.
+
+@c FIXME: In what way is the nocontractsign opcode different from the
+@c letsign opcode, apart from apparently being a more focused version of
+@c letsign?
+
+@opcode{numsign, dots}
+The translator inserts this indicator before numbers made up of digits
+defined with the @opcoderef{litdigit} to show that they are a number
+and not letters or some other symbols. A number is terminated when a
+space, a letter or any other none-@opcoderef{litdigit} character is
+encountered.
+
+You can define characters or strings to be part of a number by using
+the @opcoderef{midnum} opcode, the @opcoderef{numericmodechars} opcode
+or the @opcoderef{midendnumericmodechars} opcode.
+
+Example:
+
+@example
+numsign 3456
+@end example
+
+@opcode{numericnocontchars, characters}
+
+This opcode specifies the characters that require a
+@opcoderef{nocontractsign} if they appear after a number with no
+intervening space, e.g. @samp{1a} or @samp{2-B}.
+
+These characters will typically be the letters a-j, which usually
+constitute the literary digits (see @opcoderef{litdigit}). However,
+in some Braille codes, all letters fall in this category.
+
+Please, note that this opcode is case sensitive. So, if you need a
+@opcoderef{nocontractsign} to also appear before the capital letters
+A-j, you should include these letters in the definition. This is
+especially relevant if you are also using the @opcoderef{begcaps}
+and @opcoderef{endcaps} opcodes. In this case, you might otherwise
+end up having numbers immediately followed by capital letters with no
+indicator between.
+
+Example:
+
+@example
+numericnocontchars abcdefghij
+@end example
+
+@opcode{numericmodechars, characters}
+
+@opcode{midendnumericmodechars, characters}
+
+Any of these characters can appear within a number without terminating
+the effect of the number sign (@pxref{numsign
+opcode,numsign,@code{numsign}}). In other words, they don't cancel
+numeric mode.
+
+The difference between the two opcodes is that
+@opcoderef{numericmodechars} characters can appear anywhere in a
+number whereas @opcoderef{midendnumericmodechars} characters can
+appear only in the middle or at the end of a number. Like
+@code{midendnumericmodechars}, @code{numericmodechars} characters keep
+numeric mode active, but in addition they activate numeric mode
+immediately when at least one digit follows, and the number sign will
+precede the @code{numericmodechars} character in this case.
+
+Example:
+
+@example
+numericmodechars .,
+midendnumericmodechars -/
+@end example
+
+@end table
+
+@node Emphasis Opcodes
+@section Emphasis Opcodes
+
+In many braille systems emphasis such as bold, italics or underline is
+indicated using special dot patterns that mark the start and often
+also the end. For some languages these braille indicators differ
+depending on the context, i.e.@: here is an separate indicator for an
+emphasized word and another one for an emphasized phrase. To
+accommodate for all these usage scenarios liblouis provides a number of
+opcodes for various contexts.
+
+At the same time some braille systems use different indicators for
+different kinds of emphasis while others know only one kind of
+emphasis. For that reason liblouis doesn't hard code any emphasis but
+the table author defines which kind of emphasis exist for a specific
+language using the @opcoderef{emphclass} opcode.
+
+@menu
+* Emphasis class::
+* Contexts::
+* Fallback behavior::
+* Computer braille::
+@end menu
+
+@node Emphasis class
+@subsection Emphasis class
+
+The @code{emphclass} opcode defines the classes of emphasis that are
+relevant for a particular language. For all emphasis that need special
+indicators an emphasis class has to be declared.
+
+@table @code
+@opcode{emphclass, <emphasis class>}
+Define an emphasis class to be used later in other emphasis related
+opcodes in the table.
+
+@example
+emphclass italic
+emphclass underline
+emphclass bold
+emphclass transnote
+@end example
+
+@end table
+
+@node Contexts
+@subsection Contexts
+
+In order to understand the capabilities of Liblouis for emphasis
+handling we have to look at the different contexts that are supported.
+
+@menu
+* None::
+* Letter::
+* Word::
+* Phrase::
+* Symbol::
+@end menu
+
+@node None
+@subsubsection None
+
+For some languages there is no such concept as contexts. Emphasis is
+always handled the same regardless of context. There is simply an
+indicator for the beginning of emphasis and another one for the end of
+the emphasis.
+
+@table @code
+@opcode{begemph, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of emphasis.
+
+@example
+begemph italic 46-3
+@end example
+
+@opcode{endemph, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the end of emphasis.
+
+@example
+endemph italic 46-36
+@end example
+
+@end table
+
+@node Letter
+@subsubsection Letter
+
+Some languages have special indicators for single letter emphasis.
+
+@table @code
+@opcode{emphletter, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate that the next character is emphasized.
+
+@example
+emphletter italic 46-25
+@end example
+
+@end table
+
+@node Word
+@subsubsection Word
+
+Many languages have special indicators for emphasized words. Usually
+they start at the beginning of the word and and implicitly, i.e.@:
+without a closing indicator at the end of the word. There are also use
+cases where the emphasis starts in the middle of the word and an
+explicit closing indicator is required.
+
+@table @code
+@opcode{begemphword, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of an emphasized word
+or the beginning of emphasized characters within a word.
+
+@example
+begemphword underline 456-36
+@end example
+
+@opcode{endemphword, <emphasis class> <dot pattern>}
+Generally emphasis with word context ends when the word ends. However
+when an indication is required to close a word emphasis then this
+opcode defines the Braille dot pattern that indicates the end of a word
+emphasis.
+
+@example
+endemphword transnote 6-3
+@end example
+
+If emphasis ends in the middle of a word the Braille dot pattern
+defined in this opcode is also used.
+
+@opcode{emphmodechars, characters}
+
+Normally, only space characters will cancel the
+@opcoderef{begemphword} indicator. However, by using the
+@code{emphmodechars} opcode, you can specify the list of characters
+that are legal within a emphasized word. If @code{emphmodechars} is
+specified, any character that is not in this list and is not a
+@code{letter} will cancel the @opcoderef{begemphword} indicator.
+
+Example:
+
+@example
+emphmodechars -
+@end example
+
+@end table
+
+@node Phrase
+@subsubsection Phrase
+
+Many languages have a concept of a phrase where the emphasis is valid
+for a number of words. The beginning of the phase is indicated with a
+braille dot pattern and a closing indicator is put before or after the
+last word of the phrase. To define how many words are considered a
+phrase in your language use the @opcoderef{lenemphphrase}.
+
+@table @code
+@opcode{begemphphrase, <emphasis class> <dot pattern>}
+Braille dot pattern to indicate the beginning of a phrase.
+
+@example
+begemphphrase bold 456-46-46
+@end example
+
+@c define a special opcode macro that can handle the two-word nature
+@c of the endemphphrase opcode
+@macro endemphphraseopcode{where}
+@opcodeindex endemphphrase \where\
+@anchor{endemphphrase \where\ opcode}
+@item endemphphrase <emphasis class> \where\ <dot pattern>
+@end macro
+
+@endemphphraseopcode{before}
+Braille dot pattern to indicate the end of a phrase. The closing indicator
+will be placed before the last word of the phrase.
+
+@example
+endemphphrase bold before 456-46
+@end example
+
+@endemphphraseopcode{after}
+Braille dot pattern to indicate the end of a phrase. The closing
+indicator will be placed after the last word of the phrase. If both
+@code{endemphphrase <emphasis class> before} and @code{endemphphrase
+<emphasis class> after} are defined an error will be signaled.
+
+@example
+endemphphrase underline after 6-3
+@end example
+
+@opcode{lenemphphrase, <emphasis class> <number>}
+Define how many words are required before a sequence of words is
+considered a phrase.
+
+@example
+lenemphphrase underline 3
+@end example
+
+@end table
+
+@node Symbol
+@subsubsection Symbol
+UEB has a concept of symbols that need special indication. When the
+translator detects an emphasis sequence that needs to be indicated
+with the rules for a symbol then it will use the dots defined with the
+@opcoderef{emphletter}. To indicate the end of the symbol it will use
+the dots defined in the @opcoderef{endemphword}.
+
+@node Fallback behavior
+@subsection Fallback behavior
+
+Many braille systems either handle emphasis using no contexts or
+otherwise by employing a combination of the letter, word and phrase
+contexts. So if a table defines any opcodes for the letter, word or
+phrase contexts then liblouis will signal an error for opcodes that
+define emphasis with no context. In other words contrary to previous
+versions of liblouis there is no fallback behavior.
+
+As a consequence, there will only be emphasis for a context when the
+table defines it. So for example when defining a braille dot pattern
+for phrases and not for words liblouis will not indicate emphasis on
+words that aren't part of a phrase.
+
+@node Computer braille
+@subsection Computer braille
+
+For computer braille there are only two braille indicators, for the
+beginning and end of a sequence of characters to be rendered in
+computer braille. Such a sequence may also have other emphasis. The
+computer braille indicators are applied not only when computer braille
+is indicated in the @code{typeform} parameter, but also when a
+sequence of characters is determined to be computer braille because it
+contains a subsequence defined by the @opcoderef{compbrl}.
+
+@node Special Symbol Opcodes
+@section Special Symbol Opcodes
+
+These opcodes define certain symbols, such as the decimal point, which
+require special treatment.
+
+@table @code
+@opcode{decpoint, character dots}
+
+This opcode defines the decimal point. It is useful if your Braille
+code requires the decimal separator to show as a dot pattern different
+from the normal representation of this character, i.e.@: period or
+comma. In addition, it allows the notation @samp{.001} to be
+translated correctly. This notation is common in some languages
+instead of @samp{0.001} (no leading 0). When you use the
+@code{decpoint} opcode, the decimal point will be taken to be part of
+the number and correctly preceded by number sign.
+
+The character operand must have only one character. For example, in
+@file{en-us-g1.ctb} we have:
+
+@example
+decpoint . 46
+@end example
+
+@opcode{hyphen, character dots}
+This opcode defines the hyphen, that is, the character used in
+compound words such as @samp{have-nots}. The back-translator uses it
+to determine the end of individual words.
+
+@end table
+
+@node Special Processing Opcodes
+@section Special Processing Opcodes
+
+These opcodes cause special processing to be carried out.
+
+@table @code
+@opcode{capsnocont,}
+This opcode has no operands. If it is specified, words or parts of
+words in all caps are not contracted. This is needed for languages
+such as Norwegian.
+
+Note: If you use the capsnocont opcode and do not define the
+ @opcoderef{begcapsword} indicator, every cap will be marked with the
+@opcoderef{capsletter} indicator. This is useful if you need to process caps
+separately in a later pass.
+
+@end table
+
+@node Translation Opcodes
+@section Translation Opcodes
+
+These opcodes define the braille representations for character
+sequences. Each of them defines an entry within the contraction table.
+These entries may be defined in any order except, as noted below, when
+they define alternate representations for the same character sequence.
+
+Each of these opcodes specifies a condition under which the
+translation is legal, and each also has a characters operand and a
+dots operand. The text being translated is processed strictly from
+left to right, character by character, with the most eligible entry
+for each position being used. If there is more than one eligible entry
+for a given position in the text, then the one with the longest
+character string is used. If there is more than one eligible entry for
+the same character string, then the one defined first is is tested for
+legality first. (This is the only case in which the order of the
+entries makes a difference.)
+
+The characters operand is a sequence or string of characters preceded
+and followed by whitespace. Each character can be entered in the
+normal way, or it can be defined as a four-digit hexadecimal number
+preceded by @samp{\x}.
+
+The dots operand defines the braille representation for the characters
+operand. It may also be specified as an equals sign (@samp{=}). This
+means that the the default representation for each character
+(@pxref{Character-Definition Opcodes}) within the sequence is to be
+used. It is an error if not all the characters in the rule have been
+previously defined in a character-definition rule. Note that the
+@samp{=} shortcut for dot patterns has a known bug@footnote{See
+@url{https://github.com/liblouis/liblouis/issues/500#issuecomment-365753137}.}
+that might cause problems when back-translating.
+
+In what follows the word @samp{characters} means a sequence of one or
+more consecutive letters between spaces and/or punctuation marks.
+
+@table @code
+
+@opcode{noback, opcode ...}
+This is an opcode prefix, that is to say, it modifies the operation of
+the opcode that follows it on the same line. noback specifies that
+back-translation is not to use information on this line.
+
+@example
+noback always ;\s; 0
+@end example
+
+@opcode{nofor, opcode ...}
+This is an opcode prefix which modifies the operation of the opcode
+following it on the same line. nofor specifies that forward translation
+is not to use the information on this line.
+
+@opcode{compbrl, characters}
+If the characters are found within a block of text surrounded by
+whitespace the entire block is translated according to the default
+braille representations defined by the @ref{Character-Definition
+Opcodes}, if 8-dot computer braille is enabled or according to the dot
+patterns given in the @opcoderef{comp6}, if 6-dot computer braille is
+enabled. For example:
+
+@example
+compbrl www translate URLs in computer braille
+@end example
+
+@opcode{comp6, character dots}
+This opcode specifies the translation of characters in 6-dot computer
+braille. It is necessary because the translation of a single character
+may require more than one cell. The first operand must be a character
+with a decimal representation from 0 to 255 inclusive. The second
+operand may specify as many cells as necessary. The opcode is somewhat
+of a misnomer, since any dots, not just dots 1 through 6, can be
+specified. This even includes virtual dots (@pxref{virtual dots}).
+
+@opcode{nocont, characters}
+Like @code{compbrl}, except that the string is uncontracted.
+@opcoderef{prepunc} and @opcoderef{postpunc} rules are applied,
+however. This is useful for specifying that foreign words should not
+be contracted in an entire document.
+
+@opcode{replace, characters @{characters@}}
+Replace the first set of characters, no matter where they appear, with
+the second. Note that the second operand is @emph{NOT} a dot pattern.
+It is also optional. If it is omitted the character(s) in the first
+operand will be discarded. This is useful for ignoring characters. It
+is possible that the "ignored" characters may still affect the
+translation indirectly. Therefore, it is preferable to use
+@opcoderef{correct}.
+
+@opcode{always, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. Do @emph{NOT} use an entry such as @code{always a 1}. Use the
+@code{uplow}, @code{letter}, etc. character definition opcodes
+instead. For example:
+
+@example
+always world 456-2456 unconditional translation
+@end example
+
+@opcode{repeated, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. Ignore any consecutive repetitions of the same character
+sequence. This is useful for shortening long strings of spaces or
+hyphens or periods. For example:
+
+@example
+repeated --- 36-36-36 shorten separator lines made with hyphens
+@end example
+
+@opcode{repword, characters dots}
+When characters are encountered check to see if the word before this
+string matches the word after it. If so, replace characters with dots
+and eliminate the second word and any word following another
+occurrence of characters that is the same. This opcode is used in
+Malaysian braille. In this case the rule is:
+
+@example
+repword - 123456
+@end example
+
+@opcode{largesign, characters dots}
+Replace the characters with the dot pattern no matter where they
+appear. In addition, if two words defined as large signs follow each
+other, remove the space between them. For example, in
+@file{en-us-g2.ctb} the words @samp{and} and @samp{the} are both
+defined as large signs. Thus, in the phrase @samp{the cat and the dog}
+the space would be deleted between @samp{and} and @samp{the}, with the
+result @samp{the cat andthe dog}. Of course, @samp{and} and @samp{the}
+would be properly contracted. The term @code{largesign} is a bit of
+braille jargon that pleases braille experts.
+
+@opcode{word, characters dots}
+Replace the characters with the dot pattern if they are a word, that
+is, are surrounded by whitespace and/or punctuation.
+
+@opcode{syllable, characters dots}
+As its name indicates, this opcode defines a "syllable" which must be
+represented by exactly the dot patterns given. Contractions may not
+cross the boundaries of this "syllable" either from left or right. The
+character string defined by this opcode need not be a lexical
+syllable, though it usually will be. The equal sign in the following
+example means that the the default representation for each character
+within the sequence is to be used (@pxref{Translation Opcodes}):
+
+@example
+syllable horse = sawhorse, horseradish
+@end example
+
+@opcode{nocross, characters dots}
+Replace the characters with the dot pattern if the characters are all
+in one syllable (do not cross a syllable boundary). For this opcode to
+work, a hyphenation table must be included. If this is not done,
+@code{nocross} behaves like the @opcoderef{always}. For example, if
+the English Grade 2 table is being used and the appropriate
+hyphenation table has been included @code{nocross sh 146} will cause
+the @samp{sh} in @samp{monkshood} not to be contracted.
+
+@opcode{joinword, characters dots}
+Replace the characters with the dot pattern if they are a word which
+is followed by whitespace and a letter. In addition remove the
+whitespace. For example, @file{en-us-g2.ctb} has @code{joinword to
+235}. This means that if the word @samp{to} is followed by another
+word the contraction is to be used and the space is to be omitted. If
+these conditions are not met, the word is translated according to any
+other opcodes that may apply to it.
+
+@opcode{lowword, characters dots}
+Replace the characters with the dot pattern if they are a word
+preceded and followed by whitespace. No punctuation either before or
+after the word is allowed. The term @code{lowword} derives from the
+fact that in English these contractions are written in the lower part
+of the cell. For example:
+
+@example
+lowword were 2356
+@end example
+
+@opcode{contraction, characters}
+If you look at @file{en-us-g2.ctb} you will see that some words are
+actually contracted into some of their own letters. A famous example
+among braille transcribers is @samp{also}, which is contracted as
+@samp{al}. But this is also the name of a person. To take another
+example, @samp{altogether} is contracted as @samp{alt}, but this is
+the abbreviation for the alternate key on a computer keyboard.
+Similarly @samp{could} is contracted into @samp{cd}, but this is the
+abbreviation for compact disk. To prevent confusion in such cases, the
+letter sign (see @opcoderef{letsign}) is placed before such letter
+combinations when they actually are abbreviations, not contractions.
+The @code{contraction} opcode tells the translator to do this.
+
+@opcode{sufword, characters dots}
+Replace the characters with the dot pattern if they are either a word
+or at the beginning of a word.
+
+@opcode{prfword, characters dots}
+Replace the characters with the dot pattern if they are either a word
+or at the end of a word.
+
+@opcode{begword, characters dots}
+Replace the characters with the dot pattern if they are at the
+beginning of a word.
+
+@opcode{begmidword, characters dots}
+Replace the characters with the dot pattern if they are either at the
+beginning or in the middle of a word.
+
+@opcode{midword, characters dots}
+Replace the characters with the dot pattern if they are in the middle
+of a word.
+
+@opcode{midendword, characters dots}
+Replace the characters with the dot pattern if they are either in the
+middle or at the end of a word.
+
+@opcode{endword, characters dots}
+Replace the characters with the dot pattern if they are at the end of
+a word.
+
+@opcode{partword, characters dots}
+Replace the characters with the dot pattern if the characters are
+anywhere in a word, that is, if they are proceeded or followed by a
+letter.
+
+@opcode{exactdots, @@dots}
+Note that the operand must begin with an at sign (@samp{@@}). The dot
+pattern following it is evaluated for validity. If it is valid,
+whenever an at sign followed by this dot pattern appears in the source
+document it is replaced by the characters corresponding to the dot
+pattern in the output. This opcode is intended for use in liblouisutdml
+semantic-action files to specify exact dot patterns, as in
+mathematical codes. For example:
+
+@example
+exactdots @@4-46-12356
+@end example
+will produce the characters with these dot patterns in the output.
+
+@opcode{prepunc, characters dots}
+Replace the characters with the dot pattern if they are part of
+punctuation at the beginning of a word.
+
+@opcode{postpunc, characters dots}
+Replace the characters with the dot pattern if they are part of
+punctuation at the end of a word.
+
+@opcode{begnum, characters dots}
+Replace the characters with the dot pattern if they are at the
+beginning of a number, that is, before all its digits. For example, in
+@file{en-us-g1.ctb} we have @code{begnum # 4}.
+
+@opcode{midnum, characters dots}
+Replace the characters with the dot pattern if they are in the middle
+of a number. For example, @file{en-us-g1.ctb} has @code{midnum . 46}.
+This is because the decimal point has a different dot pattern than the
+period.
+
+@opcode{endnum, characters dots}
+Replace the characters with the dot pattern if they are at the end of
+a number. For example @file{en-us-g1.ctb} has @code{endnum th 1456}.
+This handles things like @samp{4th}. A letter sign is @emph{NOT}
+inserted.
+
+@opcode{joinnum, characters dots}
+Replace the characters with the dot pattern. In addition, if
+whitespace and a number follows omit the whitespace. This opcode can
+be used to join currency symbols to numbers for example:
+
+@example
+joinnum \x20AC 15 (EURO SIGN)
+joinnum \x0024 145 (DOLLAR SIGN)
+joinnum \x00A3 1234 (POUND SIGN)
+joinnum \x00A5 13456 (YEN SIGN)
+@end example
+
+@end table
+
+@node Character-Class Opcodes
+@section Character-Class Opcodes
+
+These opcodes define and use character classes. A character class
+associates a set of characters with a name. The name then refers to
+any character within the class. A character may belong to more than
+one class.
+
+The basic character classes correspond to the character definition
+opcodes, with the exception of the @opcoderef{uplow}, which defines
+characters belonging to the two classes @code{uppercase} and
+@code{lowercase}. These classes are:
+
+@table @code
+@item space
+Whitespace characters such as blank and tab
+@item digit
+Numeric characters
+@item letter
+Both uppercase and lowercase alphabetic characters
+@item lowercase
+Lowercase alphabetic characters
+@item uppercase
+Uppercase alphabetic characters
+@item punctuation
+Punctuation marks
+@item sign
+Signs such as percent (@samp{%})
+@item math
+Mathematical symbols
+@item litdigit
+Literary digit
+@item undefined
+Not properly defined
+
+@end table
+
+The opcodes which define and use character classes are shown below.
+For examples see @file{el.ctb}.
+
+@table @code
+
+@opcode{class, name characters}
+Define a new character class. The name operand must contain only
+letters (a-z and A-Z). The letters may be upper or lower-case but the
+case matters. The characters operand must be specified as a string. A
+character class may not be used until it has been defined.
+
+@opcode{after, class opcode ...}
+The specified opcode is further constrained in that the matched
+character sequence must be immediately preceded by a character
+belonging to the specified class. If this opcode is used more than
+once on the same line then the union of the characters in all the
+classes is used.
+
+@opcode{before, class opcode ...}
+The specified opcode is further constrained in that the matched
+character sequence must be immediately followed by a character
+belonging to the specified class. If this opcode is used more than
+once on the same line then the union of the characters in all the
+classes is used.
+
+@end table
+
+@node Swap Opcodes
+@section Swap Opcodes
+
+The swap opcodes are needed to tell the @opcoderef{context}, the
+@opcoderef{correct} and multipass opcodes which dot patterns to swap
+for which characters. There are three, @code{swapcd}, @code{swapdd}
+and @code{swapcc}. The first swaps dot patterns for characters. The
+second swaps dot patterns for dot patterns and the third swaps
+characters for characters. The first is used in the @code{context}
+opcode and the second is used in the multipass opcodes.
+
+All the swap opcodes have a name so they can be refered to from the
+@code{context}, @code{correct} and multipass opcodes. The name operand
+must contain only letters (a-z and A-Z). The letters may be upper or
+lower-case but the case matters.
+
+Dot patterns are separated by commas and may contain more than one
+cell.
+
+@table @code
+
+@opcode{swapcd, name characters dots@comma{} dots@comma{} dots@comma{} ...}
+See above paragraph for explanation. For example:
+
+@example
+swapcd dropped 0123456789 356,2,23,...
+@end example
+
+@opcode{swapdd, name dots@comma{} dots@comma{} dots ... dotpattern1@comma{} dotpattern2@comma{} dotpattern3@comma{} ...}
+The @code{swapdd} opcode defines substitutions for the multipass
+opcodes. In the second operand the dot patterns must be single cells,
+but in the third operand multi-cell dot patterns are allowed. This is
+because multi-cell patterns in the second operand would lead to
+ambiguities.
+
+@opcode{swapcc, name characters characters}
+The @code{swapcc} opcode swaps characters in its second operand for
+characters in the corresponding places in its third operand. It is
+intended for use with @code{correct} opcodes and can solve problems
+such as formatting phone numbers.
+
+@end table
+
+@node The Context and Multipass Opcodes
+@section The Context and Multipass Opcodes
+
+The @code{context} and multipass opcodes (@code{pass2}, @code{pass3}
+and @code{pass4}) provide translation capabilities beyond those of the
+basic translation opcodes (@pxref{Translation Opcodes}) discussed
+previously. The multipass opcodes cause additional passes to be made
+over the string to be translated. The number after the word
+@code{pass} indicates in which pass the entry is to be applied. If no
+multipass opcodes are given, only the first translation pass is made.
+The @code{context} opcode is basically a multipass opcode for the
+first pass. It differs slightly from the multipass opcodes per se.
+When back-translating, the passes are performed in the reverse order,
+i.e.@: @code{pass4}, @code{pass3}, @code{pass2}, @code{context}. Each
+of these opcodes must be prefixed by either the @opcoderef{noback} or
+the @opcoderef{nofor}. The format of all these opcodes is @code{opcode
+test action}. The specific opcodes are invoked as follows:
+
+@table @code
+@anchor{context opcode}
+@opcodeindex context
+@opcodeindex pass2
+@opcodeindex pass3
+@opcodeindex pass4
+@item context test action
+@itemx pass2 test action
+@itemx pass3 test action
+@itemx pass4 test action
+@end table
+
+The @code{test} and @code{action} operands have suboperands. Each
+suboperand begins with a non-alphanumeric character and ends when
+another non-alphanumeric character is encountered. The suboperands and
+their initial characters are as follows.
+
+@table @kbd
+@item " (double quote)
+a string of characters. This string must be terminated by another
+double quote. It may contain any characters. If a double quote is
+needed within the string, it must be preceded by a backslash
+(@samp{\}). If a space is needed, it must be represented by the escape
+sequence \s. This suboperand is valid
+in the test and action parts of the @code{correct} opcode,
+in the test part of the @code{context} opcode when forward translating,
+and in the action part of the @code{context} opcode when back translating.
+
+@item @@ (at sign)
+a sequence of dot patterns. Cells are separated by hyphens as usual.
+This suboperand is valid in the test and action parts of
+the @code{pass2}, @code{pass3}, and @code{pass4} opcodes,
+in the action part of the @code{context} opcode when forward translating,
+and in the test part of the @code{context} opcode when back translating.
+
+@item ` (accent mark)
+If this is the beginning of the string being translated this
+suboperand is true. It is valid only in the test part and must be the
+first thing in this operand.
+
+@item ~ (tilde)
+If this is the end of the string being translated this suboperand is
+true. It is valid only in the test part and must be the last thing in
+this operand.
+
+@item $ (dollar sign)
+a string of attributes, such as @samp{d} for digit, @samp{l} for
+letter, etc. For a list of all valid attributes @pxref{valid attribute
+characters}. More than one attribute can be given. If you wish to
+check characters with any attribute, use the letter @samp{a}. Input
+characters are checked to see if they have at least one of the
+attributes. The attribute string can be followed by numbers specifying
+how many characters are to be checked. If no numbers are given, 1 is
+assumed. If two numbers separated by a hyphen are given, the input is
+checked to make sure that at least the first number of characters with
+the attributes are present, but no more than the second number. If
+only one number is present, then exactly that many characters must
+have the attributes. A period instead of the numbers indicates an
+indefinite number of characters (for technical reasons the number of
+characters that are actually matched is limited to 65535).
+
+This suboperand is valid in all test parts but not in action parts.
+For the characters which can be used in attribute strings, see the
+following table.
+
+@item ! (exclamation point)
+reverses the logical meaning of the suboperand which follows. For
+example, !$d is true only if the character is @emph{NOT} a digit. This
+suboperand is valid in test parts only.
+
+@item % (percent sign)
+the name of a class defined by the @opcoderef{class} or the name of a
+swap set defined by the swap opcodes (@pxref{Swap Opcodes}). Names
+must contain only letters (a-z and A-Z). The letters may be upper or
+lower-case but the case matters. Class names may be used in test parts
+only. Swap names are valid everywhere.
+
+@item @{ (left brace)
+Name: the name of a grouping pair. The left brace indicates that the
+first (or left) member of the pair is to be used in matching. If this
+is between replacement brackets it must be the only item. This is also
+valid in the action part.
+
+The brace actions, @code{@{name} and @code{@}name}, refer to named
+groupings. A grouping is created with the @opcoderef{grouping} and
+contains exactly two characters which represent the opening character
+and the matching closing character for a character grouping. The first
+operand is the grouping name, the second is the two (opening and
+closing) characters, and the third is the two dot patterns separated
+by a comma.
+
+Let's say that you'd like to define the opening and closing
+parentheses via multipass rules, and that you'd like to use dots
+123478 for the opening parenthesis and dots 145678 for the closing
+parenthesis. One way to do so is like this:
+
+@example
+grouping parentheses () 123478,145678
+noback correct @{parentheses @{parentheses
+noback correct @}parentheses @}parentheses
+@end example
+
+The references within the test part of the multipass rule match
+against the characters (the second operand) of the grouping rule, and
+the references within the action part replace with the dot patterns
+(the third operand) of the grouping.
+
+@item @} (right brace)
+Name: the name of a grouping pair. The right brace indicates that the
+second (or right) member is to be used in matching. See the remarks on
+the left brace immediately above.
+
+@item / (slash)
+Search the input for the expression following the slash and return
+true if found. This can be used to set a variable.
+
+@item _ (underscore)
+Move backward. If a number follows, move backward that number of
+characters. The default is to move backward one character. This
+suboperand is valid only in test parts. The test fails if moving
+backward beyond the beginning of the input string.
+
+@item [ (left bracket)
+start replacement here. This suboperand must always be paired with a
+right bracket and is valid only in test parts. Multiple pairs of
+square brackets in a single expression are not allowed.
+
+@item ] (right bracket)
+end replacement here. This suboperand must always be paired with a
+left bracket and is valid only in test parts.
+
+@item # (number sign or crosshatch)
+test or set a variable. Variables are referred to by numbers
+(0 through 49), e.g. @code{#1}, @code{#2}, @code{#25}.
+Variables may be set by one @code{context} or multipass opcode and tested
+by another. Thus, an operation that occurs at one place in a translation
+can tell an operation that occurs later within the same pass about itself.
+This feature is used in math translation, and may also help to alleviate
+the need for new opcodes. This suboperand is valid everywhere.
+
+Variables are set in the action part. To set a variable, use an
+expression like @code{#1=1}. All of the variables are initialized to 0
+at the start of each pass.
+
+Variables can also be incremented and decremented by one in the action
+part with expressions like @code{#1+} and @code{#3-} respectively.
+An attempt to decrement a variable below 0 is silently ignored.
+
+Variables are tested in the test part with conditional expressions like:
+@code{#1=2}, @code{#3<4}, @code{#5>6}, @code{#7<=8}, @code{#9>=10}.
+
+@item * (asterisk)
+Copy the input characters or dot patterns within the replacement brackets
+into the output, and discard anything else that was matched. If there are
+no replacement brackets then copy all of the matched input. This
+suboperand is only valid within the action part. It may be specified any
+number of times. This feature is used, for example, for handling numeric
+subscripts in Nemeth.
+
+@item ? (question mark)
+Valid only in the action part. The characters to be replaced are
+simply ignored. That is, they are replaced with nothing. If either
+member of a grouping pair is in the replace brackets the other member
+at the same level is also removed.
+
+@end table
+
+@anchor{valid attribute characters}
+The valid characters which can be used in attribute strings are as
+follows:
+
+@table @kbd
+@item a
+any attribute
+@item d
+digit
+@item D
+literary digit
+@item l
+letter
+@item m
+math
+@item p
+punctuation
+@item S
+sign
+@item s
+space
+@item U
+uppercase
+@item u
+lowercase
+@item w
+first user-defined class
+@item x
+second user-defined class
+@item y
+third user-defined class
+@item z
+fourth user-defined class
+@end table
+
+The following illustrates the algorithm how text is evaluated with
+multipass expressions:
+
+@noindent
+Loop over context, pass2, pass3 and pass4 and do the following for each pass:
+
+@enumerate a
+@item
+Match the text following the cursor against all expressions in the
+current pass. If an expression has square brackets to indicate the
+part to be replaced, and the opening bracket would correspond with a
+position before the cursor, it is not a match.
+@item
+If there is no match: shift the cursor one position to the right and
+continue the loop
+@item
+If there are matches: choose the longest match
+@item
+Do the replacement. If the expression has square brackets, the part of
+the input that matches the part in between the brackets is replaced
+with the right-hand side of the rule. If the expression has no square
+brackets, the whole match is replaced.
+@item
+Place the cursor after the replaced text
+@item
+continue loop
+@end enumerate
+
+Normally, when a rule is applied, the characters in the input that the
+rule applies to are "consumed", i.e. the position of the input string
+is stepped forward, and the characters are no longer available for
+subsequent rules. However, with the multipass opcodes, the
+@opcoderef{context} opcode and the @opcoderef{correct} opcode, it is
+possible to make rules which don't consume any characters from the
+input. This could happen, e.g. if you use the @opcoderef{context}
+opcode to insert a dot pattern before a special group of characters.
+In these cases, Liblouis will always advance the position by one
+character to make sure that the program doesn't apply a rule to the
+same characters again and again.
+
+@node The correct Opcode
+@section The correct Opcode
+
+@table @code
+@opcode{correct, test action}
+Because some input (such as that from an OCR program) may contain
+systematic errors, it is sometimes advantageous to use a
+pre-translation pass to remove them. The errors and their corrections
+are specified by the @code{correct} opcode. If there are no
+@code{correct} opcodes in a table, the pre-translation pass is not used.
+If any back-translation corrections have been specified then they are
+applied in a post-translation (i.e.@: the very last) pass.
+
+Note that like the @opcoderef{context} and multi-pass opcodes, the
+@code{correct} opcode must be preceded by @opcoderef{noback} or
+@opcoderef{nofor}.
+
+The format of the @code{correct} opcode is very similar to that
+of the @opcoderef{context}. The only difference is that in the action
+part strings may be used and dot patterns may not be used. Some
+examples of @code{correct} opcode entries are:
+
+@example
+noback correct "\\" ? Eliminate backslashes
+noback correct "cornf" "comf" fix a common "scano"
+noback correct "cornm" "comm"
+noback correct "cornp" "comp"
+noback correct "*" ? Get rid of stray asterisks
+noback correct "|" ? ditto for vertical bars
+noback correct "\s?" "?" drop space before question mark
+@end example
+
+@end table
+
+@node The match Opcode
+@section The match Opcode
+
+The match opcode is similar the multipass opcodes and can be seen as
+the more low-level and powerful cousin to the @opcoderef{context}.
+
+@strong{Note:} For historical reasons despite being fairly similar in
+syntax and functionality both the @opcoderef{context} and the
+@opcoderef{match} exist and are in use in modern braille tables. But
+in the future they might be merged under some common opcode. For that
+reason consider the match opcode @emph{somewhat experimental}.
+
+@table @code
+@opcode{match, pre-pattern characters post-pattern dots}
+
+This opcode allows for matching a string of characters via @emph{pre}
+and @emph{post patterns}. The patterns are specified using an
+expression syntax somewhat like regular expressions (@pxref{pattern
+expression syntax}). A single hyphen (@samp{-}) by itself means no
+pattern is specified.
+
+The following will replace @samp{xyz} with the dots
+@samp{1346-13456-1356} when it appears in the string @samp{abxyzcd}.
+
+@example
+match ab xyz cd 1346-13456-1356
+@end example
+
+The following will replace @samp{ONE} with @samp{3456-1} when it
+starts the input and is followed by @samp{:}
+
+@example
+match ^ ONE : 3456-1
+@end example
+@end table
+
+@anchor{pattern expression syntax}
+The @code{pre-pattern} and the @code{post-pattern} can contain
+any of the following expressions:
+
+@table @samp
+@item [ ]
+Expression can be any of the characters between the brackets. If only
+one character present then the brackets are not needed unless it is a
+special character, in which it should be escaped with the backslash.
+
+@item .
+Expression can be any character.
+
+@item %[ ]
+Expression is a character with the attributes listed between the
+brackets. If only one character is present then the brackets are not
+needed. The set of attributes are specified as follows:
+
+@table @samp
+@item _
+space
+@item #
+digit
+@item a
+letter
+@item u
+uppercase
+@item l
+lowercase
+@item .
+punctuation
+@item $
+sign
+@end table
+
+@item ^
+Match at the end of input processing (or beginning depending of the
+direction pre or post).
+
+@item $
+Same as @samp{^}.
+@end table
+
+For example the following will replace @samp{bb} with the dots @samp{23} when it
+is between letters.
+
+@example
+match %a bb %a 23
+@end example
+
+The following will replace @samp{con} with the dots @samp{25} when it
+is preceded by a space or beginning of input, and followed by an
+@samp{s} and then any letter.
+
+@example
+match %[^_] con s%a 25
+@end example
+
+Similar to regular expressions the pattern expressions can contain
+grouping, quantifiers and even negation:
+
+@table @samp
+@item ( )
+Expressions between parentheses are grouped together as one
+expression.
+
+@item !
+The following expression is negated.
+
+@item ?
+The previous expression must match zero or one times.
+
+@item *
+The previous expression must match zero or more times.
+
+@item +
+The previous expression must match one or more times.
+
+@item |
+Either the previous or the following expressions must match.
+@end table
+
+For example the following will replace @samp{ing} with the dots
+@samp{346} when it is @emph{not} preceded by a space or beginning of
+input. What follows after the @samp{ing} does not matter, hence the
+@samp{-}.
+
+@example
+match !%[^_] ing - 346
+@end example
+
+The following will replace @samp{con} with the dots @samp{25} when it
+is preceded by a space, or beginning of input; then followed by a
+@samp{c} that is followed by any character but @samp{h}.
+
+@example
+match %[^_] con c!h 25
+@end example
+
+@node Miscellaneous Opcodes
+@section Miscellaneous Opcodes
+
+@table @code
+@opcode{include, filename}
+Read the file indicated by @code{filename} and incorporate or include
+its entries into the table. Included files can include other files,
+which can include other files, etc. For an example, see what files are
+included by the entry include @file{en-us-g1.ctb} in the table
+@file{en-us-g2.ctb}. If the included file is not in the same directory
+as the main table, use a full path name for filename.
+
+@opcode{undefined, dots}
+If this opcode is used in a table any characters which have not been
+handled in the table but are encountered in the text will be replaced
+by the dot pattern. If this opcode is not used, any undefined
+characters are replaced by @code{'\xhhhh'}, where the h's are
+hexadecimal digits.
+
+@opcode{display, character dots}
+Associates dot patterns with the characters which will be sent to a
+braille embosser, display or screen font. The character must be in the
+range 0-255 and the dots must specify a single cell. Here are some
+examples:
+
+@example
+# When the character a is sent to the embosser or display,
+# it will produce a dot 1.
+display a 1
+@end example
+
+@example
+# When the character L is sent to the display or embosser
+# it will produce dots 1-2-3.
+display L 123
+@end example
+
+The @code{display} opcode is optional. It is used when the embosser or
+display has a different mapping of characters to dot patterns than
+that given in @ref{Character-Definition Opcodes}. If used, display
+entries must proceed character-definition entries.
+
+A possible use case would be to define display opcodes so that the
+result is Unicode braille for use on a display and a second set of
+display opcodes (in a different file) to produce plain ASCII braille
+for use with an embosser.
+
+@opcode{multind, dots opcode opcode ...}
+The @code{multind} opcode tells the back-translator that a sequence of
+braille cells represents more than one braille indicator. For example,
+in @file{en-us-g2.ctb} we have @code{multind 56-6 letsign capsletter}.
+The back-translator can generally handle single braille indicators,
+but it cannot apply them when they immediately follow each other. It
+recognizes the letter sign if it is followed by a letter and takes
+appropriate action. It also recognizes the capital sign if it is
+followed by a letter. But when there is a letter sign followed by a
+capital sign it fails to recognize the letter sign unless the sequence
+has been defined with @code{multind}. A @code{multind} entry may not
+contain a comment because liblouis would attempt to interpret it as an
+opcode.
+
+@end table
+
+@node Notes on Back-Translation
+@chapter Notes on Back-Translation
+
+@anchor{General Notes}
+@section General Notes
+
+Back-translation refers to the process of translating backwards,
+i.e.@: from Braille to text. For many years, Liblouis was mainly
+concerned with forward translation, and so were most of the authors of
+the translation tables. Today however, Liblouis is being used
+extensively in conjunction with screen reading programs like NVDA and
+JAWS for Windows as well as Braille note-takers like BrailleSense from
+HIMS and BrailleNote from HumanWare. So when writing a translation
+table for Liblouis, it is indeed relevant to consider how the table
+will work when used for back-translation, if anything special must be
+done, or if you want to write separate tables for forward translation
+and back-translation.
+
+Back-translation is generally harder to do in a computer program than
+forward translation. Ideally, any text could be translated to Braille
+and then translated back to text giving exactly the same result as the
+original. However, many Braille codes omit a lot of information and
+leaves it to the reader to fill in the missing bits. An example of this
+is letters with accents. In languages where accents are uncommon, e.g.
+English, Accented letters are usually just marked with a Braille
+indicator stating that there is an accent, but not which accent, even
+though this may be crucial to the meaning of the word or the sentence.
+Another example of this is when not all capital letters are marked in
+the Braille code, but only the "important" capital letters. A third
+example is when a Braille character serves as both a punctuation sign,
+a math sign, and perhaps even as a contraction, and the Braille code
+then leaves it up to the reader to use his/her knowledge of the context
+to decide the meaning of the Braille character.
+
+In some cases, you may need to bend the rules of the Braille code if it
+is important to create Braille that can be properly back-translated.
+This may include marking all capital letters instead of just the
+"important" ones, or perhaps marking a Braille character with an
+indicator stating that this character should in fact be interpreted as
+a math sign and not a punctuation or Braille contraction. In some
+cases, the best solution may be to create two separate sets of tables
+for forward translation: One set for Braille that must be
+back-translatable (for use with screen readers and note-takers), and
+another for good and nice literary Braille (for embossing).
+But no matter how you bend the Braille code, the back-translation
+process may not be perfect.
+
+@anchor{Back-translation with Liblouis}
+@section Back-translation with Liblouis
+
+Back-translation is carried out by the function
+@code{lou_backTranslateString}. Its calling sequence is described in
+@ref{Programming with liblouis}. @code{lou_backTranslateString} first
+performs @code{pass4}, if
+present, then @code{pass3}, then @code{pass2}, then the
+backtranslation, then corrections. Note that this is exactly the
+inverse of forward translation.
+
+Most opcodes can be preceded by @opcoderef{noback} or @opcoderef{nofor},
+and the @code{correct}, @code{context} and multi-pass opcodes must be
+preceded with either @code{noback} or @code{nofor}. So in most cases,
+it will be perfectly possible to make one table for translation in both
+directions, although a separate table for forward and backward
+translation might be more readable in some cases.
+
+Most of the opcodes associated with pass 1 have two operands, a
+character operand to the left and a dots operand to the right. During
+forward translation, these operands are used to replace the characters
+with the dot pattern according to the conditions of the opcode. The
+opcode works from left to right. When back-translating, these opcodes
+work the opposite way. The dot patterns are replaced by the text. The
+opcodes work from right to left.
+
+On the other hand, the @code{correct}, @code{context} and multi-pass
+opcodes have a test part to the left and an action part to the right.
+These opcodes work from left to right in both translation directions.
+The test is performed, and if true, the action is executed, i.e.@:
+replacing, inserting or deleting characters or dots. This is why a
+translation direction always has to be specified with these opcodes
+using @code{noback} or @code{nofor}.
+
+@node Table Metadata
+@chapter Table Metadata
+
+Translation tables may contain metadata. This makes them
+discoverable. Programs may for example use the Liblouis function
+@ref{lou_findTable,@code{lou_findTable}} to find a table based on a
+special query of which the @ref{Query Syntax,syntax} is described
+below.
+
+@section Syntax
+
+Metadata must be defined in special comments within the table
+header. The table header is the area at the top of the file, before
+the first translation rule, consisting of only comments or empty
+lines. Any metadata within included tables is ignored.
+
+A metadata field must be defined on its own line, starting with
+@code{#+}. It has the following syntax:
+
+@example
+#+<key>: <value>
+@end example
+
+where @samp{<key>} and @samp{<value>} are sequences of one or more
+characters @code{a} to @code{z}, @code{A} to @code{Z}, @code{0} to
+@code{9}, @code{.}, @code{-}, and @code{_}. The colon that separates
+the key and value may have zero or more spaces or tabs on either side.
+
+A value is optional. In case of no value the colon must be omitted as
+well:
+
+@example
+#+<key>
+@end example
+
+There is no restriction on which keys and values are allowed, as long
+as the syntax is correct. However in order to be really useful there
+must be some standard keys and values. A possible grammar is proposed
+on the wiki page
+@url{https://github.com/liblouis/liblouis/wiki/Table-discovery-based-on-table-metadata#standard-metadata-tags, Standard metadata tags}.
+
+@anchor{Query Syntax}
+@section Query Syntax
+
+A query that is passed to the @ref{lou_findTable,@code{lou_findTable}}
+function must have the following syntax:
+
+@example
+<feature1> <feature2> <feature3> ...
+@end example
+
+where @samp{<feature>} is either:
+
+@example
+<key>: <value>
+@end example
+
+or:
+
+@example
+<key>
+@end example
+
+Features are separated by one or more spaces or tabs. No spaces are
+allowed around colons.
+
+@node Testing Translation Tables interactively
+@chapter Testing Translation Tables interactively
+
+A number of test programs are provided as part of the liblouis
+package. They are intended for testing liblouis and for debugging
+tables. None of them is suitable for braille transcription. An
+application that can be used for transcription is @command{file2brl},
+which is part of the liblouisutdml package (@pxref{Top, , Introduction,
+liblouisutdml, Liblouisutdml User's and Programmer's Manual}). The source
+code of the test programs can be studied to learn how to use the
+liblouis library and they can be used to perform the following
+functions.
+
+@anchor{common options}
+All of these programs recognize the @option{--help} and
+@option{--version} options.
+
+@table @option
+
+@item --help
+@itemx -h
+Print a usage message listing all available options, then exit
+successfully.
+
+@item --version
+@itemx -v
+Print the version number, then exit successfully.
+
+@end table
+
+Most test programs let you specify one or multiple tables to use.
+These tables are usually found in standard locations in the file
+system or local to where the command is executed. @xref{How tables are
+found}, for a description on how the tables are located.
+
+@menu
+* lou_debug::
+* lou_trace::
+* lou_checktable::
+* lou_allround::
+* lou_translate (program)::
+* lou_checkhyphens::
+* lou_checkyaml::
+@end menu
+
+@node lou_debug
+@section lou_debug
+@pindex lou_debug
+
+The @command{lou_debug} tool is intended for debugging liblouis
+translation tables. The command line for @command{lou_debug} is:
+
+@example
+lou_debug [OPTIONS] TABLE[,TABLE,...]
+@end example
+
+The command line options that are accepted by @command{lou_debug} are
+described in @ref{common options}.
+
+The table (or comma-separated list of tables) is compiled. If no
+errors are found a brief command summary is printed, then the prompt
+@samp{Command:}. You can then input one of the command letters and get
+output, as described below.
+
+Most of the commands print information in the various arrays of
+@code{TranslationTableHeader}. Since these arrays are pointers to
+chains of hashed items, the commands first print the hash number, then
+the first item, then the next item chained to it, and so on. After
+each item there is a prompt indicated by @samp{=>}. You can then press
+enter (@kbd{@key{RET}}) to see the next item in the chain or the first
+item in the next chain. Or you can press @kbd{h} (for next-(h)ash) to
+skip to the next hash chain. You can also press @kbd{e} to exit the
+command and go back to the @samp{command:} prompt.
+
+@table @kbd
+@item h
+Brings up a screen of somewhat more extensive help.
+
+@item f
+Display the first forward-translation rule in the first non-empty hash
+bucket. The number of the bucket is displayed at the beginning of the
+chain. Each rule is identified by the word @samp{Rule:}. The fields
+are displayed by phrases consisting of the name of the field, an equal
+sign, and its value. The before and after fields are displayed only if
+they are nonzero. Special opcodes such as the @opcoderef{correct} and
+the multipass opcodes are shown with the code that instructs the
+virtual machine that interprets them. If you want to see only the
+rules for a particular character string you can type @kbd{p} at the
+@samp{command:} prompt. This will take you to the @samp{particular:}
+prompt, where you can press @kbd{f} and then type in the string. The
+whole hash chain containing the string will be displayed.
+
+@item b
+Display back-translation rules. This display is very similar to that
+of forward translation rules except that the dot pattern is displayed
+before the character string.
+
+@item c
+Display character definitions, again within their hash chains.
+
+@item d
+Displays single-cell dot definitions. If a character-definition opcode
+gives a multi-cell dot pattern, it is displayed among the
+back-translation rules.
+
+@item C
+Display the character-to-dots map. This is set up by the
+character-definition opcodes and can also be influenced by the
+@opcoderef{display}.
+
+@item D
+Display the dot to character map, which shows which single-cell dot
+patterns map to which characters.
+
+@item z
+Show the multi-cell dot patterns which have been assigned to the
+characters from 0 to 255 to comply with computer braille codes such as
+a 6-dot code. Note that the character-definition opcodes should use
+8-dot computer braille.
+
+@item p
+Bring up a secondary (@samp{particular:}) prompt from which you can
+examine particular character strings, dot patterns, etc. The commands
+(given in its own command summary) are very similar to those of the
+main @samp{command:} prompt, but you can type a character string or
+dot pattern. They include @kbd{h}, @kbd{f}, @kbd{b}, @kbd{c}, @kbd{d},
+@kbd{C}, @kbd{D}, @kbd{z} and @kbd{x} (to exit this prompt), but not
+@kbd{p}, @kbd{i} and @kbd{m}.
+
+@item i
+Show braille indicators. This shows the dot patterns for various
+opcodes such as the @opcoderef{capsletter} and the @opcoderef{numsign}.
+It also shows emphasis dot patterns, such as those for the
+@opcoderef{begemphword}, the @opcoderef{begemphphrase}, etc. If a
+given opcode has not been used nothing is printed for it.
+
+@item m
+Display various miscellaneous information about the table, such as the
+number of passes, whether certain opcodes have been used, and whether
+there is a hyphenation table.
+
+@item q
+Exit the program.
+@end table
+
+@node lou_trace
+@section lou_trace
+@pindex lou_trace
+
+When working on translation tables it is sometimes useful to determine
+what rules were applied when translating a string. @command{lou_trace}
+helps with exactly that. It list all the the applied rules for a given
+translation table and an input string.
+
+@example
+lou_trace [OPTIONS] TABLE[,TABLE,...]
+@end example
+
+Aside from the standard options (@pxref{common options})
+@command{lou_trace} also accepts the following options:
+
+@table @option
+
+@item --forward
+@itemx -f
+Trace a forward translation.
+
+@item --backward
+@itemx -b
+Trace a backward translation.
+
+@end table
+
+If no options are given forward translation is assumed.
+
+Once started you can type an input string followed by @kbd{@key{RET}}.
+@command{lou_trace} will print the braille translation followed by
+list of rules that were applied to produce the translation. A possible
+invocation is listed in the following example:
+
+@example
+$ lou_trace tables/en-us-g2.ctb
+the u.s. postal service
+! u4s4 po/al s@}vice
+1. largesign the 2346
+2. repeated 0
+3. lowercase u 136
+4. punctuation . 46
+5. context _$l["."]$l @@256
+6. lowercase s 234
+7. postpunc . 256
+8. repeated 0
+9. begword post 1234-135-34
+10. largesign a 1
+11. lowercase l 123
+12. repeated 0
+13. lowercase s 234
+14. always er 12456
+15. lowercase v 1236
+16. lowercase i 24
+17. lowercase c 14
+18. lowercase e 15
+19. pass2 $s1-10 @@0
+20. pass2 $s1-10 @@0
+21. pass2 $s1-10 @@0
+@end example
+
+@node lou_checktable
+@section lou_checktable
+@pindex lou_checktable
+
+To use this program type the following:
+
+@example
+lou_checktable [OPTIONS] TABLE
+@end example
+
+Aside from the standard options (@pxref{common options})
+@command{lou_checktable} also accepts the following options:
+
+@table @option
+
+@item --quiet
+@itemx -q
+Do not write to standard error if there are no errors.
+
+@end table
+
+If the table contains errors, appropriate messages will be displayed.
+If there are no errors the message @samp{no errors found.} will be
+shown.
+
+@node lou_allround
+@section lou_allround
+@pindex lou_allround
+
+This program tests every capability of the liblouis library. It is
+completely interactive. Invoke it as follows:
+
+@example
+lou_allround [OPTIONS]
+@end example
+
+The command line options that are accepted by @command{lou_allround}
+are described in @ref{common options}.
+
+You will see a few lines telling you how to use the program. Pressing
+one of the letters in parentheses and then enter will take you to a
+message asking for more information or for the answer to a yes/no
+question. Typing the letter @samp{r} and then @key{RET} will take you
+to a screen where you can enter a line to be processed by the library
+and then view the results.
+
+@node lou_translate (program)
+@section lou_translate
+@pindex lou_translate
+
+This program translates whatever is on the standard input unit and
+prints it on the standard output unit. It is intended for large-scale
+testing of the accuracy of translation and back-translation. The
+command line for @command{lou_translate} is:
+
+@example
+lou_translate [OPTION] TABLE[,TABLE,...]
+@end example
+
+Aside from the standard options (@pxref{common options}) this program
+also accepts the following options:
+
+@table @option
+
+@item --forward
+@itemx -f
+Do a forward translation.
+
+@item --backward
+@itemx -b
+Do a backward translation.
+
+@end table
+
+If no options are given forward translation is assumed.
+
+Use the following command to do a forward translation with translation
+table @file{en-us-g2.ctb}. The resulting braille is ASCII encoded (as
+defined in @file{en-us-g2.ctb}).
+
+@example
+lou_translate --forward en-us-g2.ctb < input.txt
+@end example
+
+The next example illustrates a forward translation with translation
+table @file{en-us-g2.ctb} and display table @file{unicode.dis}. The
+resulting braille is encoded as Unicode dot patterns (as defined in
+@file{unicode.dis}).
+
+@example
+lou_translate --forward unicode.dis,en-us-g2.ctb < input.txt
+@end example
+
+Use a pipe if you would rather just pass some given text to the
+translator.
+
+@example
+echo "The quick brown fox jumps over the lazy dog" | lou_translate -f unicode.dis,en-us-g2.ctb
+@end example
+
+The result will be written to standard output:
+
+@example
+⠠⠮ ⠟⠅ ⠃⠗⠪⠝ ⠋⠕⠭ ⠚⠥⠍⠏⠎ ⠕⠧⠻ ⠮ ⠇⠁⠵⠽ ⠙⠕⠛
+@end example
+
+Backward translation can be done as follows:
+
+@example
+echo ",! qk br@{n fox jumps ov@} ! lazy dog" | lou_translate --backward en-us-g2.ctb
+@end example
+
+which results in
+
+@example
+The quick brown fox jumps over the lazy dog
+@end example
+
+You can also do a backward translation using Unicode dot patterns
+
+@example
+echo "⠠⠮ ⠟⠅ ⠃⠗⠪⠝ ⠋⠕⠭" | lou_translate --backward unicode.dis,en-us-g2.ctb
+@end example
+
+resulting in
+
+@example
+The quick brown fox
+@end example
+
+@node lou_checkhyphens
+@section lou_checkhyphens
+@pindex lou_checkhyphens
+
+This program checks the accuracy of hyphenation in Braille translation
+for both translated and untranslated words. It is completely
+interactive. Invoke it as follows:
+
+@example
+lou_checkhyphens [OPTIONS]
+@end example
+
+The command line options that are accepted by
+@command{lou_checkhyphens} are described in @ref{common options}.
+
+You will see a few lines telling you how to use the program.
+
+@node lou_checkyaml
+@section lou_checkyaml
+@pindex lou_checkyaml
+
+This program tests a liblouis table against a corpus of known good
+Braille translations defined in YAML format. For a description of the
+format refer to @ref{YAML Tests}. The program returns 0 if all tests
+pass or 1 if any of the tests fail. If @code{libyaml} is not installed
+the program will simply skip all tests. Invoke it as follows:
+
+@example
+lou_checkyaml YAML_TEST_FILE
+@end example
+
+The command line options that are accepted by
+@command{lou_checkyaml} are described in @ref{common options}.
+
+@cindex Running YAML tests manually
+@cindex Running individual YAML tests
+Due to some technical limitations the YAML tests work best if the
+@env{LOUIS_TABLEPATH} is set up correctly. By running @command{make}
+this is all taken care for you. You can also run individual YAML tests
+as shown in the following example:
+
+@example
+cd tests
+make check TESTS=yaml/en-ueb-g2_backward.yaml
+@end example
+
+@node Automated Testing of Translation Tables
+@chapter Automated Testing of Translation Tables
+
+There are a number of automated tests for liblouis and they are
+proving to be of tremendous value. When changing the code the
+developers can run the tests to see if anything broke.
+
+The easiest way to test the translation tables is to write a YAML file
+where you define the table that is to be tested and any number of
+words or phrases to translate together with their respective expected
+translation.
+
+The YAML tests are data driven, i.e.@: you give the test data, a string
+to translate and the expected output. The data is in a standard format
+namely YAML. If you have @file{libyaml} installed they will
+automatically be invoked as part of the standard @command{make check}
+command.
+
+@anchor{YAML Tests}
+@section YAML Tests
+@url{http://yaml.org/,YAML} is a human readable data serialization
+format that allows for an easy and compact way to define tests.
+
+A YAML file first defines which tables are to be used for the tests.
+Then it optionally defines flags such as the @samp{testmode}. Finally
+all the tests are defined.
+
+You can repeat the cycle as many times as you like (tables, optional
+flags, tests). You can also define several rounds of tests for any
+table, with or without the optional flags. Just remember that the
+flags are reset to their default values each time you start a new
+round of tests or load a new set of tables.
+
+Let's just look at a simple example how tests could be defined:
+
+@iftex
+@emph{(For technical reasons the Unicode braille in the expected
+translation in the following YAML examples is not displayed correctly.
+Please refer to the example YAML file @file{example_test.yaml} in the
+@file{tests} directory of the source distribution or read these
+examples in another version of the documentation such as HTML)}
+@end iftex
+
+@example
+# comments start with '#' anywhere on a line
+# first define which tables will be used for your tests
+table: [unicode.dis, en-ueb-g1.ctb]
+
+# then optionally define flags such as testmode. If no flags are
+# defined forward translation is assumed
+
+# now define the tests
+tests:
+ - # each test is a list.
+ # The first item is the string to translate. Quoting of strings is
+ # optional
+ - hello
+ # The second item is the expected translation
+ - ⠓⠑⠇⠇⠕
+ - # optionally you can define additional parameters in a third
+ # item such as typeform or expected failure, etc
+ - Hello
+ - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+ - @{typeform: @{italic: '++++ '@}, xfail: true@}
+ - # a simple, no-frills test
+ - Good bye
+ - ⠠⠛⠕⠕⠙ ⠃⠽⠑
+ # same as above using "flow style" notation
+ - [Good bye, ⠠⠛⠕⠕⠙ ⠃⠽⠑]
+@end example
+
+The four basic components of a test file are as follows:
+
+@table @samp
+@item table
+A list containing table files, which the tests should be run against.
+This is usually just one file, but for some situations more than one
+file can be required. For example:
+
+@example
+table: [hu-hu-g1.ctb, hyph_hu_HU.dic]
+@end example
+
+It is also possible to specify a table inline. @ref{Inline definition
+of tables} below explains how to do this.
+
+A third way to specify a table is by its metadata. A table query,
+which is essentially as list of ``features'', is matched against the
+@ref{Table Metadata,table metadata} defined inside the tables
+contained in @env{LOUIS_TABLEPATH}. Only the best match is used for
+the test.
+
+The syntax of the query is a variation of the @ref{Query
+Syntax,syntax} used for the @ref{lou_findTable,@code{lou_findTable}}
+function:
+
+@example
+table:
+ locale: fr
+ grade: 1
+@end example
+
+@item display
+A display table, which should be used to encode braille in the
+test. This item is optional. If it is present it should be the first
+item of the file. If it is not present, the braille encoding of each
+test is determined by the table that is being tested.
+
+The next example shows how to test the @file{en-ueb-g1.ctb} table
+using ASCII notation (as defined in @file{en-ueb-g1.ctb} itself):
+
+@example
+table: [en-ueb-g1.ctb]
+@end example
+
+If you wanted to test the @file{en-ueb-g1.ctb} table using Unicode dot
+patterns then you would use the following definition:
+
+@example
+display: unicode.dis
+table: [en-ueb-g1.ctb]
+@end example
+
+@item flags
+The flags that apply for all tests in this file. At the moment only
+the @samp{testmode} flag is supported. It can have four possible
+values:
+
+@table @samp
+@item forward
+This indicates that the tests are for forward translation
+@item backward
+This indicates that the tests are for backward translation
+@item bothDirections
+This indicates that the tests are for both forward and backward translation.
+@item hyphenate
+This indicates that the tests are for hyphenation
+@item hyphenateBraille
+This indicates that the tests are for hyphenation and the input is braille
+@end table
+
+If no flags are defined forward translation is assumed.
+
+@item tests
+A list of tests. Each test consists of a list of two, three or in some
+cases even four items. The first item is the unicode text to be
+tested. The second item is the expected braille output. This can be
+either unicode braille or an ASCII-braille like encoding. Quoting
+strings is optional. Comments can be inserted almost anywhere using
+the @samp{#} sign. A simple test would look at follows:
+
+@example
+ - # a simple, no-frills test
+ - Good bye
+ - ⠠⠛⠕⠕⠙ ⠃⠽⠑
+@end example
+
+Using the more compact ``flow style'' notation it would look like the
+following:
+
+@example
+ - [Good bye, ⠠⠛⠕⠕⠙ ⠃⠽⠑]
+@end example
+
+An optional third item can contain additional options for a test such
+as the typeform, or whether a test is expected to fail. The following
+shows a typical example:
+
+@example
+ -
+ - Hello
+ - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+ - @{typeform: @{italic: '++++ '@}, xfail: true@}
+ # same test more compact
+ - [Hello, ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄, @{typeform: @{italic: '++++ '@}, xfail: true@}]
+@end example
+
+The valid additional options for a test are as follows:
+
+@table @samp
+@item xfail
+Whether a test is expected to fail. If you expect a test to fail, set
+this to @samp{true}. If you prefer you can also specify a reason for
+the failure:
+
+@example
+ - [Hello, ⠨, @{xfail: Test case is not complete@}]
+@end example
+
+If you expect a test case to pass then just don't mark it with
+@samp{xfail} or if you really have to, set @samp{xfail} to
+@samp{false} or @samp{off}.
+
+@item typeform
+The typeform used for a translation. It consists of one or more
+emphasis specifications. For each character in the specifications that
+is not a space the corresponding emphasis will be set. Valid options
+for emphasis are @samp{italic}, @samp{underline}, @samp{bold},
+@samp{computer_braille}, @samp{passage_break}, @samp{word_reset},
+@samp{script}, @samp{trans_note}, @samp{trans_note_1},
+@samp{trans_note_2}, @samp{trans_note_3}, @samp{trans_note_4} or
+@samp{trans_note_5}. The following shows an example where both
+@samp{italic} and @samp{underline} are specified:
+
+@example
+ -
+ - Hello
+ - ⠨⠶⠠⠓⠑⠇⠇⠕⠨⠄
+ - typeform:
+ italic: '++++ '
+ underline: ' +'
+@end example
+
+@item inputPos
+A list of 0-based input positions, one for each output position.
+Useful when simulating screen reader interaction, to debug contraction
+and cursor behavior as in the following example. Note that all
+positions in this and the following examples start at 0. Also note
+that in these examples the additional options are not passed using the
+``flow style'' notation.
+
+@example
+ -
+ - went
+ - ⠺⠢⠞
+ - inputPos: [0,1,3]
+@end example
+
+@item outputPos
+A list of 0-based output positions, one for each input position. Useful when
+simulating screen reader interaction, to debug contraction and cursor
+behavior as in the following example.
+
+@example
+ -
+ - went
+ - ⠺⠢⠞
+ - outputPos: [0,1,1,2]
+@end example
+
+@item cursorPos
+The cursor position for the given translation and optionally an
+expected cursor position where the cursor is supposed to be after the
+translation. Useful when simulating screen reader interaction, to
+debug contraction and cursor behavior:
+
+The cursor position can take two forms: You can either specify a
+single number or alternatively you can give a tuple of two numbers.
+
+@table @asis
+
+@item single number (e.g. @samp{4})
+When you simply want to specify the cursor position for the given
+translation you pass a number as in the following example:
+
+@example
+ -
+ - you went to
+ - ⠽ ⠺⠑⠝⠞ ⠞⠕
+ - mode: [compbrlAtCursor]
+ cursorPos: 4
+@end example
+
+@item a tuple (e.g. @samp{[4,2]})
+When you expect the cursor to be in a particular position after the
+translation and you want to check this then pass a tuple of cursor
+positions as in the following example:
+
+@example
+ -
+ - you went to
+ - ⠽ ⠺⠑⠝⠞ ⠞⠕
+ - mode: [compbrlAtCursor]
+ cursorPos: [4,2]
+@end example
+@end table
+
+@item mode
+A list of translation modes that should be used for this test. If not
+defined defaults to 0. Valid mode values are @samp{noContractions},
+@samp{compbrlAtCursor}, @samp{dotsIO}, @samp{compbrlLeftCursor},
+@samp{ucBrl}, @samp{noUndefined} or @samp{partialTrans}.
+
+For a description of the various translation mode flags, please see
+the function @ref{lou_translateString}.
+
+@item maxOutputLength
+Define a maximum length of the output. This can be used to test the
+behavior of liblouis in the face of a limited output buffer, for
+example the length of the refreshable braille display.
+
+@end table
+
+@end table
+
+@subsection Optional test description
+When a test contains three or four items the first item is assumed to
+be a test description, the second item is the unicode text to be
+tested and the third item is the expected braille output. Again an
+optional fourth item can contain additional options for the test. The
+following shows an example:
+
+@example
+ -
+ - Number-text-transitions with italic
+ - 123abc
+ - ⠼⠁⠃⠉⠨⠶⠰⠁⠃⠉⠨⠄
+ - @{typeform: '000111'@}
+@end example
+
+In case the test fails the description will be printed together with
+the expected and the actual braille output.
+
+For more examples and inspiration please see the YAML tests
+(@file{*.yaml}) in the @file{tests} directory of the source
+distribution.
+
+@subsection Testing multiple tables within the same YAML test file
+Sometimes you are more focused on testing a particular feature across
+several tables rather than just testing one table. For that reason the
+following is also allowed:
+
+@example
+table: ...
+tests:
+ - [..., ...]
+ - [..., ...]
+table: ...
+tests:
+ - [..., ...]
+ - [..., ...]
+@end example
+
+If you specify flags for the tests, remember that the flags are reset
+to their default values when you specify a new table.
+
+@subsection Multiple test sections for each table
+You can specify several sections of tests for each table, with or
+without the optional flags. This is useful e.g. if you want to have
+various tests for both forward and backward translation for the same
+set of tables, especially if you are defining the table as part of
+the yaml file (see next section). This feature is also useful if you
+simply want to devide your tests into multiple sections for better
+overview. All flags are reset to their default values when you start
+a new test section.
+
+Thus, a yaml file might look as follows:
+
+@example
+table: ...
+tests:
+ - [..., ...]
+ - [..., ...]
+
+# Some more tests
+ tests:
+ - [..., ...]
+ - [..., ...]
+
+# Some tests for back-translation - same table
+flags: @{testmode: backward@}
+ - [..., ...]
+ - [..., ...]
+@end example
+
+@anchor{Inline definition of tables}
+@subsection Inline definition of tables
+When testing very specific opcode combinations it is sometimes tedious
+to create specific test tables just for that. Hence the YAML tests
+allow for specification of table definitions inline. Instead of
+referring to a table by name you just define the table inline by using
+what the YAML spec calls a
+@url{http://www.yaml.org/spec/1.2/spec.html#id2795688,Literal Style
+Block}. Start the definition with a @samp{|}, then list the opcodes
+with an indentation. The inline table ends when the indentation ends.
+
+@example
+table: |
+ sign a 1
+ ...
+tests:
+ - ...
+ - ...
+@end example
+
+@subsection Running the same test data on multiple tables
+Sometimes you maintain multiple tables which are very similar and
+basically contain the same test data. Instead of copying the YAML test
+and changing the table name you can also define multiple tables. This
+will cause the YAML tests to be checked against both tables.
+
+@example
+table: nl-NL
+table: nl-BE
+tests:
+ - [..., ...]
+ - [..., ...]
+@end example
+
+@node Programming with liblouis
+@chapter Programming with liblouis
+
+@menu
+* Overview (library)::
+* Data structure of liblouis tables::
+* How tables are found::
+* Deprecation of the logging system::
+* lou_version::
+* lou_translateString::
+* lou_translate::
+* lou_backTranslateString::
+* lou_backTranslate::
+* lou_hyphenate::
+* lou_compileString::
+* lou_getTypeformForEmphClass::
+* lou_dotsToChar::
+* lou_charToDots::
+* lou_registerLogCallback::
+* lou_setLogLevel::
+* lou_logFile::
+* lou_logPrint::
+* lou_logEnd::
+* lou_setDataPath::
+* lou_getDataPath::
+* lou_getTable::
+* lou_findTable::
+* lou_indexTables::
+* lou_checkTable::
+* lou_readCharFromFile::
+* lou_free::
+* lou_charSize::
+* Python bindings::
+@end menu
+
+@node Overview (library)
+@section Overview
+
+You use the liblouis library by calling the following functions,
+@code{lou_translateString}, @code{lou_backTranslateString},
+@code{lou_translate}, @code{lou_backTranslate},
+@code{lou_registerLogCallback}, @code{lou_setLogLevel},
+@code{lou_logFile}, @code{lou_logPrint}, @code{lou_logEnd},
+@code{lou_getTable}, @code{lou_findTable}, @code{lou_indexTables},
+@code{lou_checkTable}, @code{lou_hyphenate}, @code{lou_charToDots},
+@code{lou_dotsToChar}, @code{lou_compileString},
+@code{lou_getTypeformForEmphClass}, @code{lou_readCharFromFile},
+@code{lou_version}, @code{lou_free} and @code{lou_charSize}. These are
+described below. The header file, @file{liblouis.h}, also contains
+brief descriptions. Liblouis is written in straight C. It has four
+code modules, @file{compileTranslationTable.c}, @file{logging.c},
+@file{lou_translateString.c} and @file{lou_backTranslateString.c}. In
+addition, there are two header files, @file{liblouis.h}, which defines
+the API, and @file{louis.h}, used only internally and by
+liblouisutdml. The latter includes @file{liblouis.h}.
+
+Persons who wish to use liblouis from Python may want to skip ahead to
+@ref{Python bindings}.
+
+@file{compileTranslationTable.c} keeps track of all translation tables
+which an application has used. It is called by the translation,
+hyphenation and checking functions when they start. If a table has not
+yet been compiled @file{compileTranslationTable.c} checks it for
+correctness and compiles it into an efficient internal representation.
+The main entry point is @code{lou_getTable}. Since it is the module
+that keeps track of memory usage, it also contains the @code{lou_free}
+function. In addition, it contains the @code{lou_checkTable} function,
+plus some utility functions which are used by the other modules.
+
+By default, liblouis handles all characters internally as 16-bit
+unsigned integers. It can be compiled for 32-bit characters as
+explained below. The meanings of these integers are not hard-coded.
+Rather they are defined by the character-definition opcodes. However,
+the standard printable characters, from decimal 32 to 126 are
+recognized for the purpose of processing the opcodes. Hence, the
+following definition is included in @file{liblouis.h}. It is correct
+for computers with at least 32-bit processors.
+
+@example
+typedef unsigned short int widechar
+@end example
+
+To make liblouis handle 32-bit Unicode simply remove the word
+@code{short} in the above @code{typedef}. This will cause the translate and
+back-translate functions to expect input in 32-bit form and to deliver
+their output in this form. The input to the compiler (tables) is
+unaffected except that two new escape sequences for 20-bit and 32-bit
+characters are recognized.
+
+At runtime, the width of a character specified during compilation may
+be obtained using @code{lou_charSize}.
+
+Here are the definitions of the eleven liblouis functions and their
+parameters. They are given in terms of 16-bit Unicode. If liblouis has
+been compiled for 32-bit Unicode simply read 32 instead of 16.
+
+@node Data structure of liblouis tables
+@section Data structure of liblouis tables
+
+The data structure @code{TranslationTableHeader} is defined by a
+@code{typedef} statement in @file{louis.h}. To find the beginning,
+search for the word @samp{header}. As its name implies, this is
+actually the table header. Data are placed in the @code{ruleArea}
+array, which is the last item defined in this structure. This array is
+declared with a length of 1 and is expanded as needed. The table
+header consists mostly of arrays of pointers of size @code{HASHNUM}.
+These pointers are actually offsets into @code{ruleArea} and point to
+chains of items which have been placed in the same hash bucket by a
+simple hashing algorithm. @code{HASHNUM} should be a prime and is
+currently 1123. The structure of the table was chosen to optimize
+speed rather than memory usage.
+
+The first part of the table contains miscellaneous information, such
+as the number of passes and whether various opcodes have been used. It
+also contains the amount of memory allocated to the table and the
+amount actually used.
+
+The next section contains pointers to various braille indicators and
+begins with @code{capitalSign}. The rules pointed to contain the
+dot pattern for the indicator and an opcode which is used by the
+back-translator but does not appear in the list of opcodes. The
+braille indicators also include various kinds of emphasis, such as
+italic and bold and information about the length of emphasized
+phrases. The latter is contained directly in the table item instead of
+in a rule.
+
+After the braille indicators comes information about when a letter
+sign should be used.
+
+Next is an array of size @code{HASHNUM} which points to character
+definitions. These are created by the character-definition opcodes.
+
+Following this is a similar array pointing to definitions of
+single-cell dot patterns. This is also created from the
+character-definition opcodes. If a character definition contains a
+multi-cell dot pattern this is compiled into ordinary forward and
+backward rules. If such a multi-cell dot pattern contains a single
+cell which has not previously been defined that cell is placed in this
+array, but is given the attribute @code{space}.
+
+Next come arrays that map characters to single-cell dot patterns and
+dots to characters. These are created from both character-definition
+opcodes and display opcodes.
+
+Next is an array of size 256 which maps characters in this range to
+dot patterns which may consist of multiple cells. It is used, for
+example, to map @samp{@{} to dots 456-246. These mappings are created
+@c FIXME: the compdots opcode should be documented
+@c by the @opcoderef{compdots}
+by the @code{compdots}
+or the @opcoderef{comp6}.
+
+Next are two small arrays that held pointers to chains of rules
+produced by the @opcoderef{swapcd} and the @opcoderef{swapdd} and by
+some multipass, @code{context} and @code{correct} opcodes.
+
+Now we get to an array of size @code{HASHNUM} which points to chains
+of rules for forward translation.
+
+Following this is a similar array for back-translation.
+
+Finally is the @code{ruleArea}, an array of variable size to which
+various structures are mapped and to which almost everything else
+points.
+
+@node How tables are found
+@section How tables are found
+@cindex Table search path
+@cindex LOUIS_TABLEPATH
+liblouis knows where to find all the tables that have been distributed
+with it. So you can just give a table name such as @code{en-us-g2.ctb}
+and liblouis will load it. You can also give a table name which
+includes a path. If this is the first table in a list, all the tables
+in the list must be on the same path. You can specify a path on which
+liblouis will look for table names by setting the environment variable
+@env{LOUIS_TABLEPATH}. This environment variable can contain one or
+more paths separated by commas. On receiving a table name liblouis
+first checks to see if it can be found on any of these paths. If not,
+it then checks to see if it can be found in the current directory, or,
+if the first (or only) name in a table list, if it contains a
+path name, can be found on that path. If not, it checks to see if it
+can be found on the path where the distributed tables have been
+installed. If a table has already been loaded and compiled this
+path-checking is skipped.
+
+@node Deprecation of the logging system
+@section Deprecation of the logging system
+
+As of version 2.6.0 @code{lou_logFile}, @code{lou_logPrint} and
+@code{lou_logEnd} are deprecated. They are replaced by a more powerful,
+abstract API consisting of @code{lou_registerLogCallback} and
+@code{lou_setLogLevel}.
+
+Usage of @code{lou_logFile}, @code{lou_logPrint} and @code{lou_logEnd} is
+discouraged as they may not be part of future releases. Applications using
+Liblouis should implement their own logging system.
+
+During the transitional phase, @code{lou_logPrint} is registered as default
+callback in @code{lou_registerLogCallback}. @code{lou_logPrint} is overwritten
+by the first call to @code{lou_registerLogCallback} and reattached when
+@code{NULL} is set as callback. Note that calling @code{lou_logPrint} directly
+will not cause an invocation of the registered callback.
+
+@node lou_version
+@section lou_version
+@findex lou_version
+
+@example
+char *lou_version ()
+@end example
+
+This function returns a pointer to a character string containing the
+version of liblouis, plus other information, such as the release date
+and perhaps notable changes.
+
+@node lou_translateString
+@section lou_translateString
+@findex lou_translateString
+
+@example
+int lou_translateString(
+ const char *tableList,
+ const widechar *inbuf,
+ int *inlen,
+ widechar *outbuf,
+ int *outlen,
+ formtype *typeform,
+ char *spacing,
+ int mode);
+@end example
+
+This function takes a string of 16-bit Unicode characters in
+@code{inbuf} and translates it into a string of 16-bit characters in
+@code{outbuf}. Each 16-bit character produces a particular dot pattern
+in one braille cell when sent to an embosser or braille display or to
+a screen type font. Which 16-bit character represents which dot pattern
+is indicated by the character-definition and display opcodes in the
+translation table.
+
+@anchor{translation-tables}
+The @code{tableList} parameter points to a list of translation tables
+separated by commas. @xref{How tables are found}, for a description on
+how the tables are located in the file system. If only one table is
+given, no comma should be used after it. It is these tables which
+control just how the translation is made, whether in Grade 2, Grade 1,
+or something else.
+
+The tables in a list are all compiled into the same internal table.
+The list is then regarded as the name of this table. As explained in
+@ref{How to Write Translation Tables}, each table is a file which may
+be plain text, big-endian Unicode or little-endian Unicode. A table
+(or list of tables) is compiled into an internal representation the
+first time it is used. Liblouis keeps track of which tables have been
+compiled. For this reason, it is essential to call the @code{lou_free}
+function at the end of your application to avoid memory leaks. Do
+@emph{NOT} call @code{lou_free} after each translation. This will
+force liblouis to compile the translation tables each time they are
+used, leading to great inefficiency.
+
+Note that both the @code{*inlen} and @code{*outlen} parameters are
+pointers to integers. When the function is called, these integers
+contain the maximum input and output lengths, respectively. When it
+returns, they are set to the actual lengths used.
+
+The @code{typeform} parameter is used to indicate italic type,
+boldface type, computer braille, etc. It is an array of @code{formtype}
+with the same length as the input buffer pointed to by @code{*inbuf}.
+However, it is used to pass back character-by-character results, so
+enough space must be provided to match the @code{*outlen} parameter.
+Each element indicates the typeform of the corresponding character
+in the input buffer. The values and their meaning can be consulted in the
+@code{typeforms} enum in @file{liblouis.h}. These values can be
+added for multiple emphasis. If this parameter is @code{NULL}, no
+checking for type forms is done. In addition, if this parameter is not
+@code{NULL}, it is set on return to have an 8 at every position
+corresponding to a character in @code{outbuf} which was defined to
+have a dot representation containing dot 7, dot 8 or both, and to 0
+otherwise.
+
+The @code{spacing} parameter is used to indicate differences in
+spacing between the input string and the translated output string. It
+is also of the same length as the string pointed to by @code{*inbuf}.
+If this parameter is @code{NULL}, no spacing information is computed.
+
+The @code{mode} parameter specifies how the translation should be
+done. The valid values of mode are defined in @file{liblouis.h}. They
+are all powers of 2, so that a combined mode can be specified by
+adding up different values.
+
+Note that the @code{mode} parameter is an integer, not a pointer to
+an integer.
+
+A combination of the following mode flags can be used with the
+@code{lou_translateString} function:
+
+@table @code
+@item compbrlAtCursor
+If this bit is set in the @code{mode} parameter the space-bounded
+characters containing the cursor will be translated in computer
+braille.
+
+@item compbrlLeftCursor
+If this bit is set, only the characters to the left of the cursor will
+be in computer braille. This bit overrides @code{compbrlAtCursor}.
+
+@item dotsIO
+When this bit is set, during forward translation, Liblouis will produce
+output as dot patterns. During back-translation Liblouis accepts input
+as dot patterns. Note that the produced dot patterns are affected if
+you have any @opcoderef{display} defined in any of your tables.
+
+@item ucBrl
+The @code{ucBrl} (Unicode Braille) bit is used by the functions
+@code{lou_charToDots} and @code{lou_translate}. It causes the dot
+patterns to be Unicode Braille rather than the liblouis representation.
+Note that you will not notice any change when setting @code{ucBrl}
+unless @code{dotsIO} is also set. @code{lou_dotsToChar} and
+@code{lou_backTranslate} recognize Unicode braille automatically.
+
+@item partialTrans
+This flag specifies that back-translation input should be treated as an
+incomplete word. Rules that apply only for complete words or at the end
+of a word will not take effect. This is intended to be used when
+translating input typed on a braille keyboard to provide a rough idea
+to the user of the characters they are typing before the word is
+complete.
+
+@item noUndefined
+Setting this bit disables the output of hexadecimal values when
+forward-translating undefined characters (characters that are not
+matched by any rule), and dot numbers when back-translating undefined
+braille patterns (braille patterns that are not matched by any
+rule). The default is for liblouis to output the hexadecimal value (as
+'\xhhhh') of an undefined character when forward-translating and the
+dot numbers (as \ddd/) of an undefined braille pattern when
+back-translating.
+
+When back translating input from a braille keyboard cell by cell, it
+is desirable to output characters as soon as they are
+produced. Similarly, when back translating contracted braille, it is
+desirable to provide a "guess" to the user of the characters they
+typed. To achieve this, liblouis needs to have the ability to produce
+no text when indicators (which don't produce a character by
+themselves) are not followed by another cell. This works automatically
+for indicators liblouis knows about such as capital sign, number sign,
+etc., but it does not work for indicators which are not (and cannot
+be) specifically defined as indicators. For example, in UEB, dots 4 5
+6 alone produces the text "\456/". Setting the noUndefined mode
+suppresses this dot number output.
+
+@end table
+
+The function returns 1 if no errors were encountered@footnote{When the
+output buffer is not big enough, @code{lou_translateString} returns a
+partial translation that is more or less accurate up until the
+returned @code{inlen}/@code{outlen}, and treats it as a successful
+translation, i.e.@: also returns 1.} and 0 otherwise.
+
+@node lou_translate
+@section lou_translate
+@findex lou_translate
+
+@example
+int lou_translate(
+ const char *tableList,
+ const widechar *inbuf,
+ int *inlen,
+ widechar *outbuf,
+ int *outlen,
+ formtype *typeform,
+ char *spacing,
+ int *outputPos,
+ int *inputPos,
+ int *cursorPos,
+ int mode);
+@end example
+
+This function adds the parameters @code{outputPos}, @code{inputPos}
+and @code{cursorPos}, to facilitate use in screen reader programs. The
+@code{outputPos} parameter must point to an array of integers with at
+least @code{inlen} elements. On return, this array will contain the
+position in @code{outbuf} corresponding to each input position.
+Similarly, @code{inputPos} must point to an array of integers of at
+least @code{outlen} elements. On return, this array will contain the
+position in @code{inbuf} corresponding to each position in
+@code{outbuf}. @code{cursorPos} must point to an integer containing
+the position of the cursor in the input. On return, it will contain
+the cursor position in the output. Any parameter after @code{outlen}
+may be @code{NULL}. In this case, the actions corresponding to it will
+not be carried out.
+
+For a description of all other parameters, please see
+@ref{lou_translateString}.
+
+@node lou_backTranslateString
+@section lou_backTranslateString
+@findex lou_backTranslateString
+
+@example
+int lou_backTranslateString(
+ const char *tableList,
+ const widechar *inbuf,
+ int *inlen,
+ widechar *outbuf,
+ int *outlen,
+ formtype *typeform,
+ char *spacing,
+ int mode);
+@end example
+
+This is exactly the opposite of @code{lou_translateString}.
+@code{inbuf} is a string of 16-bit Unicode characters representing
+braille. @code{outbuf} will contain a string of 16--bit Unicode
+characters. @code{typeform} will indicate any emphasis found in the
+input string, while @code{spacing} will indicate any differences in
+spacing between the input and output strings. The @code{typeform} and
+@code{spacing} parameters may be @code{NULL} if this information is
+not needed. @code{mode} specifies how the back-translation
+should be done.
+
+By default, if a dot pattern in the input is undefined
+then its dot numbers will be included in the output (as \ddd/).
+This does not occur if the @code{noUndefined} mode is set;
+an undefined dot pattern simply produces no output.
+
+The @code{partialTrans} mode specifies that the input should be
+treated as an incomplete word. That is, rules that apply only for
+complete words or at the end of a word will not take effect. This is
+intended to be used when translating input typed on a braille keyboard
+to provide a rough idea to the user of the characters they are typing
+before the word is complete.
+
+@node lou_backTranslate
+@section lou_backTranslate
+@findex lou_backTranslate
+
+@example
+int lou_backTranslate(
+ const char *tableList,
+ const widechar *inbuf,
+ int *inlen,
+ widechar *outbuf,
+ int *outlen,
+ formtype *typeform,
+ char *spacing,
+ int *outputPos,
+ int *inputPos,
+ int *cursorPos,
+ int mode);
+@end example
+
+This function is exactly the inverse of @code{lou_translate}.
+
+@node lou_hyphenate
+@section lou_hyphenate
+@findex lou_hyphenate
+
+@example
+int lou_hyphenate (
+ const char *tableList,
+ const widechar *inbuf,
+ int inlen,
+ char *hyphens,
+ int mode);
+@end example
+
+This function looks at the characters in @code{inbuf} and if it finds
+a sequence of letters attempts to hyphenate it as a word. Note that
+lou_hyphenate operates on single words only, and spaces or punctuation
+marks between letters are not allowed. Leading and trailing
+punctuation marks are ignored. The table named by the @code{tableList}
+parameter must contain a hyphenation table. If it does not, the
+function does nothing. @code{inlen} is the length of the character
+string in @code{inbuf}. @code{hyphens} is an array of characters and
+must be of size @code{inlen} + 1 (to account for the NULL terminator).
+If hyphenation is successful it will have a 1 at the beginning of each
+syllable and a 0 elsewhere. If the @code{mode} parameter is 0
+@code{inbuf} is assumed to contain untranslated characters. Any
+nonzero value means that @code{inbuf} contains a translation. In this
+case, it is back-translated, hyphenation is performed, and it is
+re-translated so that the hyphens can be placed correctly. The
+@code{lou_translate} and @code{lou_backTranslate} functions are used
+in this process. @code{lou_hyphenate} returns 1 if hyphenation was
+successful and 0 otherwise. In the latter case, the contents of the
+@code{hyphens} parameter are undefined. This function was provided for
+use in liblouisutdml.
+
+@node lou_compileString
+@section lou_compileString
+@findex lou_compileString
+