Stripped carriage return and added eol-style native prop.
diff --git a/AUTHORS b/AUTHORS
index 333e120..c0fbbee 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1 +1 @@
-Baptiste Lepilleur <blep@users.sourceforge.net>
+Baptiste Lepilleur <blep@users.sourceforge.net>
diff --git a/README.txt b/README.txt
index 65d3629..f3aaa8e 100644
--- a/README.txt
+++ b/README.txt
@@ -1,44 +1,44 @@
-* Introduction:
-
-JSON (JavaScript Object Notation) is a lightweight data-interchange format.
-It can represent integer, real number, string, an ordered sequence of
-value, and a collection of name/value pairs.
-
-JsonCpp is a simple API to manipulate JSON value, and handle serialization
-and unserialization to string.
-
-It can also preserve existing comment in unserialization/serialization steps,
-making it a convenient format to store user input files.
-
-Unserialization parsing is user friendly and provides precise error reports.
-
-* Building/Testing:
-
-JsonCpp uses Scons (http://www.scons.org) as a build system. Scons requires
-python to be installed (http://www.python.org).
-
-You download scons-local distribution from the following url:
-http://sourceforge.net/project/showfiles.php?group_id=30337&package_id=67375
-
-Unzip it in the directory where you found this README file. scons.py Should be
-at the same level as README.
-
-python scons.py platform=PLTFRM [TARGET]
-where PLTFRM may be one of:
- suncc Sun C++ (Solaris)
- vacpp Visual Age C++ (AIX)
- mingw
- msvc6 Microsoft Visual Studio 6 service pack 5-6
- msvc70 Microsoft Visual Studio 2002
- msvc71 Microsoft Visual Studio 2003
- msvc80 Microsoft Visual Studio 2005
- linux-gcc Gnu C++ (linux, also reported to work for Mac OS X)
-
-adding platform is fairly simple. You need to change the Sconstruct file
-to do so.
-
-and TARGET may be:
- check: build library and run unit tests.
- doc: build documentation
- doc-dist: build documentation tarball
-
+* Introduction:
+
+JSON (JavaScript Object Notation) is a lightweight data-interchange format.
+It can represent integer, real number, string, an ordered sequence of
+value, and a collection of name/value pairs.
+
+JsonCpp is a simple API to manipulate JSON value, and handle serialization
+and unserialization to string.
+
+It can also preserve existing comment in unserialization/serialization steps,
+making it a convenient format to store user input files.
+
+Unserialization parsing is user friendly and provides precise error reports.
+
+* Building/Testing:
+
+JsonCpp uses Scons (http://www.scons.org) as a build system. Scons requires
+python to be installed (http://www.python.org).
+
+You download scons-local distribution from the following url:
+http://sourceforge.net/project/showfiles.php?group_id=30337&package_id=67375
+
+Unzip it in the directory where you found this README file. scons.py Should be
+at the same level as README.
+
+python scons.py platform=PLTFRM [TARGET]
+where PLTFRM may be one of:
+ suncc Sun C++ (Solaris)
+ vacpp Visual Age C++ (AIX)
+ mingw
+ msvc6 Microsoft Visual Studio 6 service pack 5-6
+ msvc70 Microsoft Visual Studio 2002
+ msvc71 Microsoft Visual Studio 2003
+ msvc80 Microsoft Visual Studio 2005
+ linux-gcc Gnu C++ (linux, also reported to work for Mac OS X)
+
+adding platform is fairly simple. You need to change the Sconstruct file
+to do so.
+
+and TARGET may be:
+ check: build library and run unit tests.
+ doc: build documentation
+ doc-dist: build documentation tarball
+
diff --git a/scons-tools/doxygen.py b/scons-tools/doxygen.py
index f85f4a3..7b8dee4 100644
--- a/scons-tools/doxygen.py
+++ b/scons-tools/doxygen.py
@@ -1,205 +1,205 @@
-# Big issue:
-# emitter depends on doxyfile which is generated from doxyfile.in.
-# build fails after cleaning and relaunching the build.
-
-import os
-import os.path
-import glob
-from fnmatch import fnmatch
-
-def DoxyfileParse(file_contents):
- """
- Parse a Doxygen source file and return a dictionary of all the values.
- Values will be strings and lists of strings.
- """
- data = {}
-
- import shlex
- lex = shlex.shlex(instream = file_contents, posix = True)
- lex.wordchars += "*+./-:"
- lex.whitespace = lex.whitespace.replace("\n", "")
- lex.escape = ""
-
- lineno = lex.lineno
- last_backslash_lineno = lineno
- token = lex.get_token()
- key = token # the first token should be a key
- last_token = ""
- key_token = False
- next_key = False
- new_data = True
-
- def append_data(data, key, new_data, token):
- if new_data or len(data[key]) == 0:
- data[key].append(token)
- else:
- data[key][-1] += token
-
- while token:
- if token in ['\n']:
- if last_token not in ['\\']:
- key_token = True
- elif token in ['\\']:
- pass
- elif key_token:
- key = token
- key_token = False
- else:
- if token == "+=":
- if not data.has_key(key):
- data[key] = list()
- elif token == "=":
- data[key] = list()
- else:
- append_data( data, key, new_data, token )
- new_data = True
-
- last_token = token
- token = lex.get_token()
-
- if last_token == '\\' and token != '\n':
- new_data = False
- append_data( data, key, new_data, '\\' )
-
- # compress lists of len 1 into single strings
- for (k, v) in data.items():
- if len(v) == 0:
- data.pop(k)
-
- # items in the following list will be kept as lists and not converted to strings
- if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
- continue
-
- if len(v) == 1:
- data[k] = v[0]
-
- return data
-
-def DoxySourceScan(node, env, path):
- """
- Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
- any files used to generate docs to the list of source files.
- """
- default_file_patterns = [
- '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
- '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
- '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
- '*.py',
- ]
-
- default_exclude_patterns = [
- '*~',
- ]
-
- sources = []
-
- data = DoxyfileParse(node.get_contents())
-
- if data.get("RECURSIVE", "NO") == "YES":
- recursive = True
- else:
- recursive = False
-
- file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
- exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
-
- doxyfile_dir = str( node.dir )
-
-## print 'running from', os.getcwd()
- for node in data.get("INPUT", []):
- node_real_path = os.path.normpath( os.path.join( doxyfile_dir, node ) )
- if os.path.isfile(node_real_path):
-## print str(node), 'is a file'
- sources.append(node)
- elif os.path.isdir(node_real_path):
-## print str(node), 'is a directory'
- if recursive:
- for root, dirs, files in os.walk(node):
- for f in files:
- filename = os.path.join(root, f)
-
- pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
- exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
-
- if pattern_check and not exclude_check:
- sources.append(filename)
-## print ' adding source', os.path.abspath( filename )
- else:
- for pattern in file_patterns:
- sources.extend(glob.glob(os.path.join( node, pattern)))
-## else:
-## print str(node), 'is neither a file nor a directory'
- sources = map( lambda path: env.File(path), sources )
- return sources
-
-
-def DoxySourceScanCheck(node, env):
- """Check if we should scan this file"""
- return os.path.isfile(node.path)
-
-def DoxyEmitter(source, target, env):
- """Doxygen Doxyfile emitter"""
- # possible output formats and their default values and output locations
- output_formats = {
- "HTML": ("YES", "html"),
- "LATEX": ("YES", "latex"),
- "RTF": ("NO", "rtf"),
- "MAN": ("YES", "man"),
- "XML": ("NO", "xml"),
- }
-
-## print '#### DoxyEmitter:', source[0].abspath, os.path.exists( source[0].abspath )
- data = DoxyfileParse(source[0].get_contents())
-
- targets = []
- out_dir = data.get("OUTPUT_DIRECTORY", ".")
-
- # add our output locations
- for (k, v) in output_formats.items():
- if data.get("GENERATE_" + k, v[0]) == "YES":
- targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
-
- # don't clobber targets
- for node in targets:
- env.Precious(node)
-
- # set up cleaning stuff
- for node in targets:
- clean_cmd = env.Clean(node, node)
- env.Depends( clean_cmd, source )
-
- return (targets, source)
-
-def generate(env):
- """
- Add builders and construction variables for the
- Doxygen tool. This is currently for Doxygen 1.4.6.
- """
- doxyfile_scanner = env.Scanner(
- DoxySourceScan,
- "DoxySourceScan",
- scan_check = DoxySourceScanCheck,
- )
-
- doxyfile_builder = env.Builder(
- action = env.Action("cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}",
- varlist=['$SOURCES']),
- emitter = DoxyEmitter,
- target_factory = env.fs.Entry,
- single_source = True,
- source_scanner = doxyfile_scanner,
- )
-
- env.Append(BUILDERS = {
- 'Doxygen': doxyfile_builder,
- })
-
- env.AppendUnique(
- DOXYGEN = 'doxygen',
- )
-
-def exists(env):
- """
- Make sure doxygen exists.
- """
- return env.Detect("doxygen")
+# Big issue:
+# emitter depends on doxyfile which is generated from doxyfile.in.
+# build fails after cleaning and relaunching the build.
+
+import os
+import os.path
+import glob
+from fnmatch import fnmatch
+
+def DoxyfileParse(file_contents):
+ """
+ Parse a Doxygen source file and return a dictionary of all the values.
+ Values will be strings and lists of strings.
+ """
+ data = {}
+
+ import shlex
+ lex = shlex.shlex(instream = file_contents, posix = True)
+ lex.wordchars += "*+./-:"
+ lex.whitespace = lex.whitespace.replace("\n", "")
+ lex.escape = ""
+
+ lineno = lex.lineno
+ last_backslash_lineno = lineno
+ token = lex.get_token()
+ key = token # the first token should be a key
+ last_token = ""
+ key_token = False
+ next_key = False
+ new_data = True
+
+ def append_data(data, key, new_data, token):
+ if new_data or len(data[key]) == 0:
+ data[key].append(token)
+ else:
+ data[key][-1] += token
+
+ while token:
+ if token in ['\n']:
+ if last_token not in ['\\']:
+ key_token = True
+ elif token in ['\\']:
+ pass
+ elif key_token:
+ key = token
+ key_token = False
+ else:
+ if token == "+=":
+ if not data.has_key(key):
+ data[key] = list()
+ elif token == "=":
+ data[key] = list()
+ else:
+ append_data( data, key, new_data, token )
+ new_data = True
+
+ last_token = token
+ token = lex.get_token()
+
+ if last_token == '\\' and token != '\n':
+ new_data = False
+ append_data( data, key, new_data, '\\' )
+
+ # compress lists of len 1 into single strings
+ for (k, v) in data.items():
+ if len(v) == 0:
+ data.pop(k)
+
+ # items in the following list will be kept as lists and not converted to strings
+ if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
+ continue
+
+ if len(v) == 1:
+ data[k] = v[0]
+
+ return data
+
+def DoxySourceScan(node, env, path):
+ """
+ Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
+ any files used to generate docs to the list of source files.
+ """
+ default_file_patterns = [
+ '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
+ '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
+ '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
+ '*.py',
+ ]
+
+ default_exclude_patterns = [
+ '*~',
+ ]
+
+ sources = []
+
+ data = DoxyfileParse(node.get_contents())
+
+ if data.get("RECURSIVE", "NO") == "YES":
+ recursive = True
+ else:
+ recursive = False
+
+ file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
+ exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
+
+ doxyfile_dir = str( node.dir )
+
+## print 'running from', os.getcwd()
+ for node in data.get("INPUT", []):
+ node_real_path = os.path.normpath( os.path.join( doxyfile_dir, node ) )
+ if os.path.isfile(node_real_path):
+## print str(node), 'is a file'
+ sources.append(node)
+ elif os.path.isdir(node_real_path):
+## print str(node), 'is a directory'
+ if recursive:
+ for root, dirs, files in os.walk(node):
+ for f in files:
+ filename = os.path.join(root, f)
+
+ pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
+ exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
+
+ if pattern_check and not exclude_check:
+ sources.append(filename)
+## print ' adding source', os.path.abspath( filename )
+ else:
+ for pattern in file_patterns:
+ sources.extend(glob.glob(os.path.join( node, pattern)))
+## else:
+## print str(node), 'is neither a file nor a directory'
+ sources = map( lambda path: env.File(path), sources )
+ return sources
+
+
+def DoxySourceScanCheck(node, env):
+ """Check if we should scan this file"""
+ return os.path.isfile(node.path)
+
+def DoxyEmitter(source, target, env):
+ """Doxygen Doxyfile emitter"""
+ # possible output formats and their default values and output locations
+ output_formats = {
+ "HTML": ("YES", "html"),
+ "LATEX": ("YES", "latex"),
+ "RTF": ("NO", "rtf"),
+ "MAN": ("YES", "man"),
+ "XML": ("NO", "xml"),
+ }
+
+## print '#### DoxyEmitter:', source[0].abspath, os.path.exists( source[0].abspath )
+ data = DoxyfileParse(source[0].get_contents())
+
+ targets = []
+ out_dir = data.get("OUTPUT_DIRECTORY", ".")
+
+ # add our output locations
+ for (k, v) in output_formats.items():
+ if data.get("GENERATE_" + k, v[0]) == "YES":
+ targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
+
+ # don't clobber targets
+ for node in targets:
+ env.Precious(node)
+
+ # set up cleaning stuff
+ for node in targets:
+ clean_cmd = env.Clean(node, node)
+ env.Depends( clean_cmd, source )
+
+ return (targets, source)
+
+def generate(env):
+ """
+ Add builders and construction variables for the
+ Doxygen tool. This is currently for Doxygen 1.4.6.
+ """
+ doxyfile_scanner = env.Scanner(
+ DoxySourceScan,
+ "DoxySourceScan",
+ scan_check = DoxySourceScanCheck,
+ )
+
+ doxyfile_builder = env.Builder(
+ action = env.Action("cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}",
+ varlist=['$SOURCES']),
+ emitter = DoxyEmitter,
+ target_factory = env.fs.Entry,
+ single_source = True,
+ source_scanner = doxyfile_scanner,
+ )
+
+ env.Append(BUILDERS = {
+ 'Doxygen': doxyfile_builder,
+ })
+
+ env.AppendUnique(
+ DOXYGEN = 'doxygen',
+ )
+
+def exists(env):
+ """
+ Make sure doxygen exists.
+ """
+ return env.Detect("doxygen")
diff --git a/scons-tools/srcdist.py b/scons-tools/srcdist.py
index cfc5407..17f029f 100644
--- a/scons-tools/srcdist.py
+++ b/scons-tools/srcdist.py
@@ -1,179 +1,179 @@
-import os
-import os.path
-import glob
-from fnmatch import fnmatch
-import targz
-
-##def DoxyfileParse(file_contents):
-## """
-## Parse a Doxygen source file and return a dictionary of all the values.
-## Values will be strings and lists of strings.
-## """
-## data = {}
-##
-## import shlex
-## lex = shlex.shlex(instream = file_contents, posix = True)
-## lex.wordchars += "*+./-:"
-## lex.whitespace = lex.whitespace.replace("\n", "")
-## lex.escape = ""
-##
-## lineno = lex.lineno
-## last_backslash_lineno = lineno
-## token = lex.get_token()
-## key = token # the first token should be a key
-## last_token = ""
-## key_token = False
-## next_key = False
-## new_data = True
-##
-## def append_data(data, key, new_data, token):
-## if new_data or len(data[key]) == 0:
-## data[key].append(token)
-## else:
-## data[key][-1] += token
-##
-## while token:
-## if token in ['\n']:
-## if last_token not in ['\\']:
-## key_token = True
-## elif token in ['\\']:
-## pass
-## elif key_token:
-## key = token
-## key_token = False
-## else:
-## if token == "+=":
-## if not data.has_key(key):
-## data[key] = list()
-## elif token == "=":
-## data[key] = list()
-## else:
-## append_data( data, key, new_data, token )
-## new_data = True
-##
-## last_token = token
-## token = lex.get_token()
-##
-## if last_token == '\\' and token != '\n':
-## new_data = False
-## append_data( data, key, new_data, '\\' )
-##
-## # compress lists of len 1 into single strings
-## for (k, v) in data.items():
-## if len(v) == 0:
-## data.pop(k)
-##
-## # items in the following list will be kept as lists and not converted to strings
-## if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
-## continue
-##
-## if len(v) == 1:
-## data[k] = v[0]
-##
-## return data
-##
-##def DoxySourceScan(node, env, path):
-## """
-## Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
-## any files used to generate docs to the list of source files.
-## """
-## default_file_patterns = [
-## '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
-## '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
-## '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
-## '*.py',
-## ]
-##
-## default_exclude_patterns = [
-## '*~',
-## ]
-##
-## sources = []
-##
-## data = DoxyfileParse(node.get_contents())
-##
-## if data.get("RECURSIVE", "NO") == "YES":
-## recursive = True
-## else:
-## recursive = False
-##
-## file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
-## exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
-##
-## for node in data.get("INPUT", []):
-## if os.path.isfile(node):
-## sources.add(node)
-## elif os.path.isdir(node):
-## if recursive:
-## for root, dirs, files in os.walk(node):
-## for f in files:
-## filename = os.path.join(root, f)
-##
-## pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
-## exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
-##
-## if pattern_check and not exclude_check:
-## sources.append(filename)
-## else:
-## for pattern in file_patterns:
-## sources.extend(glob.glob("/".join([node, pattern])))
-## sources = map( lambda path: env.File(path), sources )
-## return sources
-##
-##
-##def DoxySourceScanCheck(node, env):
-## """Check if we should scan this file"""
-## return os.path.isfile(node.path)
-
-def srcDistEmitter(source, target, env):
-## """Doxygen Doxyfile emitter"""
-## # possible output formats and their default values and output locations
-## output_formats = {
-## "HTML": ("YES", "html"),
-## "LATEX": ("YES", "latex"),
-## "RTF": ("NO", "rtf"),
-## "MAN": ("YES", "man"),
-## "XML": ("NO", "xml"),
-## }
-##
-## data = DoxyfileParse(source[0].get_contents())
-##
-## targets = []
-## out_dir = data.get("OUTPUT_DIRECTORY", ".")
-##
-## # add our output locations
-## for (k, v) in output_formats.items():
-## if data.get("GENERATE_" + k, v[0]) == "YES":
-## targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
-##
-## # don't clobber targets
-## for node in targets:
-## env.Precious(node)
-##
-## # set up cleaning stuff
-## for node in targets:
-## env.Clean(node, node)
-##
-## return (targets, source)
- return (target,source)
-
-def generate(env):
- """
- Add builders and construction variables for the
- SrcDist tool.
- """
-## doxyfile_scanner = env.Scanner(
-## DoxySourceScan,
-## "DoxySourceScan",
-## scan_check = DoxySourceScanCheck,
-## )
-
- srcdist_builder = targz.makeBuilder( srcDistEmitter )
-
- env['BUILDERS']['SrcDist'] = srcdist_builder
-
-def exists(env):
- """
- Make sure srcdist exists.
- """
- return True
+import os
+import os.path
+import glob
+from fnmatch import fnmatch
+import targz
+
+##def DoxyfileParse(file_contents):
+## """
+## Parse a Doxygen source file and return a dictionary of all the values.
+## Values will be strings and lists of strings.
+## """
+## data = {}
+##
+## import shlex
+## lex = shlex.shlex(instream = file_contents, posix = True)
+## lex.wordchars += "*+./-:"
+## lex.whitespace = lex.whitespace.replace("\n", "")
+## lex.escape = ""
+##
+## lineno = lex.lineno
+## last_backslash_lineno = lineno
+## token = lex.get_token()
+## key = token # the first token should be a key
+## last_token = ""
+## key_token = False
+## next_key = False
+## new_data = True
+##
+## def append_data(data, key, new_data, token):
+## if new_data or len(data[key]) == 0:
+## data[key].append(token)
+## else:
+## data[key][-1] += token
+##
+## while token:
+## if token in ['\n']:
+## if last_token not in ['\\']:
+## key_token = True
+## elif token in ['\\']:
+## pass
+## elif key_token:
+## key = token
+## key_token = False
+## else:
+## if token == "+=":
+## if not data.has_key(key):
+## data[key] = list()
+## elif token == "=":
+## data[key] = list()
+## else:
+## append_data( data, key, new_data, token )
+## new_data = True
+##
+## last_token = token
+## token = lex.get_token()
+##
+## if last_token == '\\' and token != '\n':
+## new_data = False
+## append_data( data, key, new_data, '\\' )
+##
+## # compress lists of len 1 into single strings
+## for (k, v) in data.items():
+## if len(v) == 0:
+## data.pop(k)
+##
+## # items in the following list will be kept as lists and not converted to strings
+## if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
+## continue
+##
+## if len(v) == 1:
+## data[k] = v[0]
+##
+## return data
+##
+##def DoxySourceScan(node, env, path):
+## """
+## Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
+## any files used to generate docs to the list of source files.
+## """
+## default_file_patterns = [
+## '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
+## '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
+## '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
+## '*.py',
+## ]
+##
+## default_exclude_patterns = [
+## '*~',
+## ]
+##
+## sources = []
+##
+## data = DoxyfileParse(node.get_contents())
+##
+## if data.get("RECURSIVE", "NO") == "YES":
+## recursive = True
+## else:
+## recursive = False
+##
+## file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
+## exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
+##
+## for node in data.get("INPUT", []):
+## if os.path.isfile(node):
+## sources.add(node)
+## elif os.path.isdir(node):
+## if recursive:
+## for root, dirs, files in os.walk(node):
+## for f in files:
+## filename = os.path.join(root, f)
+##
+## pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
+## exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
+##
+## if pattern_check and not exclude_check:
+## sources.append(filename)
+## else:
+## for pattern in file_patterns:
+## sources.extend(glob.glob("/".join([node, pattern])))
+## sources = map( lambda path: env.File(path), sources )
+## return sources
+##
+##
+##def DoxySourceScanCheck(node, env):
+## """Check if we should scan this file"""
+## return os.path.isfile(node.path)
+
+def srcDistEmitter(source, target, env):
+## """Doxygen Doxyfile emitter"""
+## # possible output formats and their default values and output locations
+## output_formats = {
+## "HTML": ("YES", "html"),
+## "LATEX": ("YES", "latex"),
+## "RTF": ("NO", "rtf"),
+## "MAN": ("YES", "man"),
+## "XML": ("NO", "xml"),
+## }
+##
+## data = DoxyfileParse(source[0].get_contents())
+##
+## targets = []
+## out_dir = data.get("OUTPUT_DIRECTORY", ".")
+##
+## # add our output locations
+## for (k, v) in output_formats.items():
+## if data.get("GENERATE_" + k, v[0]) == "YES":
+## targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
+##
+## # don't clobber targets
+## for node in targets:
+## env.Precious(node)
+##
+## # set up cleaning stuff
+## for node in targets:
+## env.Clean(node, node)
+##
+## return (targets, source)
+ return (target,source)
+
+def generate(env):
+ """
+ Add builders and construction variables for the
+ SrcDist tool.
+ """
+## doxyfile_scanner = env.Scanner(
+## DoxySourceScan,
+## "DoxySourceScan",
+## scan_check = DoxySourceScanCheck,
+## )
+
+ srcdist_builder = targz.makeBuilder( srcDistEmitter )
+
+ env['BUILDERS']['SrcDist'] = srcdist_builder
+
+def exists(env):
+ """
+ Make sure srcdist exists.
+ """
+ return True
diff --git a/scons-tools/substinfile.py b/scons-tools/substinfile.py
index 2502262..4d30585 100644
--- a/scons-tools/substinfile.py
+++ b/scons-tools/substinfile.py
@@ -1,79 +1,79 @@
-import re
-from SCons.Script import * # the usual scons stuff you get in a SConscript
-
-def generate(env):
- """
- Add builders and construction variables for the
- SubstInFile tool.
-
- Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
- from the source to the target.
- The values of SUBST_DICT first have any construction variables expanded
- (its keys are not expanded).
- If a value of SUBST_DICT is a python callable function, it is called and
- the result is expanded as the value.
- If there's more than one source and more than one target, each target gets
- substituted from the corresponding source.
- """
- def do_subst_in_file(targetfile, sourcefile, dict):
- """Replace all instances of the keys of dict with their values.
- For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
- then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
- """
- try:
- f = open(sourcefile, 'rb')
- contents = f.read()
- f.close()
- except:
- raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
- for (k,v) in dict.items():
- contents = re.sub(k, v, contents)
- try:
- f = open(targetfile, 'wb')
- f.write(contents)
- f.close()
- except:
- raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
- return 0 # success
-
- def subst_in_file(target, source, env):
- if not env.has_key('SUBST_DICT'):
- raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
- d = dict(env['SUBST_DICT']) # copy it
- for (k,v) in d.items():
- if callable(v):
- d[k] = env.subst(v()).replace('\\','\\\\')
- elif SCons.Util.is_String(v):
- d[k] = env.subst(v).replace('\\','\\\\')
- else:
- raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
- for (t,s) in zip(target, source):
- return do_subst_in_file(str(t), str(s), d)
-
- def subst_in_file_string(target, source, env):
- """This is what gets printed on the console."""
- return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
- for (t,s) in zip(target, source)])
-
- def subst_emitter(target, source, env):
- """Add dependency from substituted SUBST_DICT to target.
- Returns original target, source tuple unchanged.
- """
- d = env['SUBST_DICT'].copy() # copy it
- for (k,v) in d.items():
- if callable(v):
- d[k] = env.subst(v())
- elif SCons.Util.is_String(v):
- d[k]=env.subst(v)
- Depends(target, SCons.Node.Python.Value(d))
- return target, source
-
-## env.Append(TOOLS = 'substinfile') # this should be automaticaly done by Scons ?!?
- subst_action = SCons.Action.Action( subst_in_file, subst_in_file_string )
- env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
-
-def exists(env):
- """
- Make sure tool exists.
- """
- return True
+import re
+from SCons.Script import * # the usual scons stuff you get in a SConscript
+
+def generate(env):
+ """
+ Add builders and construction variables for the
+ SubstInFile tool.
+
+ Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
+ from the source to the target.
+ The values of SUBST_DICT first have any construction variables expanded
+ (its keys are not expanded).
+ If a value of SUBST_DICT is a python callable function, it is called and
+ the result is expanded as the value.
+ If there's more than one source and more than one target, each target gets
+ substituted from the corresponding source.
+ """
+ def do_subst_in_file(targetfile, sourcefile, dict):
+ """Replace all instances of the keys of dict with their values.
+ For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
+ then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
+ """
+ try:
+ f = open(sourcefile, 'rb')
+ contents = f.read()
+ f.close()
+ except:
+ raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
+ for (k,v) in dict.items():
+ contents = re.sub(k, v, contents)
+ try:
+ f = open(targetfile, 'wb')
+ f.write(contents)
+ f.close()
+ except:
+ raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
+ return 0 # success
+
+ def subst_in_file(target, source, env):
+ if not env.has_key('SUBST_DICT'):
+ raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
+ d = dict(env['SUBST_DICT']) # copy it
+ for (k,v) in d.items():
+ if callable(v):
+ d[k] = env.subst(v()).replace('\\','\\\\')
+ elif SCons.Util.is_String(v):
+ d[k] = env.subst(v).replace('\\','\\\\')
+ else:
+ raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
+ for (t,s) in zip(target, source):
+ return do_subst_in_file(str(t), str(s), d)
+
+ def subst_in_file_string(target, source, env):
+ """This is what gets printed on the console."""
+ return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
+ for (t,s) in zip(target, source)])
+
+ def subst_emitter(target, source, env):
+ """Add dependency from substituted SUBST_DICT to target.
+ Returns original target, source tuple unchanged.
+ """
+ d = env['SUBST_DICT'].copy() # copy it
+ for (k,v) in d.items():
+ if callable(v):
+ d[k] = env.subst(v())
+ elif SCons.Util.is_String(v):
+ d[k]=env.subst(v)
+ Depends(target, SCons.Node.Python.Value(d))
+ return target, source
+
+## env.Append(TOOLS = 'substinfile') # this should be automaticaly done by Scons ?!?
+ subst_action = SCons.Action.Action( subst_in_file, subst_in_file_string )
+ env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
+
+def exists(env):
+ """
+ Make sure tool exists.
+ """
+ return True
diff --git a/scons-tools/targz.py b/scons-tools/targz.py
index 2f21204..a655b11 100644
--- a/scons-tools/targz.py
+++ b/scons-tools/targz.py
@@ -3,75 +3,75 @@
Tool-specific initialization for tarball.
"""
-
-## Commands to tackle a command based implementation:
-##to unpack on the fly...
-##gunzip < FILE.tar.gz | tar xvf -
-##to pack on the fly...
-##tar cvf - FILE-LIST | gzip -c > FILE.tar.gz
+
+## Commands to tackle a command based implementation:
+##to unpack on the fly...
+##gunzip < FILE.tar.gz | tar xvf -
+##to pack on the fly...
+##tar cvf - FILE-LIST | gzip -c > FILE.tar.gz
import os.path
import SCons.Builder
import SCons.Node.FS
import SCons.Util
-
+
try:
- import gzip
+ import gzip
import tarfile
internal_targz = 1
except ImportError:
internal_targz = 0
-
-TARGZ_DEFAULT_COMPRESSION_LEVEL = 9
+
+TARGZ_DEFAULT_COMPRESSION_LEVEL = 9
if internal_targz:
- def targz(target, source, env):
- def archive_name( path ):
- path = os.path.normpath( os.path.abspath( path ) )
- common_path = os.path.commonprefix( (base_dir, path) )
- archive_name = path[len(common_path):]
- return archive_name
+ def targz(target, source, env):
+ def archive_name( path ):
+ path = os.path.normpath( os.path.abspath( path ) )
+ common_path = os.path.commonprefix( (base_dir, path) )
+ archive_name = path[len(common_path):]
+ return archive_name
def visit(tar, dirname, names):
for name in names:
path = os.path.join(dirname, name)
if os.path.isfile(path):
tar.add(path, archive_name(path) )
- compression = env.get('TARGZ_COMPRESSION_LEVEL',TARGZ_DEFAULT_COMPRESSION_LEVEL)
- base_dir = os.path.normpath( env.get('TARGZ_BASEDIR', env.Dir('.')).abspath )
- target_path = str(target[0])
+ compression = env.get('TARGZ_COMPRESSION_LEVEL',TARGZ_DEFAULT_COMPRESSION_LEVEL)
+ base_dir = os.path.normpath( env.get('TARGZ_BASEDIR', env.Dir('.')).abspath )
+ target_path = str(target[0])
fileobj = gzip.GzipFile( target_path, 'wb', compression )
tar = tarfile.TarFile(os.path.splitext(target_path)[0], 'w', fileobj)
- for source in source:
+ for source in source:
source_path = str(source)
if source.isdir():
os.path.walk(source_path, visit, tar)
- else:
+ else:
tar.add(source_path, archive_name(source_path) ) # filename, arcname
tar.close()
targzAction = SCons.Action.Action(targz, varlist=['TARGZ_COMPRESSION_LEVEL','TARGZ_BASEDIR'])
-
+
def makeBuilder( emitter = None ):
- return SCons.Builder.Builder(action = SCons.Action.Action('$TARGZ_COM', '$TARGZ_COMSTR'),
- source_factory = SCons.Node.FS.Entry,
- source_scanner = SCons.Defaults.DirScanner,
- suffix = '$TARGZ_SUFFIX',
- multi = 1)
+ return SCons.Builder.Builder(action = SCons.Action.Action('$TARGZ_COM', '$TARGZ_COMSTR'),
+ source_factory = SCons.Node.FS.Entry,
+ source_scanner = SCons.Defaults.DirScanner,
+ suffix = '$TARGZ_SUFFIX',
+ multi = 1)
TarGzBuilder = makeBuilder()
def generate(env):
- """Add Builders and construction variables for zip to an Environment.
- The following environnement variables may be set:
- TARGZ_COMPRESSION_LEVEL: integer, [0-9]. 0: no compression, 9: best compression (same as gzip compression level).
- TARGZ_BASEDIR: base-directory used to determine archive name (this allow archive name to be relative
- to something other than top-dir).
+ """Add Builders and construction variables for zip to an Environment.
+ The following environnement variables may be set:
+ TARGZ_COMPRESSION_LEVEL: integer, [0-9]. 0: no compression, 9: best compression (same as gzip compression level).
+ TARGZ_BASEDIR: base-directory used to determine archive name (this allow archive name to be relative
+ to something other than top-dir).
"""
- env['BUILDERS']['TarGz'] = TarGzBuilder
- env['TARGZ_COM'] = targzAction
+ env['BUILDERS']['TarGz'] = TarGzBuilder
+ env['TARGZ_COM'] = targzAction
env['TARGZ_COMPRESSION_LEVEL'] = TARGZ_DEFAULT_COMPRESSION_LEVEL # range 0-9
- env['TARGZ_SUFFIX'] = '.tar.gz'
+ env['TARGZ_SUFFIX'] = '.tar.gz'
env['TARGZ_BASEDIR'] = env.Dir('.') # Sources archive name are made relative to that directory.
def exists(env):
diff --git a/src/jsontestrunner/main.cpp b/src/jsontestrunner/main.cpp
index 1d8b303..88ed2f1 100644
--- a/src/jsontestrunner/main.cpp
+++ b/src/jsontestrunner/main.cpp
@@ -1,187 +1,187 @@
-#include <json/json.h>
-#include <algorithm> // sort
-#include <stdio.h>
-
-#if defined(_MSC_VER) && _MSC_VER >= 1310
-# pragma warning( disable: 4996 ) // disable fopen deprecation warning
-#endif
-
-static std::string
-readInputTestFile( const char *path )
-{
- FILE *file = fopen( path, "rb" );
- if ( !file )
- return std::string("");
- fseek( file, 0, SEEK_END );
- long size = ftell( file );
- fseek( file, 0, SEEK_SET );
- std::string text;
- char *buffer = new char[size+1];
- buffer[size] = 0;
- if ( fread( buffer, 1, size, file ) == (unsigned long)size )
- text = buffer;
- fclose( file );
- delete[] buffer;
- return text;
-}
-
-
-static void
-printValueTree( FILE *fout, Json::Value &value, const std::string &path = "." )
-{
- switch ( value.type() )
- {
- case Json::nullValue:
- fprintf( fout, "%s=null\n", path.c_str() );
- break;
- case Json::intValue:
- fprintf( fout, "%s=%d\n", path.c_str(), value.asInt() );
- break;
- case Json::uintValue:
- fprintf( fout, "%s=%u\n", path.c_str(), value.asUInt() );
- break;
- case Json::realValue:
- fprintf( fout, "%s=%.16g\n", path.c_str(), value.asDouble() );
- break;
- case Json::stringValue:
- fprintf( fout, "%s=\"%s\"\n", path.c_str(), value.asString().c_str() );
- break;
- case Json::booleanValue:
- fprintf( fout, "%s=%s\n", path.c_str(), value.asBool() ? "true" : "false" );
- break;
- case Json::arrayValue:
- {
- fprintf( fout, "%s=[]\n", path.c_str() );
- int size = value.size();
- for ( int index =0; index < size; ++index )
- {
- static char buffer[16];
- sprintf( buffer, "[%d]", index );
- printValueTree( fout, value[index], path + buffer );
- }
- }
- break;
- case Json::objectValue:
- {
- fprintf( fout, "%s={}\n", path.c_str() );
- Json::Value::Members members( value.getMemberNames() );
- std::sort( members.begin(), members.end() );
- std::string suffix = *(path.end()-1) == '.' ? "" : ".";
- for ( Json::Value::Members::iterator it = members.begin();
- it != members.end();
- ++it )
- {
- const std::string &name = *it;
- printValueTree( fout, value[name], path + suffix + name );
- }
- }
- break;
- default:
- break;
- }
-}
-
-
-static int
-parseAndSaveValueTree( const std::string &input,
- const std::string &actual,
- const std::string &kind,
- Json::Value &root )
-{
- Json::Reader reader;
- bool parsingSuccessful = reader.parse( input, root );
- if ( !parsingSuccessful )
- {
- printf( "Failed to parse %s file: \n%s\n",
- kind.c_str(),
- reader.getFormatedErrorMessages().c_str() );
- return 1;
- }
-
- FILE *factual = fopen( actual.c_str(), "wt" );
- if ( !factual )
- {
- printf( "Failed to create %s actual file.\n", kind.c_str() );
- return 2;
- }
- printValueTree( factual, root );
- fclose( factual );
- return 0;
-}
-
-
-static int
-rewriteValueTree( const std::string &rewritePath,
- const Json::Value &root,
- std::string &rewrite )
-{
- //Json::FastWriter writer;
- //writer.enableYAMLCompatibility();
- Json::StyledWriter writer;
- rewrite = writer.write( root );
- FILE *fout = fopen( rewritePath.c_str(), "wt" );
- if ( !fout )
- {
- printf( "Failed to create rewrite file: %s\n", rewritePath.c_str() );
- return 2;
- }
- fprintf( fout, "%s\n", rewrite.c_str() );
- fclose( fout );
- return 0;
-}
-
-
-static std::string
-removeSuffix( const std::string &path,
- const std::string &extension )
-{
- if ( extension.length() >= path.length() )
- return std::string("");
- std::string suffix = path.substr( path.length() - extension.length() );
- if ( suffix != extension )
- return std::string("");
- return path.substr( 0, path.length() - extension.length() );
-}
-
-int main( int argc, const char *argv[] )
-{
- if ( argc != 2 )
- {
- printf( "Usage: %s input-json-file", argv[0] );
- return 3;
- }
-
- std::string input = readInputTestFile( argv[1] );
- if ( input.empty() )
- {
- printf( "Failed to read input or empty input: %s\n", argv[1] );
- return 3;
- }
-
- std::string basePath = removeSuffix( argv[1], ".json" );
- if ( basePath.empty() )
- {
- printf( "Bad input path. Path does not end with '.expected':\n%s\n", argv[1] );
- return 3;
- }
-
- std::string actualPath = basePath + ".actual";
- std::string rewritePath = basePath + ".rewrite";
- std::string rewriteActualPath = basePath + ".actual-rewrite";
-
- Json::Value root;
- int exitCode = parseAndSaveValueTree( input, actualPath, "input", root );
- if ( exitCode == 0 )
- {
- std::string rewrite;
- exitCode = rewriteValueTree( rewritePath, root, rewrite );
- if ( exitCode == 0 )
- {
- Json::Value rewriteRoot;
- exitCode = parseAndSaveValueTree( rewrite, rewriteActualPath, "rewrite", rewriteRoot );
- }
- }
-
- return exitCode;
-}
-
+#include <json/json.h>
+#include <algorithm> // sort
+#include <stdio.h>
+
+#if defined(_MSC_VER) && _MSC_VER >= 1310
+# pragma warning( disable: 4996 ) // disable fopen deprecation warning
+#endif
+
+static std::string
+readInputTestFile( const char *path )
+{
+ FILE *file = fopen( path, "rb" );
+ if ( !file )
+ return std::string("");
+ fseek( file, 0, SEEK_END );
+ long size = ftell( file );
+ fseek( file, 0, SEEK_SET );
+ std::string text;
+ char *buffer = new char[size+1];
+ buffer[size] = 0;
+ if ( fread( buffer, 1, size, file ) == (unsigned long)size )
+ text = buffer;
+ fclose( file );
+ delete[] buffer;
+ return text;
+}
+
+
+static void
+printValueTree( FILE *fout, Json::Value &value, const std::string &path = "." )
+{
+ switch ( value.type() )
+ {
+ case Json::nullValue:
+ fprintf( fout, "%s=null\n", path.c_str() );
+ break;
+ case Json::intValue:
+ fprintf( fout, "%s=%d\n", path.c_str(), value.asInt() );
+ break;
+ case Json::uintValue:
+ fprintf( fout, "%s=%u\n", path.c_str(), value.asUInt() );
+ break;
+ case Json::realValue:
+ fprintf( fout, "%s=%.16g\n", path.c_str(), value.asDouble() );
+ break;
+ case Json::stringValue:
+ fprintf( fout, "%s=\"%s\"\n", path.c_str(), value.asString().c_str() );
+ break;
+ case Json::booleanValue:
+ fprintf( fout, "%s=%s\n", path.c_str(), value.asBool() ? "true" : "false" );
+ break;
+ case Json::arrayValue:
+ {
+ fprintf( fout, "%s=[]\n", path.c_str() );
+ int size = value.size();
+ for ( int index =0; index < size; ++index )
+ {
+ static char buffer[16];
+ sprintf( buffer, "[%d]", index );
+ printValueTree( fout, value[index], path + buffer );
+ }
+ }
+ break;
+ case Json::objectValue:
+ {
+ fprintf( fout, "%s={}\n", path.c_str() );
+ Json::Value::Members members( value.getMemberNames() );
+ std::sort( members.begin(), members.end() );
+ std::string suffix = *(path.end()-1) == '.' ? "" : ".";
+ for ( Json::Value::Members::iterator it = members.begin();
+ it != members.end();
+ ++it )
+ {
+ const std::string &name = *it;
+ printValueTree( fout, value[name], path + suffix + name );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
+static int
+parseAndSaveValueTree( const std::string &input,
+ const std::string &actual,
+ const std::string &kind,
+ Json::Value &root )
+{
+ Json::Reader reader;
+ bool parsingSuccessful = reader.parse( input, root );
+ if ( !parsingSuccessful )
+ {
+ printf( "Failed to parse %s file: \n%s\n",
+ kind.c_str(),
+ reader.getFormatedErrorMessages().c_str() );
+ return 1;
+ }
+
+ FILE *factual = fopen( actual.c_str(), "wt" );
+ if ( !factual )
+ {
+ printf( "Failed to create %s actual file.\n", kind.c_str() );
+ return 2;
+ }
+ printValueTree( factual, root );
+ fclose( factual );
+ return 0;
+}
+
+
+static int
+rewriteValueTree( const std::string &rewritePath,
+ const Json::Value &root,
+ std::string &rewrite )
+{
+ //Json::FastWriter writer;
+ //writer.enableYAMLCompatibility();
+ Json::StyledWriter writer;
+ rewrite = writer.write( root );
+ FILE *fout = fopen( rewritePath.c_str(), "wt" );
+ if ( !fout )
+ {
+ printf( "Failed to create rewrite file: %s\n", rewritePath.c_str() );
+ return 2;
+ }
+ fprintf( fout, "%s\n", rewrite.c_str() );
+ fclose( fout );
+ return 0;
+}
+
+
+static std::string
+removeSuffix( const std::string &path,
+ const std::string &extension )
+{
+ if ( extension.length() >= path.length() )
+ return std::string("");
+ std::string suffix = path.substr( path.length() - extension.length() );
+ if ( suffix != extension )
+ return std::string("");
+ return path.substr( 0, path.length() - extension.length() );
+}
+
+int main( int argc, const char *argv[] )
+{
+ if ( argc != 2 )
+ {
+ printf( "Usage: %s input-json-file", argv[0] );
+ return 3;
+ }
+
+ std::string input = readInputTestFile( argv[1] );
+ if ( input.empty() )
+ {
+ printf( "Failed to read input or empty input: %s\n", argv[1] );
+ return 3;
+ }
+
+ std::string basePath = removeSuffix( argv[1], ".json" );
+ if ( basePath.empty() )
+ {
+ printf( "Bad input path. Path does not end with '.expected':\n%s\n", argv[1] );
+ return 3;
+ }
+
+ std::string actualPath = basePath + ".actual";
+ std::string rewritePath = basePath + ".rewrite";
+ std::string rewriteActualPath = basePath + ".actual-rewrite";
+
+ Json::Value root;
+ int exitCode = parseAndSaveValueTree( input, actualPath, "input", root );
+ if ( exitCode == 0 )
+ {
+ std::string rewrite;
+ exitCode = rewriteValueTree( rewritePath, root, rewrite );
+ if ( exitCode == 0 )
+ {
+ Json::Value rewriteRoot;
+ exitCode = parseAndSaveValueTree( rewrite, rewriteActualPath, "rewrite", rewriteRoot );
+ }
+ }
+
+ return exitCode;
+}
+
diff --git a/src/jsontestrunner/sconscript b/src/jsontestrunner/sconscript
index f81a2dc..e9fe37f 100644
--- a/src/jsontestrunner/sconscript
+++ b/src/jsontestrunner/sconscript
@@ -1,6 +1,6 @@
-Import( 'env_testing buildJSONTests' )
-
-buildJSONTests( env_testing, Split( """
- main.cpp
- """ ),
- 'jsontestrunner' )
+Import( 'env_testing buildJSONTests' )
+
+buildJSONTests( env_testing, Split( """
+ main.cpp
+ """ ),
+ 'jsontestrunner' )
diff --git a/test/cleantests.py b/test/cleantests.py
index 5872a87..e5f99e6 100644
--- a/test/cleantests.py
+++ b/test/cleantests.py
@@ -1,10 +1,10 @@
-# removes all files created during testing
-import glob
-import os
-
-paths = []
-for pattern in [ '*.actual', '*.actual-rewrite', '*.rewrite', '*.process-output' ]:
- paths += glob.glob( pattern )
-
-for path in paths:
- os.unlink( path )
+# removes all files created during testing
+import glob
+import os
+
+paths = []
+for pattern in [ '*.actual', '*.actual-rewrite', '*.rewrite', '*.process-output' ]:
+ paths += glob.glob( pattern )
+
+for path in paths:
+ os.unlink( path )
diff --git a/test/generate_expected.py b/test/generate_expected.py
index a46e889..5b215c4 100644
--- a/test/generate_expected.py
+++ b/test/generate_expected.py
@@ -1,11 +1,11 @@
-import glob
-import os.path
-for path in glob.glob( '*.json' ):
- text = file(path,'rt').read()
- target = os.path.splitext(path)[0] + '.expected'
- if os.path.exists( target ):
- print 'skipping:', target
- else:
- print 'creating:', target
- file(target,'wt').write(text)
-
+import glob
+import os.path
+for path in glob.glob( '*.json' ):
+ text = file(path,'rt').read()
+ target = os.path.splitext(path)[0] + '.expected'
+ if os.path.exists( target ):
+ print 'skipping:', target
+ else:
+ print 'creating:', target
+ file(target,'wt').write(text)
+
diff --git a/test/jsontestrunner.py b/test/jsontestrunner.py
index ec05a91..a076d0c 100644
--- a/test/jsontestrunner.py
+++ b/test/jsontestrunner.py
@@ -1,64 +1,64 @@
-# Simple implementation of a json test runner to run the test against json-py.
-
-import sys
-import os.path
-import json
-import types
-
-if len(sys.argv) != 2:
- print "Usage: %s input-json-file", sys.argv[0]
- sys.exit(3)
-
-input_path = sys.argv[1]
-base_path = os.path.splitext(input_path)[0]
-actual_path = base_path + '.actual'
-rewrite_path = base_path + '.rewrite'
-rewrite_actual_path = base_path + '.actual-rewrite'
-
-def valueTreeToString( fout, value, path = '.' ):
- ty = type(value)
- if ty is types.DictType:
- fout.write( '%s={}\n' % path )
- suffix = path[-1] != '.' and '.' or ''
- names = value.keys()
- names.sort()
- for name in names:
- valueTreeToString( fout, value[name], path + suffix + name )
- elif ty is types.ListType:
- fout.write( '%s=[]\n' % path )
- for index, childValue in zip( xrange(0,len(value)), value ):
- valueTreeToString( fout, childValue, path + '[%d]' % index )
- elif ty is types.StringType:
- fout.write( '%s="%s"\n' % (path,value) )
- elif ty is types.IntType:
- fout.write( '%s=%d\n' % (path,value) )
- elif ty is types.FloatType:
- fout.write( '%s=%.16g\n' % (path,value) )
- elif value is True:
- fout.write( '%s=true\n' % path )
- elif value is False:
- fout.write( '%s=false\n' % path )
- elif value is None:
- fout.write( '%s=null\n' % path )
- else:
- assert False and "Unexpected value type"
-
-def parseAndSaveValueTree( input, actual_path ):
- root = json.read( input )
- fout = file( actual_path, 'wt' )
- valueTreeToString( fout, root )
- fout.close()
- return root
-
-def rewriteValueTree( value, rewrite_path ):
- rewrite = json.write( value )
- rewrite = rewrite[1:-1] # Somehow the string is quoted ! jsonpy bug ?
- file( rewrite_path, 'wt').write( rewrite + '\n' )
- return rewrite
-
-input = file( input_path, 'rt' ).read()
-root = parseAndSaveValueTree( input, actual_path )
-rewrite = rewriteValueTree( json.write( root ), rewrite_path )
-rewrite_root = parseAndSaveValueTree( rewrite, rewrite_actual_path )
-
-sys.exit( 0 )
+# Simple implementation of a json test runner to run the test against json-py.
+
+import sys
+import os.path
+import json
+import types
+
+if len(sys.argv) != 2:
+ print "Usage: %s input-json-file", sys.argv[0]
+ sys.exit(3)
+
+input_path = sys.argv[1]
+base_path = os.path.splitext(input_path)[0]
+actual_path = base_path + '.actual'
+rewrite_path = base_path + '.rewrite'
+rewrite_actual_path = base_path + '.actual-rewrite'
+
+def valueTreeToString( fout, value, path = '.' ):
+ ty = type(value)
+ if ty is types.DictType:
+ fout.write( '%s={}\n' % path )
+ suffix = path[-1] != '.' and '.' or ''
+ names = value.keys()
+ names.sort()
+ for name in names:
+ valueTreeToString( fout, value[name], path + suffix + name )
+ elif ty is types.ListType:
+ fout.write( '%s=[]\n' % path )
+ for index, childValue in zip( xrange(0,len(value)), value ):
+ valueTreeToString( fout, childValue, path + '[%d]' % index )
+ elif ty is types.StringType:
+ fout.write( '%s="%s"\n' % (path,value) )
+ elif ty is types.IntType:
+ fout.write( '%s=%d\n' % (path,value) )
+ elif ty is types.FloatType:
+ fout.write( '%s=%.16g\n' % (path,value) )
+ elif value is True:
+ fout.write( '%s=true\n' % path )
+ elif value is False:
+ fout.write( '%s=false\n' % path )
+ elif value is None:
+ fout.write( '%s=null\n' % path )
+ else:
+ assert False and "Unexpected value type"
+
+def parseAndSaveValueTree( input, actual_path ):
+ root = json.read( input )
+ fout = file( actual_path, 'wt' )
+ valueTreeToString( fout, root )
+ fout.close()
+ return root
+
+def rewriteValueTree( value, rewrite_path ):
+ rewrite = json.write( value )
+ rewrite = rewrite[1:-1] # Somehow the string is quoted ! jsonpy bug ?
+ file( rewrite_path, 'wt').write( rewrite + '\n' )
+ return rewrite
+
+input = file( input_path, 'rt' ).read()
+root = parseAndSaveValueTree( input, actual_path )
+rewrite = rewriteValueTree( json.write( root ), rewrite_path )
+rewrite_root = parseAndSaveValueTree( rewrite, rewrite_actual_path )
+
+sys.exit( 0 )
diff --git a/test/runjsontests.py b/test/runjsontests.py
index de7bd9d..38bfd6e 100644
--- a/test/runjsontests.py
+++ b/test/runjsontests.py
@@ -1,91 +1,91 @@
-import sys
-import os
-import os.path
-import glob
-
-
-def compareOutputs( expected, actual, message ):
- expected = expected.strip().replace('\r','').split('\n')
- actual = actual.strip().replace('\r','').split('\n')
- diff_line = 0
- max_line_to_compare = min( len(expected), len(actual) )
- for index in xrange(0,max_line_to_compare):
- if expected[index].strip() != actual[index].strip():
- diff_line = index + 1
- break
- if diff_line == 0 and len(expected) != len(actual):
- diff_line = max_line_to_compare+1
- if diff_line == 0:
- return None
- def safeGetLine( lines, index ):
- index += -1
- if index >= len(lines):
- return ''
- return lines[index].strip()
- return """ Difference in %s at line %d:
- Expected: '%s'
- Actual: '%s'
-""" % (message, diff_line,
- safeGetLine(expected,diff_line),
- safeGetLine(actual,diff_line) )
-
-def safeReadFile( path ):
- try:
- return file( path, 'rt' ).read()
- except IOError, e:
- return '<File "%s" is missing: %s>' % (path,e)
-
-def runAllTests( jsontest_executable_path, input_dir = None ):
- if not input_dir:
- input_dir = os.getcwd()
- tests = glob.glob( os.path.join( input_dir, '*.json' ) )
- failed_tests = []
- for input_path in tests:
- print 'TESTING:', input_path,
- pipe = os.popen( "%s %s" % (jsontest_executable_path, input_path) )
- process_output = pipe.read()
- status = pipe.close()
- base_path = os.path.splitext(input_path)[0]
- actual_output = safeReadFile( base_path + '.actual' )
- actual_rewrite_output = safeReadFile( base_path + '.actual-rewrite' )
- file(base_path + '.process-output','wt').write( process_output )
- if status:
- print 'parsing failed'
- failed_tests.append( (input_path, 'Parsing failed:\n' + process_output) )
- else:
- expected_output_path = os.path.splitext(input_path)[0] + '.expected'
- expected_output = file( expected_output_path, 'rt' ).read()
- detail = ( compareOutputs( expected_output, actual_output, 'input' )
- or compareOutputs( expected_output, actual_rewrite_output, 'rewrite' ) )
- if detail:
- print 'FAILED'
- failed_tests.append( (input_path, detail) )
- else:
- print 'OK'
-
- if failed_tests:
- print
- print 'Failure details:'
- for failed_test in failed_tests:
- print '* Test', failed_test[0]
- print failed_test[1]
- print
- print 'Test results: %d passed, %d failed.' % (len(tests)-len(failed_tests),
- len(failed_tests) )
- return 1
- else:
- print 'All %d tests passed.' % len(tests)
- return 0
-
-if __name__ == '__main__':
- if len(sys.argv) < 1 or len(sys.argv) > 2:
- print "Usage: %s jsontest-executable-path [input-testcase-directory]" % sys.argv[0]
- sys.exit( 1 )
-
- jsontest_executable_path = os.path.normpath( os.path.abspath( sys.argv[1] ) )
- if len(sys.argv) > 2:
- input_path = os.path.normpath( os.path.abspath( sys.argv[2] ) )
- else:
- input_path = None
- status = runAllTests( jsontest_executable_path, input_path )
+import sys
+import os
+import os.path
+import glob
+
+
+def compareOutputs( expected, actual, message ):
+ expected = expected.strip().replace('\r','').split('\n')
+ actual = actual.strip().replace('\r','').split('\n')
+ diff_line = 0
+ max_line_to_compare = min( len(expected), len(actual) )
+ for index in xrange(0,max_line_to_compare):
+ if expected[index].strip() != actual[index].strip():
+ diff_line = index + 1
+ break
+ if diff_line == 0 and len(expected) != len(actual):
+ diff_line = max_line_to_compare+1
+ if diff_line == 0:
+ return None
+ def safeGetLine( lines, index ):
+ index += -1
+ if index >= len(lines):
+ return ''
+ return lines[index].strip()
+ return """ Difference in %s at line %d:
+ Expected: '%s'
+ Actual: '%s'
+""" % (message, diff_line,
+ safeGetLine(expected,diff_line),
+ safeGetLine(actual,diff_line) )
+
+def safeReadFile( path ):
+ try:
+ return file( path, 'rt' ).read()
+ except IOError, e:
+ return '<File "%s" is missing: %s>' % (path,e)
+
+def runAllTests( jsontest_executable_path, input_dir = None ):
+ if not input_dir:
+ input_dir = os.getcwd()
+ tests = glob.glob( os.path.join( input_dir, '*.json' ) )
+ failed_tests = []
+ for input_path in tests:
+ print 'TESTING:', input_path,
+ pipe = os.popen( "%s %s" % (jsontest_executable_path, input_path) )
+ process_output = pipe.read()
+ status = pipe.close()
+ base_path = os.path.splitext(input_path)[0]
+ actual_output = safeReadFile( base_path + '.actual' )
+ actual_rewrite_output = safeReadFile( base_path + '.actual-rewrite' )
+ file(base_path + '.process-output','wt').write( process_output )
+ if status:
+ print 'parsing failed'
+ failed_tests.append( (input_path, 'Parsing failed:\n' + process_output) )
+ else:
+ expected_output_path = os.path.splitext(input_path)[0] + '.expected'
+ expected_output = file( expected_output_path, 'rt' ).read()
+ detail = ( compareOutputs( expected_output, actual_output, 'input' )
+ or compareOutputs( expected_output, actual_rewrite_output, 'rewrite' ) )
+ if detail:
+ print 'FAILED'
+ failed_tests.append( (input_path, detail) )
+ else:
+ print 'OK'
+
+ if failed_tests:
+ print
+ print 'Failure details:'
+ for failed_test in failed_tests:
+ print '* Test', failed_test[0]
+ print failed_test[1]
+ print
+ print 'Test results: %d passed, %d failed.' % (len(tests)-len(failed_tests),
+ len(failed_tests) )
+ return 1
+ else:
+ print 'All %d tests passed.' % len(tests)
+ return 0
+
+if __name__ == '__main__':
+ if len(sys.argv) < 1 or len(sys.argv) > 2:
+ print "Usage: %s jsontest-executable-path [input-testcase-directory]" % sys.argv[0]
+ sys.exit( 1 )
+
+ jsontest_executable_path = os.path.normpath( os.path.abspath( sys.argv[1] ) )
+ if len(sys.argv) > 2:
+ input_path = os.path.normpath( os.path.abspath( sys.argv[2] ) )
+ else:
+ input_path = None
+ status = runAllTests( jsontest_executable_path, input_path )
sys.exit( status )
\ No newline at end of file
diff --git a/test/test_array_01.expected b/test/test_array_01.expected
index 4aa8fb3..a341ff7 100644
--- a/test/test_array_01.expected
+++ b/test/test_array_01.expected
@@ -1 +1 @@
-.=[]
+.=[]
diff --git a/test/test_array_01.json b/test/test_array_01.json
index 60b0742..fe51488 100644
--- a/test/test_array_01.json
+++ b/test/test_array_01.json
@@ -1 +1 @@
-[]
+[]
diff --git a/test/test_array_02.expected b/test/test_array_02.expected
index 5b7c72a..ef1f262 100644
--- a/test/test_array_02.expected
+++ b/test/test_array_02.expected
@@ -1,2 +1,2 @@
-.=[]
-.[0]=1
+.=[]
+.[0]=1
diff --git a/test/test_array_02.json b/test/test_array_02.json
index c02be12..7660873 100644
--- a/test/test_array_02.json
+++ b/test/test_array_02.json
@@ -1 +1 @@
-[1]
+[1]
diff --git a/test/test_array_03.expected b/test/test_array_03.expected
index 0ba568e..3d8dc18 100644
--- a/test/test_array_03.expected
+++ b/test/test_array_03.expected
@@ -1,6 +1,6 @@
-.=[]
-.[0]=1
-.[1]=2
-.[2]=3
-.[3]=4
-.[4]=5
+.=[]
+.[0]=1
+.[1]=2
+.[2]=3
+.[3]=4
+.[4]=5
diff --git a/test/test_array_03.json b/test/test_array_03.json
index ac8f422..9b3f924 100644
--- a/test/test_array_03.json
+++ b/test/test_array_03.json
@@ -1 +1 @@
-[ 1, 2 , 3,4,5]
+[ 1, 2 , 3,4,5]
diff --git a/test/test_array_04.expected b/test/test_array_04.expected
index db58c30..ad4add9 100644
--- a/test/test_array_04.expected
+++ b/test/test_array_04.expected
@@ -1,5 +1,5 @@
-.=[]
-.[0]=1
-.[1]="abc"
-.[2]=12.3
-.[3]=-4
+.=[]
+.[0]=1
+.[1]="abc"
+.[2]=12.3
+.[3]=-4
diff --git a/test/test_array_04.json b/test/test_array_04.json
index 0755478..ecca546 100644
--- a/test/test_array_04.json
+++ b/test/test_array_04.json
@@ -1 +1 @@
-[1, "abc" , 12.3, -4]
+[1, "abc" , 12.3, -4]
diff --git a/test/test_array_05.expected b/test/test_array_05.expected
index 82ad484..76cff87 100644
--- a/test/test_array_05.expected
+++ b/test/test_array_05.expected
@@ -1,100 +1,100 @@
-.=[]
-.[0]=1
-.[1]=2
-.[2]=3
-.[3]=4
-.[4]=5
-.[5]=6
-.[6]=7
-.[7]=8
-.[8]=9
-.[9]=10
-.[10]=11
-.[11]=12
-.[12]=13
-.[13]=14
-.[14]=15
-.[15]=16
-.[16]=17
-.[17]=18
-.[18]=19
-.[19]=20
-.[20]=21
-.[21]=22
-.[22]=23
-.[23]=24
-.[24]=25
-.[25]=26
-.[26]=27
-.[27]=28
-.[28]=29
-.[29]=30
-.[30]=31
-.[31]=32
-.[32]=33
-.[33]=34
-.[34]=35
-.[35]=36
-.[36]=37
-.[37]=38
-.[38]=39
-.[39]=40
-.[40]=41
-.[41]=42
-.[42]=43
-.[43]=44
-.[44]=45
-.[45]=46
-.[46]=47
-.[47]=48
-.[48]=49
-.[49]=50
-.[50]=51
-.[51]=52
-.[52]=53
-.[53]=54
-.[54]=55
-.[55]=56
-.[56]=57
-.[57]=58
-.[58]=59
-.[59]=60
-.[60]=61
-.[61]=62
-.[62]=63
-.[63]=64
-.[64]=65
-.[65]=66
-.[66]=67
-.[67]=68
-.[68]=69
-.[69]=70
-.[70]=71
-.[71]=72
-.[72]=73
-.[73]=74
-.[74]=75
-.[75]=76
-.[76]=77
-.[77]=78
-.[78]=79
-.[79]=80
-.[80]=81
-.[81]=82
-.[82]=83
-.[83]=84
-.[84]=85
-.[85]=86
-.[86]=87
-.[87]=88
-.[88]=89
-.[89]=90
-.[90]=91
-.[91]=92
-.[92]=93
-.[93]=94
-.[94]=95
-.[95]=96
-.[96]=97
-.[97]=98
-.[98]=99
+.=[]
+.[0]=1
+.[1]=2
+.[2]=3
+.[3]=4
+.[4]=5
+.[5]=6
+.[6]=7
+.[7]=8
+.[8]=9
+.[9]=10
+.[10]=11
+.[11]=12
+.[12]=13
+.[13]=14
+.[14]=15
+.[15]=16
+.[16]=17
+.[17]=18
+.[18]=19
+.[19]=20
+.[20]=21
+.[21]=22
+.[22]=23
+.[23]=24
+.[24]=25
+.[25]=26
+.[26]=27
+.[27]=28
+.[28]=29
+.[29]=30
+.[30]=31
+.[31]=32
+.[32]=33
+.[33]=34
+.[34]=35
+.[35]=36
+.[36]=37
+.[37]=38
+.[38]=39
+.[39]=40
+.[40]=41
+.[41]=42
+.[42]=43
+.[43]=44
+.[44]=45
+.[45]=46
+.[46]=47
+.[47]=48
+.[48]=49
+.[49]=50
+.[50]=51
+.[51]=52
+.[52]=53
+.[53]=54
+.[54]=55
+.[55]=56
+.[56]=57
+.[57]=58
+.[58]=59
+.[59]=60
+.[60]=61
+.[61]=62
+.[62]=63
+.[63]=64
+.[64]=65
+.[65]=66
+.[66]=67
+.[67]=68
+.[68]=69
+.[69]=70
+.[70]=71
+.[71]=72
+.[72]=73
+.[73]=74
+.[74]=75
+.[75]=76
+.[76]=77
+.[77]=78
+.[78]=79
+.[79]=80
+.[80]=81
+.[81]=82
+.[82]=83
+.[83]=84
+.[84]=85
+.[85]=86
+.[86]=87
+.[87]=88
+.[88]=89
+.[89]=90
+.[90]=91
+.[91]=92
+.[92]=93
+.[93]=94
+.[94]=95
+.[95]=96
+.[96]=97
+.[97]=98
+.[98]=99
diff --git a/test/test_array_06.expected b/test/test_array_06.expected
index e087b63..5c9f48e 100644
--- a/test/test_array_06.expected
+++ b/test/test_array_06.expected
@@ -1,5 +1,5 @@
-.=[]
-.[0]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-.[1]="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
-.[2]="ccccccccccccccccccccccc"
-.[3]="dddddddddddddddddddddddddddddddddddddddddddddddddddd"
+.=[]
+.[0]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+.[1]="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+.[2]="ccccccccccccccccccccccc"
+.[3]="dddddddddddddddddddddddddddddddddddddddddddddddddddd"
diff --git a/test/test_array_06.json b/test/test_array_06.json
index 9777a64..7f6c516 100644
--- a/test/test_array_06.json
+++ b/test/test_array_06.json
@@ -1,4 +1,4 @@
-[ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
- "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
- "ccccccccccccccccccccccc",
+[ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+ "ccccccccccccccccccccccc",
"dddddddddddddddddddddddddddddddddddddddddddddddddddd" ]
\ No newline at end of file
diff --git a/test/test_basic_01.expected b/test/test_basic_01.expected
index 0527387..d761fce 100644
--- a/test/test_basic_01.expected
+++ b/test/test_basic_01.expected
@@ -1 +1 @@
-.=123456789
+.=123456789
diff --git a/test/test_basic_01.json b/test/test_basic_01.json
index 57cf9b9..11f11f9 100644
--- a/test/test_basic_01.json
+++ b/test/test_basic_01.json
@@ -1 +1 @@
-0123456789
+0123456789
diff --git a/test/test_basic_02.expected b/test/test_basic_02.expected
index 9040e84..650e37c 100644
--- a/test/test_basic_02.expected
+++ b/test/test_basic_02.expected
@@ -1 +1 @@
-.=-123456789
+.=-123456789
diff --git a/test/test_basic_02.json b/test/test_basic_02.json
index fe84da4..bf11bce 100644
--- a/test/test_basic_02.json
+++ b/test/test_basic_02.json
@@ -1 +1 @@
--0123456789
+-0123456789
diff --git a/test/test_basic_03.expected b/test/test_basic_03.expected
index 494278d..1da2d39 100644
--- a/test/test_basic_03.expected
+++ b/test/test_basic_03.expected
@@ -1,3 +1,3 @@
-.=1.2345678
-
-
+.=1.2345678
+
+
diff --git a/test/test_basic_03.json b/test/test_basic_03.json
index feac150..a92b6bd 100644
--- a/test/test_basic_03.json
+++ b/test/test_basic_03.json
@@ -1,3 +1,3 @@
-1.2345678
-
-
+1.2345678
+
+
diff --git a/test/test_basic_04.expected b/test/test_basic_04.expected
index 659f744..013f424 100644
--- a/test/test_basic_04.expected
+++ b/test/test_basic_04.expected
@@ -1,2 +1,2 @@
-.="abcdef"
-
+.="abcdef"
+
diff --git a/test/test_basic_04.json b/test/test_basic_04.json
index 01374bd..17eeb99 100644
--- a/test/test_basic_04.json
+++ b/test/test_basic_04.json
@@ -1,2 +1,2 @@
-"abcdef"
-
+"abcdef"
+
diff --git a/test/test_basic_05.expected b/test/test_basic_05.expected
index cb1cdad..c8db822 100644
--- a/test/test_basic_05.expected
+++ b/test/test_basic_05.expected
@@ -1,2 +1,2 @@
-.=null
-
+.=null
+
diff --git a/test/test_basic_05.json b/test/test_basic_05.json
index a6d4f5a..d0aaea2 100644
--- a/test/test_basic_05.json
+++ b/test/test_basic_05.json
@@ -1,2 +1,2 @@
-null
-
+null
+
diff --git a/test/test_basic_06.expected b/test/test_basic_06.expected
index 8b22731..49be55a 100644
--- a/test/test_basic_06.expected
+++ b/test/test_basic_06.expected
@@ -1,2 +1,2 @@
-.=true
-
+.=true
+
diff --git a/test/test_basic_06.json b/test/test_basic_06.json
index 5d967af..7eead1e 100644
--- a/test/test_basic_06.json
+++ b/test/test_basic_06.json
@@ -1,2 +1,2 @@
-true
-
+true
+
diff --git a/test/test_basic_07.expected b/test/test_basic_07.expected
index 4979ed5..fe55a6a 100644
--- a/test/test_basic_07.expected
+++ b/test/test_basic_07.expected
@@ -1,2 +1,2 @@
-.=false
-
+.=false
+
diff --git a/test/test_basic_07.json b/test/test_basic_07.json
index b7ee6c5..a864bc4 100644
--- a/test/test_basic_07.json
+++ b/test/test_basic_07.json
@@ -1,2 +1,2 @@
-false
-
+false
+
diff --git a/test/test_basic_08.expected b/test/test_basic_08.expected
index cb1cdad..c8db822 100644
--- a/test/test_basic_08.expected
+++ b/test/test_basic_08.expected
@@ -1,2 +1,2 @@
-.=null
-
+.=null
+
diff --git a/test/test_basic_08.json b/test/test_basic_08.json
index fe107f4..fd78837 100644
--- a/test/test_basic_08.json
+++ b/test/test_basic_08.json
@@ -1,3 +1,3 @@
-// C++ style comment
-null
-
+// C++ style comment
+null
+
diff --git a/test/test_basic_09.expected b/test/test_basic_09.expected
index cb1cdad..c8db822 100644
--- a/test/test_basic_09.expected
+++ b/test/test_basic_09.expected
@@ -1,2 +1,2 @@
-.=null
-
+.=null
+
diff --git a/test/test_basic_09.json b/test/test_basic_09.json
index e0cb089..fc95f0f 100644
--- a/test/test_basic_09.json
+++ b/test/test_basic_09.json
@@ -1,4 +1,4 @@
-/* C style comment
- */
-null
-
+/* C style comment
+ */
+null
+
diff --git a/test/test_complex_01.expected b/test/test_complex_01.expected
index 44e753b..7573c88 100644
--- a/test/test_complex_01.expected
+++ b/test/test_complex_01.expected
@@ -1,20 +1,20 @@
-.={}
-.attribute=[]
-.attribute[0]="random"
-.attribute[1]="short"
-.attribute[2]="bold"
-.attribute[3]=12
-.attribute[4]={}
-.attribute[4].height=7
-.attribute[4].width=64
-.count=1234
-.name={}
-.name.aka="T.E.S.T."
-.name.id=123987
-.test={}
-.test.1={}
-.test.1.2={}
-.test.1.2.3={}
-.test.1.2.3.coord=[]
-.test.1.2.3.coord[0]=1
-.test.1.2.3.coord[1]=2
+.={}
+.attribute=[]
+.attribute[0]="random"
+.attribute[1]="short"
+.attribute[2]="bold"
+.attribute[3]=12
+.attribute[4]={}
+.attribute[4].height=7
+.attribute[4].width=64
+.count=1234
+.name={}
+.name.aka="T.E.S.T."
+.name.id=123987
+.test={}
+.test.1={}
+.test.1.2={}
+.test.1.2.3={}
+.test.1.2.3.coord=[]
+.test.1.2.3.coord[0]=1
+.test.1.2.3.coord[1]=2
diff --git a/test/test_complex_01.json b/test/test_complex_01.json
index fb2f86c..cc0f30f 100644
--- a/test/test_complex_01.json
+++ b/test/test_complex_01.json
@@ -1,17 +1,17 @@
-{
- "count" : 1234,
- "name" : { "aka" : "T.E.S.T.", "id" : 123987 },
- "attribute" : [
- "random",
- "short",
- "bold",
- 12,
- { "height" : 7, "width" : 64 }
- ],
- "test": { "1" :
- { "2" :
- { "3" : { "coord" : [ 1,2] }
- }
- }
- }
-}
+{
+ "count" : 1234,
+ "name" : { "aka" : "T.E.S.T.", "id" : 123987 },
+ "attribute" : [
+ "random",
+ "short",
+ "bold",
+ 12,
+ { "height" : 7, "width" : 64 }
+ ],
+ "test": { "1" :
+ { "2" :
+ { "3" : { "coord" : [ 1,2] }
+ }
+ }
+ }
+}
diff --git a/test/test_integer_01.expected b/test/test_integer_01.expected
index 24aa29e..593f1db 100644
--- a/test/test_integer_01.expected
+++ b/test/test_integer_01.expected
@@ -1 +1 @@
-.=2147483647
+.=2147483647
diff --git a/test/test_integer_01.json b/test/test_integer_01.json
index e82c7ad..5ab12ff 100644
--- a/test/test_integer_01.json
+++ b/test/test_integer_01.json
@@ -1,2 +1,2 @@
-// Max signed integer
-2147483647
+// Max signed integer
+2147483647
diff --git a/test/test_integer_02.expected b/test/test_integer_02.expected
index dab99eb..4b83bd7 100644
--- a/test/test_integer_02.expected
+++ b/test/test_integer_02.expected
@@ -1 +1 @@
-.=-2147483648
+.=-2147483648
diff --git a/test/test_integer_02.json b/test/test_integer_02.json
index 548764e..056c850 100644
--- a/test/test_integer_02.json
+++ b/test/test_integer_02.json
@@ -1,2 +1,2 @@
-// Min signed integer
--2147483648
+// Min signed integer
+-2147483648
diff --git a/test/test_integer_03.expected b/test/test_integer_03.expected
index dde3260..37c1cb1 100644
--- a/test/test_integer_03.expected
+++ b/test/test_integer_03.expected
@@ -1 +1 @@
-.=4294967295
+.=4294967295
diff --git a/test/test_integer_03.json b/test/test_integer_03.json
index 18aeaf6..12ef3fb 100644
--- a/test/test_integer_03.json
+++ b/test/test_integer_03.json
@@ -1,2 +1,2 @@
-// Max unsigned integer
-4294967295
+// Max unsigned integer
+4294967295
diff --git a/test/test_integer_04.expected b/test/test_integer_04.expected
index 8da9013..b7b548e 100644
--- a/test/test_integer_04.expected
+++ b/test/test_integer_04.expected
@@ -1,2 +1,2 @@
-.=0
-
+.=0
+
diff --git a/test/test_integer_04.json b/test/test_integer_04.json
index 8202483..bf81499 100644
--- a/test/test_integer_04.json
+++ b/test/test_integer_04.json
@@ -1,3 +1,3 @@
-// Min unsigned integer
-0
-
+// Min unsigned integer
+0
+
diff --git a/test/test_integer_05.expected b/test/test_integer_05.expected
index 238d1d6..0caea9d 100644
--- a/test/test_integer_05.expected
+++ b/test/test_integer_05.expected
@@ -1,2 +1,2 @@
-.=1
-
+.=1
+
diff --git a/test/test_integer_05.json b/test/test_integer_05.json
index 4797790..d474e1b 100644
--- a/test/test_integer_05.json
+++ b/test/test_integer_05.json
@@ -1,2 +1,2 @@
-1
-
+1
+
diff --git a/test/test_object_01.expected b/test/test_object_01.expected
index 8e0634e..67444e5 100644
--- a/test/test_object_01.expected
+++ b/test/test_object_01.expected
@@ -1 +1 @@
-.={}
+.={}
diff --git a/test/test_object_01.json b/test/test_object_01.json
index 69a88e3..0967ef4 100644
--- a/test/test_object_01.json
+++ b/test/test_object_01.json
@@ -1 +1 @@
-{}
+{}
diff --git a/test/test_object_02.expected b/test/test_object_02.expected
index 2c9de06..79391c2 100644
--- a/test/test_object_02.expected
+++ b/test/test_object_02.expected
@@ -1,2 +1,2 @@
-.={}
-.count=1234
+.={}
+.count=1234
diff --git a/test/test_object_02.json b/test/test_object_02.json
index bd157ec..d0f2fac 100644
--- a/test/test_object_02.json
+++ b/test/test_object_02.json
@@ -1 +1 @@
-{ "count" : 1234 }
+{ "count" : 1234 }
diff --git a/test/test_object_03.expected b/test/test_object_03.expected
index 235a28e..5e96113 100644
--- a/test/test_object_03.expected
+++ b/test/test_object_03.expected
@@ -1,4 +1,4 @@
-.={}
-.attribute="random"
-.count=1234
-.name="test"
+.={}
+.attribute="random"
+.count=1234
+.name="test"
diff --git a/test/test_object_03.json b/test/test_object_03.json
index 0947a44..4fcd4d8 100644
--- a/test/test_object_03.json
+++ b/test/test_object_03.json
@@ -1,5 +1,5 @@
-{
- "count" : 1234,
- "name" : "test",
- "attribute" : "random"
-}
+{
+ "count" : 1234,
+ "name" : "test",
+ "attribute" : "random"
+}
diff --git a/test/test_object_04.expected b/test/test_object_04.expected
index cf4d7c3..812965b 100644
--- a/test/test_object_04.expected
+++ b/test/test_object_04.expected
@@ -1,2 +1,2 @@
-.={}
-.=1234
+.={}
+.=1234
diff --git a/test/test_object_04.json b/test/test_object_04.json
index f1e364a..450762d 100644
--- a/test/test_object_04.json
+++ b/test/test_object_04.json
@@ -1,3 +1,3 @@
-{
- "" : 1234
-}
+{
+ "" : 1234
+}
diff --git a/test/test_preserve_comment_01.expected b/test/test_preserve_comment_01.expected
index b5616a9..8d88041 100644
--- a/test/test_preserve_comment_01.expected
+++ b/test/test_preserve_comment_01.expected
@@ -1,3 +1,3 @@
-.={}
-.first=1
-.second=2
+.={}
+.first=1
+.second=2
diff --git a/test/test_preserve_comment_01.json b/test/test_preserve_comment_01.json
index 0291fff..fabd55d 100644
--- a/test/test_preserve_comment_01.json
+++ b/test/test_preserve_comment_01.json
@@ -1,14 +1,14 @@
-/* A comment
- at the beginning of the file.
- */
-{
- "first" : 1, // comment after 'first' on the same line
-
-/* Comment before 'second'
- */
- "second" : 2
-}
-
-/* A comment at
- the end of the file.
- */
+/* A comment
+ at the beginning of the file.
+ */
+{
+ "first" : 1, // comment after 'first' on the same line
+
+/* Comment before 'second'
+ */
+ "second" : 2
+}
+
+/* A comment at
+ the end of the file.
+ */
diff --git a/test/test_real_01.expected b/test/test_real_01.expected
index 57dee39..ae23572 100644
--- a/test/test_real_01.expected
+++ b/test/test_real_01.expected
@@ -1,2 +1,2 @@
-.=8589934592
-
+.=8589934592
+
diff --git a/test/test_real_01.json b/test/test_real_01.json
index 5cb1bbf..358452d 100644
--- a/test/test_real_01.json
+++ b/test/test_real_01.json
@@ -1,3 +1,3 @@
-// 2^33 => out of integer range, switch to double
-8589934592
-
+// 2^33 => out of integer range, switch to double
+8589934592
+
diff --git a/test/test_real_02.expected b/test/test_real_02.expected
index 181592a..df8de42 100644
--- a/test/test_real_02.expected
+++ b/test/test_real_02.expected
@@ -1,2 +1,2 @@
-.=-4294967295
-
+.=-4294967295
+
diff --git a/test/test_real_02.json b/test/test_real_02.json
index 45092ef..936c706 100644
--- a/test/test_real_02.json
+++ b/test/test_real_02.json
@@ -1,3 +1,3 @@
-// -2^32 => out of signed integer range, switch to double
--4294967295
-
+// -2^32 => out of signed integer range, switch to double
+-4294967295
+
diff --git a/test/test_real_03.expected b/test/test_real_03.expected
index 181592a..df8de42 100644
--- a/test/test_real_03.expected
+++ b/test/test_real_03.expected
@@ -1,2 +1,2 @@
-.=-4294967295
-
+.=-4294967295
+
diff --git a/test/test_real_03.json b/test/test_real_03.json
index 45092ef..936c706 100644
--- a/test/test_real_03.json
+++ b/test/test_real_03.json
@@ -1,3 +1,3 @@
-// -2^32 => out of signed integer range, switch to double
--4294967295
-
+// -2^32 => out of signed integer range, switch to double
+-4294967295
+
diff --git a/test/test_real_04.expected b/test/test_real_04.expected
index 2f84bf1..d726abe 100644
--- a/test/test_real_04.expected
+++ b/test/test_real_04.expected
@@ -1,2 +1,2 @@
-.=1.2345678
-
+.=1.2345678
+
diff --git a/test/test_real_04.json b/test/test_real_04.json
index 7e71794..a8eb6d0 100644
--- a/test/test_real_04.json
+++ b/test/test_real_04.json
@@ -1,3 +1,3 @@
-// 1.2345678
-12345678e-7
-
+// 1.2345678
+12345678e-7
+
diff --git a/test/test_real_05.expected b/test/test_real_05.expected
index 168f6e8..949fd8f 100644
--- a/test/test_real_05.expected
+++ b/test/test_real_05.expected
@@ -1,3 +1,3 @@
-.=1234567.8
-
-
+.=1234567.8
+
+
diff --git a/test/test_real_05.json b/test/test_real_05.json
index 950f6a7..f7923ba 100644
--- a/test/test_real_05.json
+++ b/test/test_real_05.json
@@ -1,3 +1,3 @@
-// 1234567.8
-0.12345678e7
-
+// 1234567.8
+0.12345678e7
+
diff --git a/test/test_real_06.expected b/test/test_real_06.expected
index 45906e3..03b7d7f 100644
--- a/test/test_real_06.expected
+++ b/test/test_real_06.expected
@@ -1,3 +1,3 @@
-.=-1.2345678
-
-
+.=-1.2345678
+
+
diff --git a/test/test_real_06.json b/test/test_real_06.json
index dde1916..485419a 100644
--- a/test/test_real_06.json
+++ b/test/test_real_06.json
@@ -1,3 +1,3 @@
-// -1.2345678
--12345678e-7
-
+// -1.2345678
+-12345678e-7
+
diff --git a/test/test_real_07.expected b/test/test_real_07.expected
index f2922f9..12025a4 100644
--- a/test/test_real_07.expected
+++ b/test/test_real_07.expected
@@ -1,3 +1,3 @@
-.=-1234567.8
-
-
+.=-1234567.8
+
+
diff --git a/test/test_real_07.json b/test/test_real_07.json
index dd43ba7..8013eb5 100644
--- a/test/test_real_07.json
+++ b/test/test_real_07.json
@@ -1,3 +1,3 @@
-// -1234567.8
--0.12345678e7
-
+// -1234567.8
+-0.12345678e7
+