compiler/libec/lexer: Understanding __const as const to fix warnings building on older Ubuntus
ecere/sys/JSON: add support for unit classes.
 - add support for struct members.
 - add support for null string.
ecere/sys/Time: add missing TimeStamp::OnGetDataFromString.
ide; (#882) save workspace file (.ews) in json format.
ide;workspace; (#56) save opened files with relative file paths.
 - discard old or broken opened files entries.
 - fix a few null crashes.
 - fix a couple new compiler warnings.
ecere/sys/GlobalSettings: add GlobalSettings::settingsDirectory property to support specifying a subdirectory for the location of the settings file.
allow setting GlobalSettings::settingsDirectory::settingsFilePath property to specify a custom location for the settings file.
reuse code with new GetFilePath function.
README: use 'SQLCipher' which refers to the open source project instead of SQLiteCipher which is the name of the EDA driver.
ide: fix goto line from find in files not working because results (code) mistaken for valgrind output.
 - improve go to file/line from output logs
ide; don't show same file name message if other same-named files are excluded when renaming a file in project view.
extras: add debug print line debugging tools.
ide: no functional change. rename various debug print line function calls. use ecere-sdk/extras/include/dpl.ec file.
------------------------------------------------ work in progress starts here
buildsystem,epj2make,ide; (#996-related) wip-fix remaining issues with .ec modules containing ampersands or projects in paths that have ampersands in it or other special characters.
 - fix crossplatform.mk's echo shell command to all echoing empty line.
 - add cat/type shell commands to crossplatform.mk
 - wip-fix crossplatform.mk's shell commands (cp, mkdir, rmdir?) to properly handle file lists with file name with spaces in them
tarball: wip-add portable distribution tools. make portable. etc...
wip todo:
 [ x ] fix the commented out rules for files with filename with spaces in them
 [ . ] add support for PortableApps.com
 [ . ] portable/README -- rename the flavors? core/minimal/complete vs core/mingw/mingwc++/allinone

 [   ] OBJ = ../obj/portable.$(CONFIG).$(PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/ vs OBJ = ../obj/portable/
 [   ] 32 vs 64 bit vs both
 [   ] cross compiling (portable and installer)
 [   ] linux version!
 [   ] ../obj/win32/bin -- hard coded paths, use vars, support bith depth, crossbuild

 [   ] missing opt #PORTABLE_ECERE_SDK_OPT_TINYCC -- include this in minimal
 [   ] missing opt #PORTABLE_ECERE_SDK_OPT_SOURCES -- to include ecere-sdk source code
 [   ] missing opt #PORTABLE_ECERE_SDK_OPT_TDM_CPP -- make cpp optional, PORTABLE_ECERE_SDK_OPT_TDM would not install c++
 [   ] missing opt #PORTABLE_ECERE_SDK_OPT_MINGW -- a mingw-w64 edition? I think not...
 [   ] missing opt #PORTABLE_ECERE_SDK_OPT_MINGW_CPP -- "

 [   ] ecereIDE.ini multiple compiler configs?

 [   ] these files?

       [   ] $(call cpq,../obj/win32.x32/bin/ecere.dll ../obj/win32.x32/lib/libecereVanilla.a "ecere-sdk32")
       [   ] $(call cpq,../obj/win32.x32/bin/documentor.exe ../obj/win32.x32/bin/ide.exe "ecere-sdk32/ide")
       [   ] $(call cpq,../obj/win32.x32/bin/ear.exe ../obj/win32.x32/bin/ec.dll ../obj/win32.x32/bin/ecc.exe ../obj/win32.x32/bin/ecereCOM.dll ../obj/win32.x32/bin/ecp.exe ../obj/win32.x32/bin/ecs.exe ../obj/win32.x32/bin/epj2make.exe "ecere-sdk32/compiler")
       [   ] $(call cpq,../obj/win32.x32/bin/EDA.dll ../obj/win32.x32/bin/EDASQLite.dll "ecere-sdk32/eda")

       [   ] $(call cpq,../ide/res/icon.png ecere.png ryoanji.png ryoanji-progress.png ""

       [   ] $(call cpq,../ecere/res/elements/areaClose.png ../ecere/res/elements/areaMaximize.png ../ecere/res/elements/areaMinimize.png ../ecere/res/elements/areaRestore.png ../ecere/res/elements/arrowDown.png ../ecere/res/elements/arrowLeft.png ../ecere/res/elements/arrowRight.png ../ecere/res/elements/arrowUp.png "ecere/elements"
       [   ] $(call cpq,../ecere/res/unicode/derivedGeneralCategoryStripped.txt "ecere/unicode"
       [   ] $(call cpq,../ecere/res/actions/folderNew.png ../ecere/res/actions/goUp.png "ecere/actions"
       [   ] $(call cpq,../ecere/res/devices/computer.png ../ecere/res/devices/driveHardDisk.png ../ecere/res/devices/driveRemovableMedia.png ../ecere/res/devices/mediaFloppy.png ../ecere/res/devices/mediaOptical.png "ecere/devices"
       [   ] $(call cpq,../ecere/res/mimeTypes/file.png ../ecere/res/mimeTypes/brokenFile.png "ecere/mimetypes"
       [   ] $(call cpq,../ecere/res/places/driveRemote.png ../ecere/res/places/folder.png ../ecere/res/places/folderRemote.png ../ecere/res/places/networkServer.png ../ecere/res/places/networkWorkgroup.png ../ecere/res/places/brokenFolder.png "ecere/places"
       [   ] $(call cpq,../ecere/res/status/folderOpen.png "ecere/status"

       [   ] $(call cpq,../ecere/locale/es.mo ../ecere/locale/hu.mo ../ecere/locale/mr.mo ../ecere/locale/nl.mo ../ecere/locale/pt_BR.mo ../ecere/locale/ru.mo ../ecere/locale/zh_CN.mo "ecere/locale"

       [   ] $(call cpq,../obj/win32/bin/ecere.dll ../obj/win32/lib/libecereVanilla.a "ecere-sdk"
       [   ] $(call cpq,../obj/win32/bin/documentor.exe ../obj/win32/bin/ide.exe "ecere-sdk/ide"
       [   ] $(call cpq,../obj/win32/bin/ear.exe ../obj/win32/bin/ec.dll ../obj/win32/bin/ecc.exe ../obj/win32/bin/ecereCOM.dll ../obj/win32/bin/ecp.exe ../obj/win32/bin/ecs.exe ../obj/win32/bin/epj2make.exe "ecere-sdk/compiler"
       [   ] $(call cpq,../obj/win32/bin/EDA.dll ../obj/win32/bin/EDASQLite.dll "ecere-sdk/eda"

       [   ] $(call cpq,coursework/Chapter\ 1\ -\ Getting\ Started/answers\ -\ chapter\ 1.odt coursework/Chapter\ 1\ -\ Getting\ Started/exercises\ -\ chapter\ 1.odt "ecere-sdk/coursework/Chapter 1 - Getting Started"
       [   ] $(call cpq,coursework/Chapter\ 1\ -\ Getting\ Started/Lab1.1/helloWorld.ec coursework/Chapter\ 1\ -\ Getting\ Started/Lab1.1/HelloWorld.epj "ecere-sdk/coursework/Chapter 1 - Getting Started/Lab1.1"
       [   ] $(call cpq,coursework/Chapter\ 1\ -\ Getting\ Started/Lab1.2/form1.ec coursework/Chapter\ 1\ -\ Getting\ Started/Lab1.2/HelloForm.epj "ecere-sdk/coursework/Chapter 1 - Getting Started/Lab1.2"
       [   ] $(call cpq,coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/answers\ -\ chapter\ 2.odt coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/exercises\ -\ chapter\ 2.odt "ecere-sdk/coursework/Chapter 2 - Variables and Data Types"
       [   ] $(call cpq,coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/Lab2.4/lab2.ec coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/Lab2.4/Lab2.epj "ecere-sdk/coursework/Chapter 2 - Variables and Data Types/Lab2.4"
       [   ] $(call cpq,coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/Lab2.5/variables.ec coursework/Chapter\ 2\ -\ Variables\ and\ Data\ Types/Lab2.5/VariablesApp.epj "ecere-sdk/coursework/Chapter 2 - Variables and Data Types/Lab2.5"
       [   ] $(call cpq,coursework/Chapter\ 3\ -\ Operators/answers\ -\ chapter\ 3.odt coursework/Chapter\ 3\ -\ Operators/exercises\ -\ chapter\ 3.odt "ecere-sdk/coursework/Chapter 3 - Operators"
       [   ] $(call cpq,coursework/Chapter\ 3\ -\ Operators/Lab3/lab3.ec coursework/Chapter\ 3\ -\ Operators/Lab3/Lab3.epj "ecere-sdk/coursework/Chapter 3 - Operators/Lab3"
       [   ] $(call cpq,coursework/Chapter\ 4\ -\ Flow\ Control/answers\ -\ chapter\ 4.odt coursework/Chapter\ 4\ -\ Flow\ Control/exercises\ -\ chapter\ 4.odt "ecere-sdk/coursework/Chapter 4 - Flow Control"
       [   ] $(call cpq,coursework/Chapter\ 4\ -\ Flow\ Control/Lab4/lab4.ec coursework/Chapter\ 4\ -\ Flow\ Control/Lab4/Lab4.epj "ecere-sdk/coursework/Chapter 4 - Flow Control/Lab4"
       [   ] $(call cpq,coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/answers\ -\ chapter\ 5.odt coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/exercises\ -\ chapter\ 5.odt "ecere-sdk/coursework/Chapter 5 - Structures and Enumerations"
       [   ] $(call cpq,coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/Lab5/colors/lab5colors.ec coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/Lab5/colors/lab5colors.epj "ecere-sdk/coursework/Chapter 5 - Structures and Enumerations/Lab5/colors"
       [   ] $(call cpq,coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/Lab5/vectors/lab5vectors.ec coursework/Chapter\ 5\ -\ Structures\ and\ Enumerations/Lab5/vectors/lab5vectors.epj "ecere-sdk/coursework/Chapter 5 - Structures and Enumerations/Lab5/vectors"
       [   ] $(call cpq,coursework/Chapter\ 6\ -\ Classes,\ Methods\ and\ Instances/answers\ -\ chapter\ 6.odt coursework/Chapter\ 6\ -\ Classes,\ Methods\ and\ Instances/exercises\ -\ chapter\ 6.odt "ecere-sdk/coursework/Chapter 6 - Classes, Methods and Instances"
       [   ] $(call cpq,coursework/Chapter\ 6\ -\ Classes,\ Methods\ and\ Instances/Lab6/lab6.ec coursework/Chapter\ 6\ -\ Classes,\ Methods\ and\ Instances/Lab6/lab6.epj "ecere-sdk/coursework/Chapter 6 - Classes, Methods and Instances/Lab6"
------------------------------------------------ customized starts here
ide; FindInFilesDialog; add checkboxes similar to 'include subdirectories' for in/ex-cluding 'obj' dirs and '.git' dirs.
ide: show lighter line number. make minimal line number width 3 instead of 4. show multiple lines selection in margin.
ide; add 'force single job compiling' checkbox to the toolbar.
ide: remove background image, make ToolBox and Properties Sheet invisible by default, make global settings and project settings dialogs much bigger.
ide; nice about box tweaks.