From: jk7744.park Date: Sat, 24 Oct 2015 07:05:46 +0000 (+0900) Subject: tizen 2.4 release X-Git-Tag: accepted/tizen/2.4/mobile/20151029.040037^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=696782dc68426dbdc49de5638df574a384742533;p=external%2Flibjson-glib.git tizen 2.4 release --- diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index fcdfa46..0485d11 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1,76 @@ -build_log -*.log -*.pyc -usr -opt -*.o -*.os -*.exe -packages -binaries -*.ipk -*~ -*.lo +ABOUT-NLS +INSTALL Makefile -*.la -build-stamp +Makefile.in +aclocal.m4 +autom4te.cache +/build/autotools/*.m4 +!/build/autotools/as-compiler-flag.m4 +!/build/autotools/introspection.m4 +!/build/autotools/Makefile.am.* +/build/test-driver +compile +configure +config.guess config.h +config.h.in +config.h.in~ +config.log +config.rpath config.status -debian/files -debian/libjson-glib-dev.install -debian/libjson-glib-dev.substvars -debian/libjson-glib-dev/ -debian/libjson-glib.install -debian/libjson-glib.postinst.debhelper -debian/libjson-glib.postrm.debhelper -debian/libjson-glib.substvars -debian/libjson-glib/ -doc/reference/version.xml +config.sub +depcomp +/doc/reference/version.xml +/doc/reference/json-glib-format.1 +/doc/reference/json-glib-validate.1 +gtk-doc.make +install-sh json-glib-1.0.pc json-glib.pc -json-glib/.deps/ -json-glib/.libs/ -json-glib/json-enum-types.c -json-glib/json-enum-types.h -json-glib/json-marshal.c -json-glib/json-marshal.h -json-glib/json-version.h -json-glib/stamp-enum-types -json-glib/stamp-marshal -json-glib/tests/.deps/ -json-glib/tests/.libs/ -json-glib/tests/array-test -json-glib/tests/node-test -json-glib/tests/object-test +/json-lcov.info +/json-lcov +.deps +.libs +*.o +*.lo +*.test +/json-glib/json-enum-types.[ch] +/json-glib/json-glib-format +/json-glib/json-glib-validate +/json-glib/json-marshal.[ch] +/json-glib/json-version.h +/json-glib/Json-1.0.gir +/json-glib/Json-1.0.typelib +/json-glib/*.la +/json-glib/gcov-report.txt +/json-glib/stamp-enum-types +/json-glib/stamp-marshal +/json-glib/test-suite.log +/json-glib/abicheck.sh.* libtool +ltmain.sh +missing stamp-h1 -tests/.deps/ -tests/.libs/ -tests/test-generator -tests/test-parser -tests/test-serialize-boxed -tests/test-serialize-complex -tests/test-serialize-full -tests/test-serialize-simple +test-report.xml +test-report.html +.*.swp +*.stamp +/doc/reference/html +/doc/reference/tmpl +/doc/reference/xml +/doc/reference/json-glib-decl-list.txt +/doc/reference/json-glib-decl-list.txt.bak +/doc/reference/json-glib-decl.txt +/doc/reference/json-glib-decl.txt.bak +/doc/reference/json-glib-overrides.txt +/doc/reference/json-glib-undeclared.txt +/doc/reference/json-glib-undocumented.txt +/doc/reference/json-glib-unused.txt +/doc/reference/json-glib.args +/doc/reference/json-glib.hierarchy +/doc/reference/json-glib.interfaces +/doc/reference/json-glib.prerequisites +/doc/reference/json-glib.signals +omf.make +xmldocs.make +*.gcov diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 6b0e47a..0000000 --- a/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Emmanuele Bassi diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index c1ae693..0000000 --- a/ChangeLog +++ /dev/null @@ -1,4865 +0,0 @@ -commit 8935b7db1f25818eff3bb16cbe2b8b2981d4e195 -Author: Emmanuele Bassi -Date: Fri Mar 19 17:04:54 2010 +0000 - - Release 0.10.4 - - NEWS | 7 +++++++ - configure.ac | 2 +- - 2 files changed, 8 insertions(+), 1 deletions(-) - -commit a3ac934acabe0bf5e03dc5c22c51f0bd8fa056c2 -Author: Emmanuele Bassi -Date: Fri Mar 19 16:59:57 2010 +0000 - - parser: Refactor the JsonParser logic - - The array and object parsing logic in JsonParser has clearly exploded - beyond control: a simple tightening of the JSON validation almost broke - the parser in two. It it is time to... - - - - REFACTOR THE CODE! - - - - This time, we should be following the JSON state machine and try to do - more prediction of the next state based on peeking the next token. - - The code is fairly cleaner, now; and, most of all, still passes the - validation test suite - which is, you know... nice. - - (cherry picked from commit 08cec3b7c9202007a5abbf548f8d2f1b54d4d0b4) - - Signed-off-by: Emmanuele Bassi - - json-glib/json-parser.c | 467 ++++++++++++++++++----------------------------- - 1 files changed, 179 insertions(+), 288 deletions(-) - -commit e2e4c60f9f1b5302f23f08fea9e3882ea5135406 -Author: Emmanuele Bassi -Date: Thu Mar 18 22:41:14 2010 +0000 - - JSON-GLib bug tracking system has been moved - - We are now using bugzilla.gnome.org, since we're already hosted on - git.gnome.org. - (cherry picked from commit 9d7c58b4fb5edeb8e9413acc9d509447e13962e5) - - Signed-off-by: Emmanuele Bassi - - README | 2 +- - configure.ac | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 6b2d50001f2db526c5108a764693a632573c51a0 -Author: Emmanuele Bassi -Date: Thu Mar 18 17:05:57 2010 +0000 - - generator: Use %g format for g_ascii_formatd() - - I should read the documentation for the functions I use: - - Converts a gdouble to a string, using the '.' as decimal point. To - format the number you pass in a printf()-style format string. Allowed - conversion specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. - -- from g_ascii_formatd() in GLib's API reference - - Epic reading fail. - (cherry picked from commit f622ee8d8ba54ddea6fbb7311a905ffab7842e8d) - - Signed-off-by: Emmanuele Bassi - - json-glib/json-generator.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 7ced197c050f56c2555b9190d648f22e337209b8 -Author: Emmanuele Bassi -Date: Fri Mar 5 19:23:49 2010 +0000 - - tests: Add another trailing comma invalid test - (cherry picked from commit 88ac0d5111eb528e4c396e4c169ceee4fb046e62) - - Signed-off-by: Emmanuele Bassi - - tests/test-parser.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -commit 3c239e0d75a7246a2a3f75358ad662cefdb0960d -Author: Emmanuele Bassi -Date: Mon Mar 1 17:42:41 2010 +0000 - - tests: Add negative tests - - Verify that invalid JSON will trigger a parser error. - (cherry picked from commit c22c1151e418af9506547804d4bc9fddb60bc0f1) - - Signed-off-by: Emmanuele Bassi - - tests/test-parser.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 53 insertions(+), 0 deletions(-) - -commit 29881f03468db08bfb404cfcd5b61b4cdc419a87 -Author: Emmanuele Bassi -Date: Mon Mar 1 17:41:14 2010 +0000 - - parser: Improve strictness - - Apparently, some breakage crept in JsonParser which allowed invalid JSON - to actually pass. For instance: trailing and missing commas, invalid - barewords and wrong array and object closing braces. - (cherry picked from commit 26668fe238a52a7fd8374f409fc277aaa8efa826) - - Signed-off-by: Emmanuele Bassi - - json-glib/json-parser.c | 117 +++++++++++++++++++++++++++++++---------------- - 1 files changed, 78 insertions(+), 39 deletions(-) - -commit 84b68de38bab2d4537a6eb77c8df2a1288cef8ca -Author: Emmanuele Bassi -Date: Fri Feb 26 14:07:47 2010 +0000 - - Post-release version bump to 0.10.3 - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 755592e2c9e7e9cafbdf2b349a0df41dfeae83aa -Author: Emmanuele Bassi -Date: Fri Feb 26 14:04:12 2010 +0000 - - Release 0.10.2 (stable snapshot) - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 382159118096b899b10411c8b37dbc743702e205 -Author: Emmanuele Bassi -Date: Fri Feb 26 14:03:59 2010 +0000 - - Update NEWS file - - NEWS | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit a5d9c7bd125571c877f1f7b76f92412b37fc4ce4 -Author: Emmanuele Bassi -Date: Sun Jan 24 18:58:28 2010 +0000 - - docs: Fix the GBoxed registration example - - The registration function for serialization and deserialization has been - replaced by two separate functions before releasing 0.10, but I forgot to - update the example in the documentation. - (cherry picked from commit ea666891cb1e6fc9e527ce6c93a306bc97145f16) - - json-glib/json-gboxed.c | 11 ++++++----- - 1 files changed, 6 insertions(+), 5 deletions(-) - -commit 1ce1d549477b79e7d94fb891f323afbdb8a8d4ce -Author: Emmanuele Bassi -Date: Sun Jan 10 09:59:14 2010 +0000 - - Initialize every member of JsonObject on construction - - We create JsonObject structures using g_slice_new(), so we need to - initialize every member of the structure ourselves. - (cherry picked from commit c09c2dc1c54c83fea4ef93486081fe3fab35452c) - - json-glib/json-object.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit dae32677d140a3ba6a15e1198b53ea0b3e1716b0 -Author: Emmanuele Bassi -Date: Tue Dec 29 15:35:21 2009 +0000 - - Post-release version bump to 0.10.1 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 5aff66e8fae3e28c9cb6b74696170154eed303a7 -Author: Emmanuele Bassi -Date: Tue Dec 29 15:33:28 2009 +0000 - - Release 0.10.0 - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 7258a776ea90ea4b2dcc6f1e4e440bb09c581a12 -Author: Emmanuele Bassi -Date: Tue Dec 29 15:31:22 2009 +0000 - - build: Enable introspection when distchecking - - Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 80c5178127052e600146ca889500e263da4ebf10 -Author: Vincent Untz -Date: Sun Dec 27 02:09:44 2009 +0100 - - Initialize out variables before using them - - Here's a small patch for json-glib, to fix some gcc warnings breaking - the build with -Werror (gcc can't know if the variable will get - initialized or not). I didn't find a product for json-glib in bugzilla, - but I guess a mail will work ;-) - - Happy holidays :-) - - Signed-off-by: Emmanuele Bassi - - json-glib/json-gobject.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit e3a57eae397926ad23e216996eda164ed6c15c63 -Author: Emmanuele Bassi -Date: Sun Nov 29 12:50:58 2009 +0000 - - Post-release bump to 0.9.3 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 4477758b73a0712fdef5e7907f6b6f4e0878428e -Author: Emmanuele Bassi -Date: Sun Nov 29 12:34:41 2009 +0000 - - Release 0.9.2 (0.10.0-rc1) - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 654f99c6b0d771cc6b4c68790ab164b0f691307d -Author: Emmanuele Bassi -Date: Sun Nov 29 12:34:08 2009 +0000 - - Update NEWS - - NEWS | 15 +++++++++++++++ - 1 files changed, 15 insertions(+), 0 deletions(-) - -commit 307605046cf89ef922d1d1e7c7b95405f3ecfdfb -Author: Emmanuele Bassi -Date: Sun Nov 29 12:48:25 2009 +0000 - - docs: Fix annotation for json_gobject_to_data() - - json-glib/json-gobject.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit e7eb3ca4a9de1c7348dc82f528cf0858f52849dd -Author: Emmanuele Bassi -Date: Sun Nov 29 12:37:04 2009 +0000 - - docs: Add missing to/from_data methods - - doc/reference/json-glib-sections.txt | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 27bb2c060a7b2ecc4839719d39b2044efe4c3e7a -Author: Emmanuele Bassi -Date: Sun Nov 29 12:46:27 2009 +0000 - - docs: Add release notes to the README - - README | 12 ++++++++++-- - 1 files changed, 10 insertions(+), 2 deletions(-) - -commit 780d82310c47c3f07bcbaab2cefbea0d6decb899 -Author: Emmanuele Bassi -Date: Sun Nov 29 12:33:45 2009 +0000 - - docs: Update the README - - README | 27 ++++++++++++++++----------- - 1 files changed, 16 insertions(+), 11 deletions(-) - -commit d122f9b8c09ad7e82b1a70da5d65ebba2111e6cc -Author: Emmanuele Bassi -Date: Sun Nov 29 12:33:01 2009 +0000 - - build: Clean up the configure summary - - Make the output of the summary a little bit nicer. - - configure.ac | 27 ++++++++++++++++++++------- - 1 files changed, 20 insertions(+), 7 deletions(-) - -commit e4c4480036a82cc5177fc1f184c18019af0e805e -Author: Emmanuele Bassi -Date: Sun Nov 29 12:31:54 2009 +0000 - - build: Require G-I 0.6.4 - - We should require at least 0.6.4 for GObject-Introspection, since that - version allows us to pass the .la file to g-ir-scanner. - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 4445bdb04d5eebc145a1db82aa5b811e8d4ed048 -Author: Emmanuele Bassi -Date: Sat Nov 28 19:13:27 2009 +0000 - - docs: Fix argument name mismatch - - gtk-doc complains that the argument name in the header does not match - the one in the documentation annotation for the GBoxed deserialization - function registration. - - json-glib/json-gobject.h | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 793e827feaa9be3c4ffbe5c0425ac6bcc0c9e6d1 -Author: Emmanuele Bassi -Date: Sat Nov 28 19:06:36 2009 +0000 - - build: Clean up json-glib/Makefile.am rules - - json-glib/Makefile.am | 24 ++++-------------------- - 1 files changed, 4 insertions(+), 20 deletions(-) - -commit 97584658672fe4709fc7c3b24a44b477112322f7 -Author: Emmanuele Bassi -Date: Sat Nov 28 17:39:37 2009 +0000 - - build: Fix out-of-tree enum types file generation - - build/autotools/Makefile.am.enums | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 3cf919e9c7f3201305a1a63a3c270e422a37efed -Author: Emmanuele Bassi -Date: Mon Nov 23 22:20:58 2009 +0000 - - boxed: Split (de)serialization registration - - A GBoxed type defined as: - - struct Boxed { - int foo; - gboolean bar; - int baz; - }; - - Can be represented either by a JSON object: - - { - "foo" : 1, - "bar" : true, - "baz" : 3 - } - - Or by a JSON array: - - [ 1, true, 3 ] - - The current function for registering a serialization and a - deserialization pair does not allow registering more than one - deserialization function - which means that there can only be - one way to deserialize a GBoxed type into a specific JsonNode - type. - - To allow having more than one JsonNodeType associated to a - GBoxed type and a deserialization function we need to split out - the registration of the serialization and deserialization functions - into two distinct functions. - - doc/reference/json-glib-sections.txt | 3 +- - json-glib/json-gboxed.c | 115 ++++++++++++++++++++++------------ - json-glib/json-gobject.c | 4 +- - json-glib/json-gobject.h | 63 +++++++++--------- - tests/test-serialize-boxed.c | 7 +- - 5 files changed, 114 insertions(+), 78 deletions(-) - -commit 61d54cc9e2a3098e876e700a9248428f400a5368 -Author: Tristan Van Berkom -Date: Thu Nov 12 12:59:03 2009 +0000 - - serializable: Make Serializable in charge of parsing - - If a GObject class implements JsonSerializable and has overridden - the serialize_property() vfunc then the Serializable should be fully in - charge of serializing a property - that is: JSON-GLib should not try to - add a fallback in case the serialize_property() implementation returned - NULL. - - This is a change in semantics for JsonSerializable implementations. - - http://bugzilla.openedhand.com/show_bug.cgi?id=1859 - - Signed-off-by: Emmanuele Bassi - - json-glib/json-gobject.c | 7 +++++-- - 1 files changed, 5 insertions(+), 2 deletions(-) - -commit 63dc03da507a216c0764bc0e50fc62b2b77dc1b2 -Author: Emmanuele Bassi -Date: Thu Nov 12 12:38:29 2009 +0000 - - serializable: Add methods proxying default implementations - - If you want to use the default implementation of serialize_property() - and/or deserialize_property() from an object class implementing - JsonSerializable you currently have to peek the interface vtable and - then call the vfunc pointers. - - We can expose the default implementation through functions ourselves and - simplify the required code. - - doc/reference/json-glib-sections.txt | 4 ++ - json-glib/json-gobject.h | 28 +++++++--- - json-glib/json-serializable.c | 92 ++++++++++++++++++++++++++++++++++ - 3 files changed, 115 insertions(+), 9 deletions(-) - -commit 5f484d8c274a2b866f9a3d38eebe2baa1939b7ac -Author: Emmanuele Bassi -Date: Thu Nov 12 12:03:13 2009 +0000 - - gobject: Add deprecation annotations - - This makes it easier to detect when building without - JSON_DISABLE_DEPRECATED. - - json-glib/json-gobject.h | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 3c7811bf24d4b957da730949af6795b728db5bad -Author: Emmanuele Bassi -Date: Thu Nov 12 12:02:41 2009 +0000 - - build: Build without deprecations - - Make sure that JSON-GLib is built without using deprecated API. - - json-glib/Makefile.am | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 923311ee52b77f53c5c529e497ea2a24efaf23ea -Author: Emmanuele Bassi -Date: Thu Nov 12 12:01:04 2009 +0000 - - tests: Do not use deprecated API - - Tests should not be using API marked as deprecated. - - tests/Makefile.am | 2 +- - tests/test-serialize-boxed.c | 4 ++-- - tests/test-serialize-complex.c | 2 +- - tests/test-serialize-full.c | 2 +- - tests/test-serialize-simple.c | 2 +- - 5 files changed, 6 insertions(+), 6 deletions(-) - -commit e3ae84e743e1d1a1a0202e900f443e143cb77f45 -Author: Emmanuele Bassi -Date: Thu Nov 12 11:57:45 2009 +0000 - - tests: Verify Serializable::serialize_property() - - Verify that an object with a custom serialize_property() is effectively - what we expect it to be when it is parsed. - - tests/test-serialize-complex.c | 32 ++++++++++++++++++++++++++++++++ - 1 files changed, 32 insertions(+), 0 deletions(-) - -commit 7cebdd008a02e6cef0514f40327f94eba2a2088e -Author: Cornelius Hald -Date: Thu Nov 12 11:37:54 2009 +0000 - - Doubles are converted to strings containing commas - - Under some locales (e.g. de_DE) a double is converted to a string - containing a comma instead of a dot. That breaks the JSON syntax. - - Example: - Double: 0.34 is converted to 0,34 when using locale de_DE - - http://bugzilla.openedhand.com/show_bug.cgi?id=1826 - - Signed-off-by: Emmanuele Bassi - - json-glib/json-generator.c | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletions(-) - -commit 30d4efb775cb416212c00e3ececb0f0147739f40 -Author: Emmanuele Bassi -Date: Thu Nov 12 11:28:17 2009 +0000 - - Update Introspection annotations - - • Fix the transfer rules for JsonNode, JsonObject and JsonArray - getters. - - • Annotate the methods returning lists - - json-glib/json-array.c | 18 +++++++++--------- - json-glib/json-node.c | 15 ++++++++------- - json-glib/json-object.c | 25 +++++++++++++------------ - json-glib/json-parser.c | 5 +++-- - 4 files changed, 33 insertions(+), 30 deletions(-) - -commit 47cd2f678a8321faac0e2d00a3538181e7bc1cbf -Author: Emmanuele Bassi -Date: Thu Nov 12 11:27:36 2009 +0000 - - build: Add more flags to the maintainer cflags list - - configure.ac | 4 +++- - 1 files changed, 3 insertions(+), 1 deletions(-) - -commit ecc185d1c542f6ff41f84be026dc380f611a5d6e -Author: Emmanuele Bassi -Date: Thu Nov 12 10:09:17 2009 +0000 - - enum-types: Put back a missing static - - The GEnumValue array defining the enumeration type values must be - static, otherwise everything will crash when trying to retrieve the - enumeration data from the GEnumClass. - - json-glib/json-enum-types.c.in | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 84f5af58c23b174cc9708e81ce8ccbfffa6e68eb -Author: Emmanuele Bassi -Date: Fri Oct 30 10:46:32 2009 +0000 - - object: Return values list in insertion order - - Since we return the member names in insertion order, we should also - return the member values in the same order. - - This also allows us to get rid of the (yucky) internal copies of - g_hash_table_get_keys() and g_hash_table_get_values(), since we use - the hash table only for storage and lookup purposes. - - json-glib/json-object.c | 55 ++++++----------------------------------------- - 1 files changed, 7 insertions(+), 48 deletions(-) - -commit a25a1ded25e5d1f605cffd6da7a5e036151aa70c -Author: Mathias Hasselmann -Date: Thu Oct 29 14:01:04 2009 +0000 - - tests: Verify parsing bare values - - http://bugzilla.openedhand.com/show_bug.cgi?id=1856 - - Signed-off-by: Emmanuele Bassi - - tests/test-parser.c | 38 +++++++++++++++++++++++++++++++++----- - 1 files changed, 33 insertions(+), 5 deletions(-) - -commit 026ea0357fbe95e2acd43555e3b5d00e329c9740 -Author: Emmanuele Bassi -Date: Thu Oct 29 13:59:44 2009 +0000 - - parser: Advance when parsing bare values - - A missing get_next_token() prevents getting the contents of - the tokenizer in order to place them into the JsonNode. - - json-glib/json-parser.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 578111be53065a2bbeda73865bfa4e178f185649 -Author: Emmanuele Bassi -Date: Wed Oct 28 16:54:34 2009 +0000 - - introspection: Fix the GIR generation - - The rule for creating the JSON-GLib GIR file should use the - json-glib.la shared object, to avoid using the installed - copy of JSON-GLib when compiling the typelib. - - The include file for JSON-GLib is json-glib/json-gobject.h as - well: json-glib/json-object.h does not exist. - - json-glib/Makefile.am | 11 ++++++++--- - 1 files changed, 8 insertions(+), 3 deletions(-) - -commit 8f8ce87730fc0bf102a707e84c4f6106b215cfab -Author: Emmanuele Bassi -Date: Wed Oct 28 16:23:39 2009 +0000 - - gobject: Use from/to data naming convention - - Be more GLib-like, and use - - __from_data() - __to_data() - - Instead of the homebrew "construct" and "serialize", when dealing - with string buffers. - - This means: - - • adding json_gobject_from_data() to deprecate - json_construct_gobject() - • adding json_gobject_to_data() to deprecate - json_serialize_gobject() - - The json_construct_gobject() function also contains a mistake: it - uses gsize with the special value of -1 meaning "slurp the whole - string", but gsize is an unsigned type. The newly added - json_gobject_from_data() correctly uses gssize instead. - - json-glib/json-gobject.c | 63 +++++++++++++++++++++++++++++++++++++++++++--- - json-glib/json-gobject.h | 10 +++++++ - 2 files changed, 69 insertions(+), 4 deletions(-) - -commit 00b4d200849e232cd904d23d3593d6f95252b483 -Author: Emmanuele Bassi -Date: Wed Oct 28 16:05:19 2009 +0000 - - gobject: Uniform JSON<->GObject mapping code - - Rename json_gobject_new() to json_gobject_deserialize(), and - json_gobject_dump() to json_gobject_serialize(); this maps the - JSON GBoxed API. - - Also for consistency, change the serialize() return value and - the deserialize() argument to be JsonNodes of type JSON_NODE_OBJECT. - - doc/reference/json-glib-sections.txt | 4 +- - json-glib/json-gobject.c | 82 ++++++++++++++++++++++------------ - json-glib/json-gobject.h | 10 ++-- - 3 files changed, 61 insertions(+), 35 deletions(-) - -commit fc0607c740b153acc96e4df12a12b042e08e831b -Author: Emmanuele Bassi -Date: Wed Oct 28 12:01:21 2009 +0000 - - docs: Add long descriptions - - The json-boxed and json-serializable sections are missing the - long description for the API reference. - - json-glib/json-gboxed.c | 49 +++++++++++++++++++++++++++++++++++++--- - json-glib/json-serializable.c | 5 +++- - 2 files changed, 49 insertions(+), 5 deletions(-) - -commit 498827110f3d635e545c7351732551676a06a1bf -Author: Emmanuele Bassi -Date: Wed Oct 28 10:07:39 2009 +0000 - - docs: Add the 0.10 symbols index - - doc/reference/json-glib-docs.xml | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit 0979bbceb654c5e4b5dadf1e6f7e85bb9df87ca5 -Author: Emmanuele Bassi -Date: Tue Oct 27 20:58:08 2009 +0000 - - docs: Split out GObject-related sections - - Like commit c176f70e593c9cfb4901cd9f27ce54b8aa7152f2 did for the - source code, the documentation should be split three-ways: - - • GObject-related API - • JsonSerializable - • GBoxed-related API - - doc/reference/Makefile.am | 15 +++++++-------- - doc/reference/json-glib-docs.xml | 2 ++ - doc/reference/json-glib-sections.txt | 33 +++++++++++++++++++++++++++------ - 3 files changed, 36 insertions(+), 14 deletions(-) - -commit 2f56ba9021ec4fe1574630404d6b24e4813cf1eb -Author: Emmanuele Bassi -Date: Tue Oct 27 20:57:52 2009 +0000 - - docs: Documentation fixes for gtk-doc - - json-glib/json-gboxed.c | 8 +++++--- - 1 files changed, 5 insertions(+), 3 deletions(-) - -commit c176f70e593c9cfb4901cd9f27ce54b8aa7152f2 -Author: Emmanuele Bassi -Date: Tue Oct 27 20:49:09 2009 +0000 - - build: Split out GBoxed and Serializable - - The json-gobject.c is getting pretty crowded; we should split out - the JsonBoxed API and the JsonSerialized implementation into their - separate source files. - - json-glib/Makefile.am | 4 + - json-glib/json-gboxed.c | 275 ++++++++++++++++++++++++++++ - json-glib/json-gobject-private.h | 39 ++++ - json-glib/json-gobject.c | 371 +------------------------------------- - json-glib/json-serializable.c | 154 ++++++++++++++++ - 5 files changed, 476 insertions(+), 367 deletions(-) - -commit 373fa3d9b73391b38620fbd9ce9b69f358e5f4c8 -Author: Emmanuele Bassi -Date: Tue Oct 27 18:10:19 2009 +0000 - - gobject: Make GObject<->JsonObject functions public - - The functions mapping a GObject to and from a JsonObject should - be public, as they can be used by parsers. - - json-glib/json-gobject.c | 30 ++++++++++++++++++++++++++++-- - json-glib/json-gobject.h | 16 ++++++++++------ - 2 files changed, 38 insertions(+), 8 deletions(-) - -commit 85f7a8e8206168d95b3ef9c02aa584f0fae5b37e -Author: Emmanuele Bassi -Date: Tue Oct 27 18:03:11 2009 +0000 - - gobject: Reuse the list data - - Since we ignore all members that don't have a corresponding - GParamSpec for the class we cannot use: - - members = g_list_prepend (members, pspec->name); - - Because pspec might also be NULL. We can reuse the GList iterator - data field, since that points to data internal to the JsonObject - we are iterating over. - - json-glib/json-gobject.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit ff986ee5b8df45255f4f5ab01be0bbad893bc55e -Author: Emmanuele Bassi -Date: Tue Oct 27 17:53:34 2009 +0000 - - gobject: Add experimental GBoxed<->JSON transformation - - Serializing and deserializing GBoxed types is fairly complicated - currently. If a GObject implements JsonSerializable it is possible - for the class to intercept the JsonNode, parse it manually and - then set the value to the property. - - This leaves a hole opened for: - - • manual (de)serialization of GBoxed types - • (de)serialization of GBoxed properties in classes not - implementing JsonSerializable - - In order to serialize and deserialize a GBoxed JSON-GLib should - provide a mechanism similar to the GValue transformation functions: - when registering the boxed type the developer should also be able - to register a serialization and a deserialization functions pair - matching the tuple: - - (GBoxed type, JSON type) - - The serialization function would be: - - JsonNode *(* JsonBoxedSerializeFunc) (gconstpointer boxed); - - And, conversely, the deserialization function would be: - - gpointer (* JsonBoxedDeserializeFunc) (JsonNode *node); - - Obviously, the whole machinery works only for GBoxed types that - register the serialization and deserialization functions. - - .gitignore | 68 ++++++----- - json-glib/json-gobject.c | 264 +++++++++++++++++++++++++++++++++++++++++- - json-glib/json-gobject.h | 37 ++++++ - tests/Makefile.am | 8 +- - tests/test-serialize-boxed.c | 263 +++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 602 insertions(+), 38 deletions(-) - -commit 7f6a73a0964b66b15e8b5a9858b9bc76b010f67b -Author: Emmanuele Bassi -Date: Tue Oct 27 17:43:38 2009 +0000 - - node: Add a private NodeType-to-string converter - - Useful for debugging and logging purposes. - - json-glib/json-node.c | 23 ++++++++++++++++++++++- - json-glib/json-types-private.h | 2 ++ - 2 files changed, 24 insertions(+), 1 deletions(-) - -commit 3f8990f7a4c362590f19e427aae2f68f27303fe6 -Author: Emmanuele Bassi -Date: Tue Oct 27 17:42:14 2009 +0000 - - Remove a stray ';' that broke deserializing GStrv - - The stray semicolon was preventing the GPtrArray from being - updated. - - json-glib/json-gobject.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 8e550ac4dbb5500a40c7adad88868ede40397db7 -Author: Emmanuele Bassi -Date: Tue Oct 27 17:41:38 2009 +0000 - - Fix compiler warnings (remove unused variables) - - json-glib/json-gobject.c | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -commit 3b994a52d9c34f67e4ac52aa4bb0c380789fbd60 -Author: Emmanuele Bassi -Date: Tue Oct 27 17:40:55 2009 +0000 - - build: Export MAINTAINER_CFLAGS - - Apparently, the MAINTAINER_CFLAGS were ignored. - - configure.ac | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 0810711a7fbb915ba9397a66e77babb30765d090 -Author: Emmanuele Bassi -Date: Tue Oct 27 17:40:23 2009 +0000 - - build: Use AM_PROG_CC_C_O - - Use the Automake macro to enable per-target compiler flags. - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit d664f886372afbe1d54e633240e7b7e06ebc45c8 -Author: Emmanuele Bassi -Date: Tue Oct 27 17:40:03 2009 +0000 - - Fix compiler warnings (remove unused variables) - - tests/test-generator.c | 4 ++-- - tests/test-serialize-full.c | 1 - - 2 files changed, 2 insertions(+), 3 deletions(-) - -commit 83dea3b3dd2281dca206e0873b5fed0a2a3d50de -Author: Emmanuele Bassi -Date: Tue Oct 27 14:01:24 2009 +0000 - - gobject: Support constructor properties - - The GObject deserialization code currently skips all the constructor - and constructor-only properties. In order to implement them we can - add a preliminary pass on the JSON object members and build a - GParameter array. - - As we don't have a GObject instance we cannot really use the - Serializable interface to provide custom parsing for complex data - structures, thus we fall back to the default deserialization code - path. - - json-glib/json-gobject.c | 98 ++++++++++++++++++++++++++++++++++++++----- - tests/test-serialize-full.c | 11 +++-- - 2 files changed, 93 insertions(+), 16 deletions(-) - -commit 2616938c7c042fced9be197205a535a8b420534e -Author: Emmanuele Bassi -Date: Tue Oct 27 11:57:38 2009 +0000 - - build: Clean up the build environment - - Some of the rules can be moved into their own files to be included - when needed, like: - - • silent rules (QUIET_*) - • glib-mkenums rules - • glib-genmarshal rules - - Also, the test suite rules should be moved from the top-level of - the project into the build/autotools directory and then included - only where it makes sense. - - This requires changing most of the build system to use the new - files layout. - - .gitignore | 4 +- - Makefile.am | 5 +- - Makefile.decl | 61 ------------------------ - build/Makefile.am | 12 ++++- - build/autotools/Makefile.am | 21 +++++++-- - build/autotools/Makefile.am.enums | 43 +++++++++++++++++ - build/autotools/Makefile.am.gtest | 61 ++++++++++++++++++++++++ - build/autotools/Makefile.am.marshal | 45 ++++++++++++++++++ - build/autotools/Makefile.am.silent | 17 +++++++ - doc/Makefile.am | 12 ++++- - doc/reference/Makefile.am | 5 +- - json-glib/Makefile.am | 88 +++++++++++------------------------ - json-glib/tests/Makefile.am | 12 +++-- - tests/Makefile.am | 15 ++---- - 14 files changed, 252 insertions(+), 149 deletions(-) - -commit 5406301b0e3bf74c0d7ae47a618c416d5c6dc29d -Author: Emmanuele Bassi -Date: Tue Oct 27 11:30:55 2009 +0000 - - gobject: Serialize properties holding a GObject - - Like we deserialize them, we can serialize GObject properties - defined using GParamSpecObject. - - json-glib/json-gobject.c | 14 ++++++++++++++ - 1 files changed, 14 insertions(+), 0 deletions(-) - -commit 3a2176ebf96b33716d1b50068ca44b1d3cd9b0c8 -Author: Emmanuele Bassi -Date: Tue Oct 27 11:29:32 2009 +0000 - - tests: Use properties to change values - - The values inside _init() should match the default values of the - properties as specified by the GParamSpec. If we want to verify - a non-default value we should specify the value when instantiating - the object. - - tests/test-serialize-simple.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 1ff48cdc5d773925bda1ddf8bc904a9ea6a5e643 -Author: Emmanuele Bassi -Date: Tue Oct 27 11:18:51 2009 +0000 - - gobject: Split GObject serialization code - - Like for the deserialization of a GObject into a JsonObject we - should split out the serialization of a GObject into a JsonObject - part of json_serialize_gobject() into its own private function. - - json-glib/json-gobject.c | 113 +++++++++++++++++++++++++--------------------- - 1 files changed, 61 insertions(+), 52 deletions(-) - -commit 27afed8dc89bf9562c3536f0a053d250e70eea4d -Author: Emmanuele Bassi -Date: Tue Oct 27 10:30:27 2009 +0000 - - gobject: Recurse in GParamSpecObject properties - - Use the newly added json_gobject_new() internal function to - recurse into properties defined using GParamSpecObject. - - The same rules used by json_construct_gobject() apply to the - properties storing a GObject - including JsonSerializable - support. - - The test case for serialization and deserialization of a - GObject has been updated to include a property holding a - GObject. - - json-glib/json-gobject.c | 14 +++++++++- - tests/test-serialize-full.c | 58 +++++++++++++++++++++++++++++++++++++----- - 2 files changed, 64 insertions(+), 8 deletions(-) - -commit 317447b52455c56b0123168ab127ce026d7d0c22 -Author: Emmanuele Bassi -Date: Tue Oct 27 10:20:42 2009 +0000 - - gobject: Split JSON to GObject code - - If we want to be able to parse a GParamSpecObject property - we need to use the same code as json_construct_gobject(), minus - the parsing. - - json-glib/json-gobject.c | 152 +++++++++++++++++++++++++--------------------- - 1 files changed, 83 insertions(+), 69 deletions(-) - -commit cba7db96581343e3cbd8e5eb067026efb8cac24e -Author: Emmanuele Bassi -Date: Mon Oct 26 22:36:01 2009 +0000 - - object: Guarantee insertion order - - When iterating over the members of a JsonObject, or when retrieving - the list of members, the insertion order should be preserved by the - JsonObject. This is simply implemented by keeping a mirror list of - the member names. - - Apparently, though JSON does not guarantee any ordering, it is somewhat - expected by JSON (and ECMAScript) users. - - json-glib/json-object.c | 67 +++++++++++++++++++++------------------- - json-glib/json-types-private.h | 3 ++ - tests/test-generator.c | 3 +- - 3 files changed, 40 insertions(+), 33 deletions(-) - -commit d5bebce0286aef5c4b4110c16c22a8ef3dc38405 -Author: Emmanuele Bassi -Date: Mon Sep 28 18:15:48 2009 +0100 - - [node] Add HOLDS macros for quick type checking - - JsonNode should mimick GValue's API and have macros for easy type checking - - doc/reference/json-glib-sections.txt | 7 ++++- - json-glib/json-types.h | 51 ++++++++++++++++++++++++++++++++++ - json-glib/tests/node-test.c | 2 +- - 3 files changed, 58 insertions(+), 2 deletions(-) - -commit 17fc731ed54b754285bac76c7ac23eac6b96bf24 -Author: Emmanuele Bassi -Date: Mon Sep 28 14:02:14 2009 +0100 - - [tests] Add a test case for Object members with empty strings - - Both the Object API and the Parser should not choke on members with - empty strings as their value. The Object should just have a member - associated with a JSON_NODE_VALUE node type and an empty string as - the contents. - - json-glib/tests/object-test.c | 13 +++++++++++++ - tests/test-parser.c | 1 + - 2 files changed, 14 insertions(+), 0 deletions(-) - -commit 5181bf24bf3cde743de590ab3ffa0471df9e4799 -Author: Emmanuele Bassi -Date: Tue Sep 22 15:42:34 2009 +0100 - - Post-branch bump to 0.9.1 - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 3f83767109979c660469b3b5862fbd04469a8011 -Author: Emmanuele Bassi -Date: Tue Sep 22 15:39:46 2009 +0100 - - [release] 0.8.0 - - NEWS | 2 ++ - configure.ac | 8 ++++++-- - 2 files changed, 8 insertions(+), 2 deletions(-) - -commit bd604338b25884edbd86cf531505259948484323 -Author: Emmanuele Bassi -Date: Tue Sep 22 15:34:18 2009 +0100 - - [parser] Return the right expected token - - When parsing a value embedded in a Json Object or Array we need to - return the right expected token so that the generated syntax error - will be correct. - - json-glib/json-parser.c | 16 ++++++++++++++-- - 1 files changed, 14 insertions(+), 2 deletions(-) - -commit f99cf3d3d038eff786f85409f3d04736e2068e74 -Author: Emmanuele Bassi -Date: Tue Sep 22 15:34:07 2009 +0100 - - [parser] Whitespace clean up - - json-glib/json-parser.c | 11 ++++++----- - 1 files changed, 6 insertions(+), 5 deletions(-) - -commit 6c20aae2b49a6d64db5e7d1ff3a82950ea9dc58a -Author: Emmanuele Bassi -Date: Mon Sep 7 22:30:11 2009 +0100 - - [build] Prefer automake-1.11 silent rules to shave - - If we have automake-1.11 installed then we should enable the - AM_SILENT_RULES machinery instead of Shave - even though Shave's - output is a lot cleaner. - - autogen.sh | 2 +- - configure.ac | 20 ++++++++++++++++---- - json-glib/Makefile.am | 6 +++++- - 3 files changed, 22 insertions(+), 6 deletions(-) - -commit 7b4bb80930f12a366d5e5a5eea5b398972cd4891 -Author: Emmanuele Bassi -Date: Sun Sep 6 17:31:41 2009 +0100 - - [node] Add JsonNode.set_parent() - - Add the setter for JsonNode:parent, to be used in JsonParser instead - of directly accessing the JsonNode structure. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-node.c | 18 ++++++++++++++++++ - json-glib/json-parser.c | 14 +++++++------- - json-glib/json-types.h | 2 ++ - tests/test-parser.c | 10 ++++++++++ - 5 files changed, 38 insertions(+), 7 deletions(-) - -commit c1b76a73e0b2c6e0c7afced10bd6079a0f5b0f5d -Author: Emmanuele Bassi -Date: Sun Sep 6 17:15:46 2009 +0100 - - [parser] Clean up value parsing - - The code that parses a value within an object and an array should - be moved to its own function to avoid duplication. - - json-glib/json-parser.c | 199 +++++++++++++++++++---------------------------- - tests/test-parser.c | 9 +- - 2 files changed, 86 insertions(+), 122 deletions(-) - -commit d3f005c27d9a8a46259205f2f8077fb01a6a3609 -Author: Emmanuele Bassi -Date: Sun Sep 6 14:44:18 2009 +0100 - - [docs] Use proper xi:include for indexes - - Instead of relying on gtk-doc we can do the proper inclusion of the - API indexes using XInclude, complete with fallbacks. - - Also, we should include the additional pages that gtk-doc generates - for us, like the annotations glossary and the object tree. - - doc/reference/json-glib-docs.xml | 17 +++++++++++++++++ - 1 files changed, 17 insertions(+), 0 deletions(-) - -commit 7442a3011a860f12cbd40b6687b699b0b648d6b7 -Author: Emmanuele Bassi -Date: Wed Sep 2 16:41:51 2009 +0100 - - [docs] Small documentation fixes - - Clean up some notes, and add introspection annotations where needed. - - json-glib/json-generator.c | 11 ++++++----- - json-glib/json-gobject.c | 24 ++++++++++++------------ - json-glib/json-parser.c | 3 ++- - 3 files changed, 20 insertions(+), 18 deletions(-) - -commit d7d1e702b1d67fa1ec830a46650a02367ce1dd29 -Author: Emmanuele Bassi -Date: Sun Aug 16 05:52:46 2009 +0100 - - [docs] Remove note about normalization of member names - - The normalization of member names inside JsonObject was removed by - commit 8a7e0f381dc7e49745680df92ebb428f18bf4832. - - json-glib/json-object.c | 6 +----- - 1 files changed, 1 insertions(+), 5 deletions(-) - -commit 9362ccc891c914dbcf1be6bd067b0b37ae688057 -Author: Emmanuele Bassi -Date: Thu Aug 13 15:10:27 2009 +0100 - - [docs] Generate new symbols index for 0.6 and 0.8 - - doc/reference/json-glib-docs.xml | 8 ++++++++ - 1 files changed, 8 insertions(+), 0 deletions(-) - -commit 087bfe83412dca8de1b2dd67c74f490e44ecb96a -Author: Emmanuele Bassi -Date: Thu Aug 13 15:10:07 2009 +0100 - - [docs] Remove the version number from the title - - doc/reference/json-glib-docs.xml | 11 ++++++++--- - 1 files changed, 8 insertions(+), 3 deletions(-) - -commit c7d31d55b50b23c6c1067cb3541f73dddc12127a -Author: Emmanuele Bassi -Date: Thu Aug 13 15:08:56 2009 +0100 - - [docs] Let gtk-doc build the correct index - - Use the --name-space command line argument for gtk-doc to detect the - right namespace of JSON-GLib, and create a useful index. - - doc/reference/Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit be07ba7b983b34231ad2f0fd7fe60ae47b14ce7e -Author: Emmanuele Bassi -Date: Thu Aug 13 14:51:42 2009 +0100 - - [docs] Rename main file to json-glib-docs.xml - - doc/reference/Makefile.am | 36 +++++---- - doc/reference/json-glib-docs.sgml | 163 ------------------------------------- - doc/reference/json-glib-docs.xml | 163 +++++++++++++++++++++++++++++++++++++ - 3 files changed, 182 insertions(+), 180 deletions(-) - -commit 9661ff342b439b5b398f7bf9ba931d6139d5143d -Author: Emmanuele Bassi -Date: Wed Aug 12 16:09:33 2009 +0100 - - Post-release version bump to 0.7.7 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit d5922b42604c09ba7ebcb0adc1566d0a33a99808 -Author: Emmanuele Bassi -Date: Wed Aug 12 16:06:40 2009 +0100 - - [release] 0.7.6 (brown paper bag) - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 9a647104ca77d4c4272845fed4bfae028098afd3 -Author: Emmanuele Bassi -Date: Wed Aug 12 15:56:00 2009 +0100 - - Actually use the int64 support in the Scanner - - We switched everything to 64 bit integers but then I forgot to - enable the support for actually making the tokenizer store the - parsed integers into a 64 bit value. - - Bad Emmanuele, no cookie for you. - - json-glib/json-parser.c | 12 ++++++------ - json-glib/json-scanner.c | 1 + - 2 files changed, 7 insertions(+), 6 deletions(-) - -commit f3e0618ee1d8aa90d0ba22e9abe5c7d6b849e0ea -Author: Emmanuele Bassi -Date: Wed Aug 12 14:08:35 2009 +0100 - - Post-release version bump to 0.7.5 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit c1c691fc6b58a990ee9bb17504189064051d5a12 -Author: Emmanuele Bassi -Date: Wed Aug 12 13:56:08 2009 +0100 - - [release] 0.7.4 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 12bc49ea08c50da9a7ed53c475fe873421432ebe -Author: Emmanuele Bassi -Date: Wed Aug 12 14:01:49 2009 +0100 - - Update the NEWS file - - NEWS | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 75b888c26eebf7784c5af045a8c6af353e56b2e9 -Author: Emmanuele Bassi -Date: Wed Aug 12 13:59:52 2009 +0100 - - [build] Use our libtool for the typelib - - When compiling the GIR into a .typelib file we can use our own - libtool script; shave will proxy it to the right place. - - json-glib/Makefile.am | 20 +++++++++++--------- - 1 files changed, 11 insertions(+), 9 deletions(-) - -commit d84c0f367b06e094ff693d60a724b9f141c33ca9 -Author: Emmanuele Bassi -Date: Wed Aug 12 13:48:17 2009 +0100 - - Disallow single header file inclusion - - The correct header file for JSON-GLib is, and has always been, - json-glib.h. Anything else was not supported, as we've been - moving around stuff for a while, now. - - This commit enforces the single include file, using the same - policy enacted by other libraries, like: GLib, GTK+ and Clutter. - - json-glib/json-enum-types.h.in | 4 ++++ - json-glib/json-generator.h | 4 ++++ - json-glib/json-glib.h | 6 ++++++ - json-glib/json-parser.h | 4 ++++ - json-glib/json-types.h | 4 ++++ - json-glib/json-version.h.in | 4 ++++ - 6 files changed, 26 insertions(+), 0 deletions(-) - -commit 3adba015e1c1f9edc7b7b2c4364d65f813216225 -Author: Emmanuele Bassi -Date: Wed Aug 12 13:46:46 2009 +0100 - - [introspection] Use json-gobject.h - - The json-gobject.h header file includes json-glib.h and all the - GObject-related serialization and deserialization API; we assume - that if you want introspection you should be using this header - and not the plain json-glib.h. - - json-glib/Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit a9386e20bf8e16e17a89dda24781c63bf495aa97 -Author: Emmanuele Bassi -Date: Wed Aug 12 13:46:05 2009 +0100 - - [tests] Include json-glib.h - - Do not include json-types.h, use the correct global include. - - json-glib/tests/array-test.c | 2 +- - json-glib/tests/node-test.c | 2 +- - json-glib/tests/object-test.c | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -commit 8a7e0f381dc7e49745680df92ebb428f18bf4832 -Author: Emmanuele Bassi -Date: Wed Aug 12 12:29:34 2009 +0100 - - Do not sanitize the object member's name - - JsonObject sanitizes the name of the member to replace all - characters defined by G_STR_DELIMITERS with '_'. This is - absolutely brain damaged, since a member name can be any - valid JSON string. - - Obviously, if a member name maps to a GObject property is - entirely up to the GObject code to decide whether to sanitize - the member name or not. - - json-glib/json-object.c | 35 ++++++----------------------------- - 1 files changed, 6 insertions(+), 29 deletions(-) - -commit ad638149c2cc1a17c0d2ad1482d932c8940c64e0 -Author: Emmanuele Bassi -Date: Wed Aug 12 12:22:44 2009 +0100 - - Update NEWS - - NEWS | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit d87b18675ac02f42be23bf4070134690b8b9934b -Author: Emmanuele Bassi -Date: Wed Aug 12 12:13:11 2009 +0100 - - Auto-promote integer types to G_TYPE_INT64 - - The JSON RFC does not specify the size of the integer type, thus - implicitly falling back to machine-size. - - This would all be fine and dandy if some demented Web Developer (and - I use the term "developer" *very much* loosely) did not decide to - use integers to store unique identifiers for objects; obviously, you - can't have more than 2^32-1 status messages in a database with - millions of users who update their status multiple times per day. - Right, Twitter? - - Anyway, some languages do a type auto-promotion from Integer to - Long, thus pushing the limit of allowed positive values -- until the - next integer overflow, that is. C, and GLib, do not do that - transparently for us so we need to: - - - always use gint64 when parsing a JSON data stream using - JsonScanner - - move all the Node, Object and Array APIs to gint64 - - auto-promote G_TYPE_INT to G_TYPE_INT64 when setting - a GValue manually - - auto-promote and auto-demote G_TYPE_INT properties when - (de)serializing GObjects. - - The GLib types used internally by JSON-GLib are, thus: - - integer -> G_TYPE_INT64 - boolean -> G_TYPE_BOOLEAN - float -> G_TYPE_DOUBLE - string -> G_TYPE_STRING - - json-glib/json-array.c | 4 +- - json-glib/json-generator.c | 4 +- - json-glib/json-gobject.c | 58 ++++++++++++++++++++++++++++++--------- - json-glib/json-node.c | 61 +++++++++++++++++++++++++++++++++-------- - json-glib/json-object.c | 4 +- - json-glib/json-types.h | 12 ++++---- - json-glib/tests/array-test.c | 2 +- - json-glib/tests/node-test.c | 14 +++++----- - json-glib/tests/object-test.c | 2 +- - tests/test-generator.c | 4 +- - tests/test-parser.c | 4 +- - tests/test-serialize-full.c | 9 +----- - 12 files changed, 121 insertions(+), 57 deletions(-) - -commit 7411cadc0fdd9ffc2bd7004c9980913ac857a495 -Author: Emmanuele Bassi -Date: Sun Jun 28 23:52:34 2009 +0100 - - Indentation fixes - - tests/test-parser.c | 98 +++++++++++++++++++++++++------------------------- - 1 files changed, 49 insertions(+), 49 deletions(-) - -commit 112a8ec8dfd9c46304008b62e8ab256ed7714644 -Author: Emmanuele Bassi -Date: Sun Jun 28 23:49:51 2009 +0100 - - [parser] Advance the tokenizer to avoid an infinite loop - - The tokenizer is not advanced when we peek a base value and return. - This causes an endless loop which terminates only if the OOM killer - in the kernel gets the right process. - - Thanks to Thomas Weidner for catching and reporting the issue. - - json-glib/json-parser.c | 16 +++++++++++----- - 1 files changed, 11 insertions(+), 5 deletions(-) - -commit 4ecdd6bedb7961f3a33971aa1f2338115a60f7f3 -Author: Emmanuele Bassi -Date: Sun Jun 28 23:48:36 2009 +0100 - - [tests] Verify parsing base values - - A JSON document containing just a base value (null, true/false, an - integer, a floating point value or a string) is still a valid JSON - document, and JsonParser must create the correct JsonNode. - - tests/test-parser.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 59 insertions(+), 0 deletions(-) - -commit 9a3b7a020716e23f1330915f1768a7c00bffbeb5 -Author: Emmanuele Bassi -Date: Thu Jun 25 10:37:43 2009 +0100 - - [docs] Fix typo in JsonObject::set_object_member() - - The passed value is a pointer to a JsonObject, not to a JsonArray. - - json-glib/json-object.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 68d872f15022217c0ff1cf516aec917d600fd762 -Author: Rodrigo Moya -Date: Wed Jun 24 14:07:18 2009 +0200 - - Use JSON_NODE_OBJECT, not JSON_NODE_ARRAY when creating the node in json_object_set_object_member - - Reviewed by Emmanuele Bassi - - json-glib/json-object.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 6e706fb2b7a371f25c169ed25d4b617f2dc05b63 -Author: Emmanuele Bassi -Date: Sun Jun 21 10:58:24 2009 +0100 - - [generator] Pre-compute the escape table - - Instead of allocating the escape table to be used with g_strescape() - for each string we can have it unrolled already in code. - - Thanks to: Christian Persch - - Fixes bug: - - http://bugzilla.openedhand.com/show_bug.cgi?id=1648 - - json-glib/json-generator.c | 43 +++++++++++++++++++++++++++++++++---------- - 1 files changed, 33 insertions(+), 10 deletions(-) - -commit a9416b7e2823f1fffe639d90bb352a337815a70e -Author: Emmanuele Bassi -Date: Thu Jun 18 11:23:56 2009 +0100 - - Post-release bump to 0.7.3 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 1d13a409bb911141653a75d44e90feac9bfc2862 -Author: Emmanuele Bassi -Date: Thu Jun 18 11:20:35 2009 +0100 - - [release] 0.7.2 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit ff97e679522c52be6b5dfe0f851416cdeac7f921 -Author: Emmanuele Bassi -Date: Thu Jun 18 11:14:37 2009 +0100 - - [release] Update NEWS - - NEWS | 19 +++++++++++++++++++ - 1 files changed, 19 insertions(+), 0 deletions(-) - -commit 182ca9cd9a3fabaa2533d841154856c61c570d08 -Author: Emmanuele Bassi -Date: Thu Jun 18 11:14:13 2009 +0100 - - [build] Fixes for passing distcheck - - Makefile.am | 17 ++++++++++++----- - build/Makefile.am | 2 ++ - build/autotools/Makefile.am | 4 +++- - doc/reference/Makefile.am | 20 +++++++++++--------- - json-glib/Makefile.am | 27 ++++++++++++++------------- - 5 files changed, 42 insertions(+), 28 deletions(-) - -commit 019d8d4c1c56250cd507283c0fc478a38364e92a -Author: Emmanuele Bassi -Date: Thu Jun 18 10:05:57 2009 +0100 - - [build] Let gtk-doc ignore json-types-private.h - - The type definitions in json-types-private.h are not meant to be - documented or scanned. - - doc/reference/Makefile.am | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 41649f049637864cfce21f6615c7d8bcaf3f03b8 -Author: Emmanuele Bassi -Date: Thu Jun 18 10:03:23 2009 +0100 - - [docs] Update the README file - - README | 30 ++++++++++++++++++++---------- - 1 files changed, 20 insertions(+), 10 deletions(-) - -commit 97fc00b1a5e3878074488ee93d9b52570983da1f -Author: Emmanuele Bassi -Date: Thu Jun 18 10:03:05 2009 +0100 - - [build] Use AS_CASE m4 macro, instead of AS_IF - - configure.ac | 30 ++++++++++++++++-------------- - 1 files changed, 16 insertions(+), 14 deletions(-) - -commit 610cd260ac50c09809d6273c328ecea5a21f51bb -Author: Emmanuele Bassi -Date: Thu Jun 18 10:02:39 2009 +0100 - - [build] Require automake 1.10 - - configure.ac | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -commit bddc717b8b6f2f1501c30f78159c20394665d335 -Author: Emmanuele Bassi -Date: Tue Jun 9 11:48:02 2009 +0100 - - [build] Add introspection generation - - Build the Introspection data when compiling JSON-GLib; this way, the - API should be available to other languages automatically. - - .gitignore | 3 + - build/autotools/Makefile.am | 7 +++- - build/autotools/introspection.m4 | 88 ++++++++++++++++++++++++++++++++++++++ - configure.ac | 13 +++-- - json-glib/Makefile.am | 30 +++++++++++++ - 5 files changed, 135 insertions(+), 6 deletions(-) - -commit 3ddeb7a8779a4c51453289aa15af130af480eea6 -Author: Emmanuele Bassi -Date: Tue Jun 9 11:24:54 2009 +0100 - - [build] Add AS_COMPILER_FLAGS - - Use the m4 AS_COMPILER_FLAGS macro to check for the maintainer - compiler flags supported by the C compiler. This should allow the - build to handle gracefully different versions of GCC. - - .gitignore | 1 + - Makefile.am | 2 + - build/autotools/Makefile.am | 2 +- - build/autotools/as-compiler-flag.m4 | 62 +++++++++++++++++++++++++++++++++++ - configure.ac | 5 ++- - 5 files changed, 70 insertions(+), 2 deletions(-) - -commit 9f817eae9fe0d09441fa78b11ef148a3f4affe22 -Author: Emmanuele Bassi -Date: Tue Jun 9 11:21:19 2009 +0100 - - [tests] Do not namespace with json- - - tests/test-generator.c | 10 +++++----- - tests/test-parser.c | 18 +++++++++--------- - 2 files changed, 14 insertions(+), 14 deletions(-) - -commit bde3da83b1a144fc0eff1db5a2aa790462bb685e -Author: Emmanuele Bassi -Date: Tue Jun 9 11:15:53 2009 +0100 - - [git ignore] Add m4 files under build/ - - .gitignore | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit c12786444e0175464295fb9a98c600060bffa0ed -Author: Emmanuele Bassi -Date: Tue Jun 9 11:13:30 2009 +0100 - - Fix license and copyright notices - - THere is no such thing as the "Lesser General Public License - version 2": the LGPL v2 is the "Library GPL", and has been - superceded by v2.1 with the new "Lesser GPL" name. - - Also, the copyright is now Intel Corp. - - json-glib/json-array.c | 8 ++++++-- - json-glib/json-generator.c | 8 ++++++-- - json-glib/json-generator.h | 8 ++++++-- - json-glib/json-glib.h | 23 +++++++++++++++++++++++ - json-glib/json-gobject.h | 8 ++++++-- - json-glib/json-node.c | 8 ++++++-- - json-glib/json-object.c | 9 ++++++--- - json-glib/json-parser.c | 8 ++++++-- - json-glib/json-parser.h | 8 ++++++-- - json-glib/json-version.h.in | 8 ++++++-- - 10 files changed, 77 insertions(+), 19 deletions(-) - -commit 069cdc8c4ea9024b1583f074815e16e9ddf7db7f -Author: Emmanuele Bassi -Date: Tue Jun 9 11:05:23 2009 +0100 - - [node] Make JsonNode completely private - - The JsonNode structure has always been meant to be completely - opaque; we indirectly exposed the :type member, but only for - access through the JSON_NODE_TYPE() macro. - - Since that macro has become a proxy for the json_node_get_node_type() - function we can safely move everything into a private, uninstalled - header file and let JsonNode be completely opaque to the developer. - - json-glib/Makefile.am | 1 + - json-glib/json-array.c | 9 +----- - json-glib/json-generator.c | 2 + - json-glib/json-gobject.c | 2 + - json-glib/json-node.c | 2 +- - json-glib/json-object.c | 9 +----- - json-glib/json-parser.c | 2 + - json-glib/json-types-private.h | 61 ++++++++++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 38 +++++++++--------------- - json-glib/tests/node-test.c | 8 ++-- - 10 files changed, 89 insertions(+), 45 deletions(-) - -commit 930fdf4c4dff1f5310a946c2a9f5b6860f7c8ba8 -Author: Emmanuele Bassi -Date: Sun May 17 19:44:41 2009 +0100 - - Add JsonArray iteration function - - Similarly to commit 3057a172 for JsonObject, the newly added - json_array_foreach_element() iterates over a JSON array data - type. - - doc/reference/json-glib-sections.txt | 2 + - json-glib/json-array.c | 35 ++++++++++++++++++++++++ - json-glib/json-types.h | 21 +++++++++++++++ - json-glib/tests/array-test.c | 48 ++++++++++++++++++++++++++++++++++ - 4 files changed, 106 insertions(+), 0 deletions(-) - -commit 3057a1722e27a13b39ddec4754fb6abda1aea199 -Author: Emmanuele Bassi -Date: Sat May 16 20:09:07 2009 +0100 - - Add JsonObject iteration function - - The json_object_foreach_member() function iterates over a JsonObject - data type. - - doc/reference/json-glib-sections.txt | 2 + - json-glib/json-object.c | 55 ++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 25 +++++++++++++- - json-glib/tests/object-test.c | 57 ++++++++++++++++++++++++++++++++++ - 4 files changed, 137 insertions(+), 2 deletions(-) - -commit 5778210462b8b7a1a5d98466508276f712ea8c47 -Author: Emmanuele Bassi -Date: Sat May 16 13:53:58 2009 +0100 - - Update the enum types templates - - The autogenerated enumeration types registration code should - be using the same pattern used by the G_DEFINE_TYPE() macros, - with GOnce to enable atomic (and thread-safe) type registration. - - json-glib/json-enum-types.c.in | 18 +++++++++++++----- - 1 files changed, 13 insertions(+), 5 deletions(-) - -commit 43d4bd151cd6979ecc6fdad5fab3e7988117c7be -Author: Emmanuele Bassi -Date: Sun Apr 19 00:36:08 2009 +0100 - - [doap] Add a category element - - json-glib.doap | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 58999bddac74c176fbd8544fa2cd30e2f067d863 -Author: Emmanuele Bassi -Date: Fri Apr 17 15:45:42 2009 +0100 - - [node] Add is_null() method - - The json_node_is_null() function is just a quick check for - nodes set to null. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-node.c | 20 ++++++++++++++++++++ - json-glib/json-types.h | 1 + - 3 files changed, 22 insertions(+), 0 deletions(-) - -commit ba46d8e07a8e2dd50a3b1fff8b8c3303e3686480 -Author: Emmanuele Bassi -Date: Fri Apr 17 15:38:40 2009 +0100 - - [node] Make JSON_NODE_TYPE call a function - - Second pass at adding type safety to the JsonNode type checks. - - The JSON_NODE_TYPE macro now calls the json_node_get_node_type() - function which hides the JsonNode.type structure field and gives - us a little bit more of future compatibility. - - json-glib/json-types.h | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit d1e7d1ecd05687624f7149dad75a5fac9a645e72 -Author: Emmanuele Bassi -Date: Fri Apr 17 15:36:09 2009 +0100 - - [node] Add function version of JSON_NODE_TYPE macro - - First pass at adding some type safety to the JsonNode type checks, - and at removing every mention of the JsonNode interna fields. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-node.c | 18 ++++++++++++++++++ - json-glib/json-types.h | 5 +++-- - 3 files changed, 22 insertions(+), 2 deletions(-) - -commit f2f43d17254317d35ea0cc8206592ecbcb856b68 -Author: Emmanuele Bassi -Date: Fri Apr 17 15:22:04 2009 +0100 - - Intern the remaining type names - - JsonArray and JsonSerializable type names should be interned like - the rest of the types. - - json-glib/json-array.c | 2 +- - json-glib/json-gobject.c | 3 ++- - 2 files changed, 3 insertions(+), 2 deletions(-) - -commit bfcc50d5b199e72ed3e5a7556ac2294442e3ac55 -Author: Emmanuele Bassi -Date: Fri Apr 17 15:19:42 2009 +0100 - - [docs] Remove newline from the version template - - The newline at the end of the version.xml.in file is retained - when using its contents as the version entity in the API reference - docbook. - - doc/reference/version.xml.in | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit cbc92b72b2d7870a916f24055f8c2aa2371aa4ea -Author: Emmanuele Bassi -Date: Fri Apr 17 15:02:44 2009 +0100 - - [tests] Use the typed accessors in test-generator - - Other than using the GValue-based methods we should also be using - the typed JsonNode accessors and the newly added JsonObject and - JsonArray typed accessors. - - tests/test-generator.c | 65 ++++++++--------------------------------------- - 1 files changed, 11 insertions(+), 54 deletions(-) - -commit e437ce609e333c5b8ede21174dfba032c1bbfb00 -Author: Emmanuele Bassi -Date: Fri Apr 17 14:49:25 2009 +0100 - - Add convenience accessors to JsonArray - - Like commit 5bb6ea91 did for JsonObject, we should add typed - convenience accessors to JsonArray in order to cut down the - amount of nodes needed when parsing and generating JSON data - streams. - - As for JsonObject, the amount of types is small enough to avoid - the combinatorial API explosion. - - doc/reference/json-glib-sections.txt | 22 ++- - json-glib/json-array.c | 386 ++++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 57 ++++-- - 3 files changed, 447 insertions(+), 18 deletions(-) - -commit 4819ca625d1b73270797f913495a3835297950c2 -Author: Emmanuele Bassi -Date: Fri Apr 17 11:44:01 2009 +0100 - - Update after the json_object_add_member() deprecation - - Since json_object_add_member() has been deprecated and it's using - a gcc compiler attribute to loudly complain while compiling the - library, we should restore the sanity and use json_object_set_member() - instead. - - json-glib/json-gobject.c | 2 +- - json-glib/json-parser.c | 6 +++--- - json-glib/tests/node-test.c | 2 +- - json-glib/tests/object-test.c | 4 ++-- - tests/test-generator.c | 26 +++++++++++++------------- - tests/test-serialize-complex.c | 4 ++-- - tests/test-serialize-full.c | 4 ++-- - 7 files changed, 24 insertions(+), 24 deletions(-) - -commit 5bb6ea91accb1d35f0ea4dae8f2b8f71bdbd134d -Author: Emmanuele Bassi -Date: Fri Apr 17 11:35:57 2009 +0100 - - Deprecate add_member() and add set_member() and friends - - The add_member() method of JsonObject has wee bit weird semantics: if - the member to be added already exists it prints a scary warning and - returns - and yet it calls g_hash_table_replace() internally as if it - overwrites the member. - - So, instead of changing semantics midway we can: - - - add a json_object_set_member() which adds a new member and - overwrites existing members - - - deprecate json_object_add_member() - - While we're at it, we can add convenience wrappers for set_member() - and get_member() that don't require us toying with nodes; luckily, - since the amount of valid types we can add to a JsonObject is limited, - this does not lead to a combinatorial API explosion. - - doc/reference/json-glib-sections.txt | 17 ++ - json-glib/json-object.c | 489 ++++++++++++++++++++++++++++++++-- - json-glib/json-types.h | 83 +++++-- - 3 files changed, 555 insertions(+), 34 deletions(-) - -commit 2a768cb5e553afc4a9ac0d9bf1dc36a183821983 -Author: Emmanuele Bassi -Date: Thu Apr 16 19:57:11 2009 +0100 - - [doap] Add GNOME extensions - - The GNOME project provides an extension to DOAP that allows the - description of the maintainer/author of a project to specify the - GNOME userid. - - json-glib.doap | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit 17822292acb4d1c9b4f414ea0e4b858809d3b858 -Author: Emmanuele Bassi -Date: Thu Apr 16 18:18:45 2009 +0100 - - [doap] Add 0.6 releases - - Describe the releases of the 0.6 cycle. - - json-glib.doap | 18 ++++++++++++++++++ - 1 files changed, 18 insertions(+), 0 deletions(-) - -commit 470f3a4299153362deea260c806d9b87870af3de -Author: Emmanuele Bassi -Date: Thu Apr 16 18:03:31 2009 +0100 - - Add JSON-GLib DOAP description - - Use DOAP (Description Of A Project) to describe JSON-GLib. The - GNOME Cgit instance will pick up the DOAP file and update itself. - - json-glib.doap | 30 ++++++++++++++++++++++++++++++ - 1 files changed, 30 insertions(+), 0 deletions(-) - -commit 764a3f79fe0d8d13e24bd921a16a46f4603bcbf1 -Author: Emmanuele Bassi -Date: Thu Apr 16 11:28:24 2009 +0100 - - Add MAINTAINERS file - - Every GNOME project needs a MAINTAINERS file. - - MAINTAINERS | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit f9956b4eadcfc9bbd5c0bc4b861ff782779e8a9a -Author: Emmanuele Bassi -Date: Tue Apr 14 00:09:35 2009 +0100 - - [node] Do not overwrite when copying - - Bug 1353 - Copying JSON_NODE_VALUE nodes unreliable at best - - When copying a JsonNode to another we do an implicit memcpy using: - - *copy = *src - - Which works well enough with pointers, but makes a mess out of the - value-based nodes. - - We should just copy the type of the original JsonNode and leave the - rest to the switch() block. - - In order to catch potential regressions, we also need a more - thorough test unit for the JsonNode copy operation. - - json-glib/json-node.c | 2 +- - json-glib/tests/node-test.c | 45 +++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 44 insertions(+), 3 deletions(-) - -commit e2c65a75d68aafa26f2084928e732961e48beb99 -Author: Emmanuele Bassi -Date: Mon Apr 13 23:46:52 2009 +0100 - - [build] Improve the build system - - Clean up the configure.ac and Makefile.am files to use something - that is not entirely made of FAIL. - - Also, use Shave to sanitize the libtool and compiler incantations - and restore sanity to the build system. - - .gitignore | 5 ++ - autogen.sh | 9 ++++ - build/Makefile.am | 1 + - build/autotools/Makefile.am | 3 + - build/autotools/shave-libtool.in | 69 +++++++++++++++++++++++++++++ - build/autotools/shave.in | 79 +++++++++++++++++++++++++++++++++ - build/autotools/shave.m4 | 77 ++++++++++++++++++++++++++++++++ - configure.ac | 90 +++++++++++++++++++++---------------- - json-glib/Makefile.am | 89 +++++++++++++++++++------------------ - 9 files changed, 340 insertions(+), 82 deletions(-) - -commit 8080df63b4b4eae3b59d1214fc67f48149f49773 -Author: Emmanuele Bassi -Date: Mon Apr 13 22:25:42 2009 +0100 - - [parser] Prevent leaks on error codepaths - - Static analysis of the code showed some potential leaks inside - error paths for JsonParser. - - Thanks to: Gordon Williams - - json-glib/json-parser.c | 38 +++++++++++++++++++++++++++++++++----- - 1 files changed, 33 insertions(+), 5 deletions(-) - -commit ca329a7d5c1185cdf15fb85891693eca30295de1 -Author: Emmanuele Bassi -Date: Mon Apr 13 22:30:05 2009 +0100 - - [docs] Show an example of assignment - - Since I decided to rant about assignments in JSON definitions, - I also need to show what an assignment looks like. - - json-glib/json-parser.c | 17 ++++++++++++----- - 1 files changed, 12 insertions(+), 5 deletions(-) - -commit b28d5894060aac1239e23665f42be3946b5450e7 -Author: Emmanuele Bassi -Date: Mon Apr 13 22:29:36 2009 +0100 - - Whitespace fixes - - Add more spaces and remove the ` from the error message. - - json-glib/json-parser.c | 18 ++++++++++++------ - 1 files changed, 12 insertions(+), 6 deletions(-) - -commit a19a51df9e95e36edf949e68581731bd31959081 -Author: Emmanuele Bassi -Date: Mon Apr 13 22:08:21 2009 +0100 - - [tests] Use 'static' when registering enum types - - Bug 1393 - Regression tests fails on OpenBSD - - When registering a GEnumClass we need to set the GEnumValue array - as static const because g_enum_register_static() does not contain - the word "static" just for fun. - - Reported by: Jasper - - tests/test-serialize-full.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit e583a9ec95f3d157091ec1e1a2ac8c493f0e23b2 -Author: Emmanuele Bassi -Date: Mon Apr 13 22:04:10 2009 +0100 - - [build] Use gnome-autogen script - - When setting up the build environment we should use the tools that - GNOME provides instead of calling autoreconf. - - autogen.sh | 21 ++++++++------------- - 1 files changed, 8 insertions(+), 13 deletions(-) - -commit 1d92c73bc05423872581d513f355783d4864edd5 -Author: Emmanuele Bassi -Date: Fri Nov 28 17:24:15 2008 +0000 - - Abstract the loading code into its own function - - The load_from_file() method must set the is_filename/filename fields - of the JsonParserPrivate structure, so that the error handler can - use them to print out the file, as well as the line in case of - error. - - Since load_from_data() needs to unset those two fields, to avoid - printing invalid/stale information, we need to have a generic "load" - function that can be invoked by both load_from_data() and - load_from_file(), and leave the JsonParser object set up to those - two methods. - - Hence, a private json_parser_load() has been added, moving most of - the code out of json_parser_load_from_data(). This function does not - perform type checks and requires that the length of the memory buffer - containing the JSON data stream is already a positive integer. - - json-glib/json-parser.c | 175 +++++++++++++++++++++++++++------------------- - 1 files changed, 103 insertions(+), 72 deletions(-) - -commit 6e7958785096806b3ffa60a4937642d713a051f2 -Author: Emmanuele Bassi -Date: Fri Nov 28 17:19:17 2008 +0000 - - Display the filename inside error messages - - Instead of just relaying the line number both when parsing files - and memory buffers, JsonParser should also print out the file name - in case it is available. - - The error message format should be make-like and emacs-friendly, - that is: - - filename:line_number: error message - - so that editors and development environments can parse the errors - easily. - - This commit adds the filename string, and a boolean flag for checking - whether the filename is set, inside the JsonParser private data - structure. The boolean flag is checked inside the JsonScanner error - handler when populating the GError or when printing the warning - directly on stderr. - - json-glib/json-parser.c | 28 ++++++++++++++++++++++++++-- - 1 files changed, 26 insertions(+), 2 deletions(-) - -commit a5bea353dead0bd69f9664df86050fc829a2dcd5 -Author: Emmanuele Bassi -Date: Mon Nov 3 16:01:03 2008 +0000 - - Bump to 0.7.1 after stable branch - - configure.ac | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -commit cf4c7360c69c0fe7587ec2456cd10839e1d0c1d6 -Author: Emmanuele Bassi -Date: Mon Nov 3 15:51:21 2008 +0000 - - Correctly terminate a string array - - When converting from a JsonArray of strings to a GStrv we need to - add a NULL at the end of the GPtrArray we use to perform the - conversion. - - This two lines patch fixes the issue. - - See bug 1203. - - Patch by: Kouhei Sutou - - Signed-off-by: Emmanuele Bassi - - json-glib/json-gobject.c | 4 +++- - 1 files changed, 3 insertions(+), 1 deletions(-) - -commit 9b94bc7f99063f45a2725861369f36b53ec3d440 -Author: Emmanuele Bassi -Date: Fri Jun 13 11:56:46 2008 +0100 - - Sync up with the current stable release numbers - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 4dd392342003147d55eee98db50e11d344b287d4 -Author: Emmanuele Bassi -Date: Fri Jun 13 11:27:50 2008 +0100 - - Fix a variable shadowing - - json-glib/json-generator.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -commit a02a42ef47e61456747e511556097b903f07d68a -Merge: fdbad1c bc5c722 -Author: Emmanuele Bassi -Date: Fri Jun 13 11:23:08 2008 +0100 - - Merge the fix for bug #965 - - Merge branch 'bug-965' - -commit bc5c7225535ef447743ac59ecdba8c237549a108 -Author: Emmanuele Bassi -Date: Fri Jun 13 11:22:35 2008 +0100 - - Conditionally compile the test suite - - If the --disable-glibtest command line switch has been given to the - configure script, the test suite should be disabled and not built. - - This commit disables recursion in the tests/ and json-glib/tests - when the ENABLE_GLIB_TEST Makefile conditional has been set. - - Makefile.am | 6 +++++- - configure.ac | 3 +++ - json-glib/Makefile.am | 2 ++ - 3 files changed, 10 insertions(+), 1 deletions(-) - -commit fdbad1cfd6ad6da9fab631f945ab8d2e85228fdf -Author: Emmanuele Bassi -Date: Fri Jun 13 11:06:15 2008 +0100 - - Escape to special characters in JsonGenerator - - When using json-glib to write a blog system, some deserialized objects - were not been interpreted by javascript because there were line breaks - in generated strings. - - Patch from Lincoln de Sousa. - - Bug #958 - JsonGenerator does not escape special characters - - Signed-off-by: Emmanuele Bassi - - json-glib/json-generator.c | 17 ++++++++++++++++- - 1 files changed, 16 insertions(+), 1 deletions(-) - -commit 81c02ef3db6901655f8a7117e5e2675d37096daf -Author: Emmanuele Bassi -Date: Sun May 18 11:56:04 2008 +0100 - - Remove the include for json-scanner.h - - The json-scanner.h header file is not shipped with JSON-GLib anymore. - - json-glib/json-glib.h | 1 - - 1 files changed, 0 insertions(+), 1 deletions(-) - -commit 9713843a4294b3e35a29125bf2bf1867a6443f27 -Author: Emmanuele Bassi -Date: Tue May 6 11:48:25 2008 +0100 - - Remove debian packaging - - debian/changelog | 5 --- - debian/compat | 1 - - debian/control | 61 --------------------------------------- - debian/copyright | 27 ----------------- - debian/libjson-glib-dev.install | 3 -- - debian/libjson-glib-doc.install | 1 - - debian/libjson-glib-doc.links | 1 - - debian/libjson-glib0.install | 1 - - debian/rules | 12 ------- - 9 files changed, 0 insertions(+), 112 deletions(-) - -commit d67000ab6c5ae6710f48f0517c98600af7cdaa0e -Author: Emmanuele Bassi -Date: Mon May 5 23:17:58 2008 +0100 - - Update changelog for the debian packages - - debian/changelog | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -commit 0830873edc5203655f04868184cedb428b6d2d54 -Author: Emmanuele Bassi -Date: Mon May 5 23:16:38 2008 +0100 - - Update git ignore file - - .gitignore | 72 ++++++++++++++++++----------------------------------------- - 1 files changed, 22 insertions(+), 50 deletions(-) - -commit eb1cd29f78ff52e3ec3b063716fb86b5f2c5ae4a -Author: Emmanuele Bassi -Date: Mon May 5 23:13:17 2008 +0100 - - Remove Vala bindings - - Vala bindings are maintained out of tree, directly inside the Vala - repository and official packages, so there's no point in duplicating - the effort here. - - Makefile.am | 6 +-- - configure.ac | 15 ----- - contrib/Makefile.am | 6 -- - contrib/json-glib-1.0.deps | 1 - - contrib/json-glib-1.0.vapi | 139 -------------------------------------------- - contrib/json-object.vala | 46 --------------- - contrib/json-test.vala | 122 -------------------------------------- - 7 files changed, 1 insertions(+), 334 deletions(-) - -commit 094acd1663210e803a8dab496f6de8066ef11f44 -Author: Emmanuele Bassi -Date: Mon May 5 12:44:29 2008 +0100 - - Bump to 0.6.1 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit a725bac9a287883f2d4f32130c7faedb121f754b -Author: Emmanuele Bassi -Date: Mon May 5 12:39:01 2008 +0100 - - Bump to 0.6.0 - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit cd598180b12a212525427a8cddf11bc0ed4f1836 -Author: Emmanuele Bassi -Date: Mon May 5 12:38:50 2008 +0100 - - Update NEWS for 0.6.0 - - NEWS | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit 26479ec3c342889a2ee822bdf73f2e5fb6e170d7 -Merge: 8b5b5f6 7ff9134 -Author: Emmanuele Bassi -Date: Mon May 5 12:35:16 2008 +0100 - - Add debian packaging to the master branch - - Merge branch 'debian-packaging' - -commit 8b5b5f6a4fdfb219897d75893889014f44ba4bb0 -Author: Emmanuele Bassi -Date: Mon May 5 12:34:35 2008 +0100 - - Add json-scanner.h to the EXTRA_DIST content - - Fix a distcheck error because json-scanner.h is not packaged inside - the tarball. - - json-glib/Makefile.am | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 705a73eb3dfa2323ec86c1d299b567a15acde7a6 -Author: Emmanuele Bassi -Date: Mon May 5 12:24:22 2008 +0100 - - Style fixes for the configure output - - configure.ac | 10 +++++----- - 1 files changed, 5 insertions(+), 5 deletions(-) - -commit e017d392a281594e350a8d74c142cbe014753d7e -Author: Emmanuele Bassi -Date: Mon May 5 12:24:00 2008 +0100 - - Fix typo in the libtool flags arguments - - The correct syntax for passing the versioning information to - libtool is '-version-info', not '-versio-info'. - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 2051be2f7185733bbc62d10ec096538fec924638 -Author: Emmanuele Bassi -Date: Mon May 5 12:22:59 2008 +0100 - - Add the Bugzilla URL to AC_INIT - - JSON-GLib has a bugzilla product on bugzilla.openedhand.com. By adding - the URL to the configure.ac template, the configure script will print - it when invoked with the --help command line switch. - - configure.ac | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletions(-) - -commit 4cb8a9078172c5f56ac5d56417b8656a7053df4a -Author: Emmanuele Bassi -Date: Mon May 5 12:21:40 2008 +0100 - - Update autogen.sh - - Make autogen.sh test for the location of the current directory, and - warn if the checkout is not complete. - - If gtk-doc is not installed (for instance, on an embedded minimal - set up), do not fail and just provide a stub gtk-doc.make. - - autogen.sh | 28 +++++++++++++++++++++++++--- - 1 files changed, 25 insertions(+), 3 deletions(-) - -commit 1571fcddd6f2a245f4bb6ad64f82d24fc9c4cec0 -Author: Emmanuele Bassi -Date: Thu May 1 23:00:28 2008 +0100 - - Test the deserialization of arrays of strings - - Arrays of strings are handled automatically by the GObject - deserialization and serialization code. We need to test that - they are correctly parsed and assigned to the instance. - - tests/test-serialize-full.c | 29 +++++++++++++++++++++++++++-- - 1 files changed, 27 insertions(+), 2 deletions(-) - -commit 4c11d0969a44bb70acf6463ef6305999ff443be2 -Author: Emmanuele Bassi -Date: Thu May 1 22:58:55 2008 +0100 - - Use an array to hold the strings in a vector - - Instead of building a GString by concatenating every string inside - an array to deserialize the array into a string vector property, - use a GPtrArray. This is far more efficient (no reallocations are - necessary, as we know the size of the array) and safe (the separator - used to build the string buffer and then split it might exist in - one of the original strings). - - json-glib/json-gobject.c | 15 +++++---------- - 1 files changed, 5 insertions(+), 10 deletions(-) - -commit 7ff91344d21b0c26d3a3a2834dbf09286cb1f904 -Author: Emmanuele Bassi -Date: Thu May 1 16:08:15 2008 +0100 - - Remove control re-generation rule - - We don't have a template control, so there's not need to clean it - up and regenerate it. - - This is why copying existing debian/rules templates is not a good - idea unless you read the Debian packaging rules. - - debian/rules | 3 --- - 1 files changed, 0 insertions(+), 3 deletions(-) - -commit e75321e64f17d69beac0c2e131572fe081680b08 -Author: Emmanuele Bassi -Date: Thu May 1 15:58:31 2008 +0100 - - Add debian packaging files - - The debian packaging files are obviously needed to generate Debian - packages for JSON-GLib. - - debian/changelog | 6 ++++ - debian/compat | 1 + - debian/control | 61 +++++++++++++++++++++++++++++++++++++++ - debian/copyright | 27 +++++++++++++++++ - debian/libjson-glib-dev.install | 3 ++ - debian/libjson-glib-doc.install | 1 + - debian/libjson-glib-doc.links | 1 + - debian/libjson-glib0.install | 1 + - debian/rules | 15 +++++++++ - 9 files changed, 116 insertions(+), 0 deletions(-) - -commit 30f9d47ecf43a17610cd9c0074ff832bfa37593c -Author: Emmanuele Bassi -Date: Thu Apr 24 15:47:11 2008 +0100 - - Test the equality of the serialize string length - - tests/test-serialize-simple.c | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit 07c2b916dadb4b40fbaabf49f0e80941993cc2cf -Author: Emmanuele Bassi -Date: Thu Apr 24 15:02:33 2008 +0100 - - Export only the public symbols - - All the symbols starting with an underscore or with something that - is not "json" are to considered private, and thus are not global - to the shared object. - - json-glib/Makefile.am | 6 +++++- - 1 files changed, 5 insertions(+), 1 deletions(-) - -commit 179899e5da801fda0981a1d446ba420efd4021c1 -Author: Emmanuele Bassi -Date: Thu Apr 24 14:55:51 2008 +0100 - - Update git ignore file - - .gitignore | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit b0daf7e3a2529dd9950d77a96a10233d68778f32 -Author: Emmanuele Bassi -Date: Thu Apr 24 14:54:05 2008 +0100 - - Include the newly added json-enum-types.h header - - When including json-glib/json-glib.h we get everything json-glib - expose as a public symbol. - - json-glib/json-glib.h | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit c7a7f429565195fe7aba56a254abf3637cf6fa8a -Author: Emmanuele Bassi -Date: Thu Apr 24 14:52:54 2008 +0100 - - Ignore the enumeration types header and the stamp file - - We don't need gtk-doc to look at those files; the enumeration - types are already documented, and the get_type() function and - macro are implied. - - doc/reference/Makefile.am | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 053bf43c813799c5f59e9241217fe31c560b5885 -Author: Emmanuele Bassi -Date: Thu Apr 24 14:52:07 2008 +0100 - - Install the autogenerated enum types header - - The enumeration GTypes are public and meant to be used by - language bindings and other users of the library. - - json-glib/Makefile.am | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 5977d95866cd9763e97a47d6c9909e6a2fbf0ed1 -Author: Emmanuele Bassi -Date: Thu Apr 24 14:50:34 2008 +0100 - - Autogenerate the GTypes for the enumerations - - json-glib/Makefile.am | 70 +++++++++++++++++++++++++++++++++---------------- - 1 files changed, 47 insertions(+), 23 deletions(-) - -commit 356413e8840a614914b84f40b1d8476ba036ded4 -Author: Emmanuele Bassi -Date: Thu Apr 24 14:49:45 2008 +0100 - - Add enumeration types templates for glib-mkenums - - The templates for glib-mkenums keep the Makefile.am sane and - editable by mere mortals. - - json-glib/json-enum-types.c.in | 31 +++++++++++++++++++++++++++++++ - json-glib/json-enum-types.h.in | 26 ++++++++++++++++++++++++++ - 2 files changed, 57 insertions(+), 0 deletions(-) - -commit 7d57ffc03783defbfeb26e21a14e3df32555c29d -Author: Emmanuele Bassi -Date: Mon Apr 21 10:57:05 2008 +0100 - - Update git ignore file - - .gitignore | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 7d259e03b9a556d155ade87417ab26830c3e7684 -Author: Emmanuele Bassi -Date: Sun Apr 20 22:43:32 2008 +0100 - - Validate the variable name in the assignment test - - Make sure that not only we report that there is an assignment - and that the returned variable is not NULL, but also that the - returned variable name is correct. - - tests/test-parser.c | 16 ++++++++++------ - 1 files changed, 10 insertions(+), 6 deletions(-) - -commit 6899bca0dcf72dac0cad9dcf1a7cd10159d471e5 -Author: Emmanuele Bassi -Date: Sat Apr 19 23:22:29 2008 +0100 - - Add more cases for the nested array parsing unit - - Try more combinations of elements inside an array with a nested - object. - - tests/test-parser.c | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 81addb645ac5fad28619bb660624902abe981377 -Author: Emmanuele Bassi -Date: Sat Apr 19 23:18:54 2008 +0100 - - Add verbose messages - - The unicode escaping unit should have the same verbosity as the - other units. - - tests/test-parser.c | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit 22a0db88c14895f98db76bca3cb078fbd3a2b07d -Author: Emmanuele Bassi -Date: Sat Apr 19 23:09:32 2008 +0100 - - Whitespace fixes in the licensing notice - - json-glib/json-scanner.h | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 676592cef006de16d966a1ca0469ccd0556f0e4b -Author: Emmanuele Bassi -Date: Sat Apr 19 23:09:20 2008 +0100 - - Documentation fixes in JsonNode - - json-glib/json-node.c | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -commit bf2249a1855b6bebe0b3528b4d5321a1ebe4b9e7 -Author: Emmanuele Bassi -Date: Sat Apr 19 23:08:20 2008 +0100 - - Do not copy node data if it's not there - - If the source JsonNode does not contain data yet, do not try - and copy it. - - json-glib/json-node.c | 17 +++++++++++++---- - 1 files changed, 13 insertions(+), 4 deletions(-) - -commit c191b2f8a8159457db3333390be10d6c7c0d4336 -Author: Emmanuele Bassi -Date: Sat Apr 19 23:05:03 2008 +0100 - - Ignore json-scanner.h and its types - - When generating the documentation, ignore the JsonScanner header - as it will not be installed. - - Also, we moved JsonTokenType from json-parser.h to json-scanner.h, - where it belongs, so we can remove it from the (private) subsection - of the json-parser section. - - doc/reference/Makefile.am | 7 ++++++- - doc/reference/json-glib-sections.txt | 1 - - 2 files changed, 6 insertions(+), 2 deletions(-) - -commit ffbd9063556a061ba3e7e4223b924ae4766adfbd -Author: Emmanuele Bassi -Date: Sat Apr 19 23:01:26 2008 +0100 - - Do not install the JsonScanner header - - The JsonScanner tokenizer is an internal copy of GScanner: it should - not be used outside JSON-GLib - JsonParser is the public API for - parsing JSON. - - json-glib/Makefile.am | 5 +++-- - 1 files changed, 3 insertions(+), 2 deletions(-) - -commit df2a310a6ed0a3b32415f53076ff4c053b3fd925 -Author: Emmanuele Bassi -Date: Sat Apr 19 22:59:28 2008 +0100 - - Fix the external gtk-doc references - - Gtk-doc can try and resolve the external symbols using the data - currently installed in other locations. - - Since we are using GLib and GObject it would be nice to backlink - to them inside our API reference. - - doc/reference/Makefile.am | 7 ++++--- - 1 files changed, 4 insertions(+), 3 deletions(-) - -commit 6a3d8266efe505b29555db21658c241eba20fe2d -Author: Emmanuele Bassi -Date: Sat Apr 19 22:57:05 2008 +0100 - - Add GLIB_PREFIX variable - - The gtk-doc-fixref script needs to know the location of the - libraries documentation; in order to get it, we can ask the - pkg-config file of the library for its prefix. - - configure.ac | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit 4e5ec69cce8ab27f965985ba69ea11224ae39ffd -Author: Emmanuele Bassi -Date: Sat Apr 19 22:28:21 2008 +0100 - - Update the description and dependencies - - README | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletions(-) - -commit f65a5d5e30a1242a899149b732d1139891876014 -Author: Emmanuele Bassi -Date: Sat Apr 19 18:05:45 2008 +0100 - - Bump to 0.5.1 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit ab0da7c61bde715e99dd16027b198c7760b30922 -Author: Emmanuele Bassi -Date: Sat Apr 19 18:01:57 2008 +0100 - - Update for 0.5.0 release - - NEWS | 14 ++++++++++++++ - 1 files changed, 14 insertions(+), 0 deletions(-) - -commit 203927c71231cf6cec6d88161211702b7105df2d -Author: Emmanuele Bassi -Date: Sat Apr 19 17:20:50 2008 +0100 - - Fix ignore rule - - .gitignore | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 76921ac27534aa0a25b39790ce4d99cf6e19a20c -Author: Emmanuele Bassi -Date: Sat Apr 19 17:19:30 2008 +0100 - - Verify the correct handling of Unicode escaping - - Check that JsonParser correctly handles Unicode characters escaped - using the \uXXXX notation, as per RFC. - - tests/test-parser.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 67 insertions(+), 0 deletions(-) - -commit 379a2fe972c6e7436be9f345fe018bf4fe575354 -Author: Emmanuele Bassi -Date: Sat Apr 19 17:16:28 2008 +0100 - - Add support for parsing \uXXXX into Unicode - - JsonScanner was forked from GScanner in order to support the - JSON-specific Unicode escaping. - - JsonScanner now intercepts the \u escape character and, if it - is followed by a hexadecimal value, it will retrieve the - Unicode character encoded in the following 4 values and insert - the character itself in the buffer. - - This allows full compatibility with JSON. - - json-glib/json-scanner.c | 56 +++++++++++++++++++++++++++++++++++++++++----- - 1 files changed, 50 insertions(+), 6 deletions(-) - -commit 9429ecaa88cdb6705189b6970481911f11339ff6 -Merge: d313aa1 445a3f7 -Author: Emmanuele Bassi -Date: Sat Apr 19 15:33:15 2008 +0100 - - Merge master branch back for testing JsonScanner - - Merge branch 'master' into json-scanner - -commit 445a3f71d046abed4ff99e0ab4cd9cc8e047f5be -Author: Emmanuele Bassi -Date: Sat Apr 12 13:21:21 2008 +0100 - - Allow null nodes to return a value without a warning - - Value nodes might contain 'null' as a valid value, so the fast accessors - should not barf out when encountering a JSON_NODE_NULL instead of the - expected JSON_NODE_VALUE. - - json-glib/json-node.c | 21 +++++++++++++++------ - 1 files changed, 15 insertions(+), 6 deletions(-) - -commit 4e826d9f209a8f68023bae54c91b2bbbb202a54a -Merge: 98b6e5e 2a579b5 -Author: Emmanuele Bassi -Date: Thu Apr 3 16:32:53 2008 +0100 - - Merge branch 'test-framework' - -commit 2a579b51f38df1c009201703279a3e6cb4f57eea -Author: Emmanuele Bassi -Date: Thu Apr 3 16:31:48 2008 +0100 - - Wrap the test report information section inside an info element - - Makefile.decl | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -commit 8e2e539d02b84e0fe452174f3dfab06f35a4e6a1 -Author: Emmanuele Bassi -Date: Sun Mar 9 20:52:29 2008 +0000 - - Add value testing to the JsonNode unit - - Test the GValue API for storing fundamental types into a JsonNode. - - json-glib/tests/node-test.c | 29 +++++++++++++++++++++++++++++ - 1 files changed, 29 insertions(+), 0 deletions(-) - -commit 646b90e79d3424a332064a6a1e9fc62d1ce99386 -Author: Emmanuele Bassi -Date: Wed Mar 5 17:43:06 2008 +0000 - - Add package and version information to the test-report XML - - Makefile.decl | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit b8943381b0df44d9e6e21ae8321df2376c8458a8 -Author: Emmanuele Bassi -Date: Wed Mar 5 16:03:24 2008 +0000 - - Add JsonObject test unit - - Use a similar test unit as the JsonArray one, testing creation, empty - objects, addition and removal of members. - - .gitignore | 2 + - json-glib/tests/Makefile.am | 17 +++++++---- - json-glib/tests/object-test.c | 62 +++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 75 insertions(+), 6 deletions(-) - -commit 7eab612d9b200aef197fa1dffa4f89b936c76b1f -Author: Emmanuele Bassi -Date: Wed Mar 5 15:46:41 2008 +0000 - - Add element removal unit to the Array test - - Remove the json_array_remove_element() call from the add-element test unit - and set up a separate test case for the element removal. This keeps the - test cases clean. - - json-glib/tests/array-test.c | 12 ++++++++++++ - 1 files changed, 12 insertions(+), 0 deletions(-) - -commit 6aa1ddb891594e0f567bc3ebeb3bf5d3ab8e7e0c -Author: Emmanuele Bassi -Date: Tue Mar 4 13:07:08 2008 +0000 - - Clean the test-report XML output, if found - - Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 6eee8282d327614380854d572b2680f40b2faaf5 -Author: Emmanuele Bassi -Date: Tue Mar 4 12:37:52 2008 +0000 - - Update gitignore file - - .gitignore | 18 ++++++++---------- - 1 files changed, 8 insertions(+), 10 deletions(-) - -commit d5cb48681c68c3d53d8ec331ef37fb60820a9421 -Author: Emmanuele Bassi -Date: Tue Mar 4 12:30:48 2008 +0000 - - Build test-serialize-full - - Complete the porting of the old test suite into the new, GTest based one. - - The new test suite is automatically run with make test; make test-report - will generate an XML report of the test. - - The API coverage for the data types is part of the json-glib/tests - directory and will be expanded later. - - tests/Makefile.am | 8 ++++- - tests/test-serialize-full.c | 56 ++++++++++++++++++++++++++---------------- - 2 files changed, 41 insertions(+), 23 deletions(-) - -commit 1f6307ea2d7dc6ebe279d08b9f95f3074fbdd462 -Author: Emmanuele Bassi -Date: Tue Mar 4 12:18:19 2008 +0000 - - Rename test-08 into test-serialize-full - - The test-08 case was the last numbered test unit. - - tests/test-08.c | 337 ------------------------------------------- - tests/test-serialize-full.c | 337 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 337 insertions(+), 337 deletions(-) - -commit cdb194e8d64343e8bcb00e046c5fbeefd677b02a -Author: Emmanuele Bassi -Date: Tue Mar 4 12:17:29 2008 +0000 - - Rename test-07 into test-serialize-complex - - The new test-serialize-complex adds a test unit for the JsonSerializable - interface; the TestObject implements the serialization interface to - create a JSON data type from a boxed GType. - - tests/Makefile.am | 4 + - tests/test-07.c | 252 -------------------------------------- - tests/test-serialize-complex.c | 261 ++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 265 insertions(+), 252 deletions(-) - -commit 4c766a029d8f6a2d06b749527020fd93fc4a4f99 -Author: Emmanuele Bassi -Date: Tue Mar 4 12:12:37 2008 +0000 - - Fix compilation of test-serialize-simple and add it to the test suite - - The new test-serialize-simple tests the GObject integration for - serializing simple GObjects into JSON. - - tests/Makefile.am | 4 ++++ - tests/test-serialize-simple.c | 5 +++-- - 2 files changed, 7 insertions(+), 2 deletions(-) - -commit 325185c5955f8942ddf8d55a9e3b5d6a8c2723d1 -Author: Emmanuele Bassi -Date: Tue Mar 4 12:10:23 2008 +0000 - - Rename test-06 to test-serialize-simple - - tests/test-06.c | 162 ----------------------------------------- - tests/test-serialize-simple.c | 162 +++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 162 insertions(+), 162 deletions(-) - -commit cbea4698c1b7284d8004fff659a7354fb3af29ee -Author: Emmanuele Bassi -Date: Tue Mar 4 12:09:44 2008 +0000 - - Move test-06 to GTest API - - First pass into replacing the last three numbered tests into named - tests. - - tests/test-06.c | 28 ++++++++++++++++++---------- - 1 files changed, 18 insertions(+), 10 deletions(-) - -commit 5cc1d3d6061830de403ccbc10c2414f29cd1cf82 -Author: Emmanuele Bassi -Date: Tue Mar 4 10:52:51 2008 +0000 - - Coalesce JsonGenerator test cases into a single test unit - - Like we did for JsonParser, JsonGenerator has now a test unit checking the - output of a DOM built and dumped into a buffer. - - For the arrays is quite easy to verify that the output is correct; - unfortunately, JsonObject does not guarantee any ordering on the members, - with it being an associative array. Hence, for the object test case we - just compare the length of the output. - - tests/Makefile.am | 4 + - tests/test-04.c | 238 ---------------------------- - tests/test-05.c | 227 --------------------------- - tests/test-generator.c | 399 ++++++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 403 insertions(+), 465 deletions(-) - -commit e100c69a4fca046cbeb6db3fc8ba49160796d87c -Author: Emmanuele Bassi -Date: Tue Mar 4 10:44:56 2008 +0000 - - Append to EXTRA_DIST, since it was defined elsewhere - - contrib/Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 98b6e5e2f151c4ee800754675bf01e585fee850b -Author: Emmanuele Bassi -Date: Tue Mar 4 07:05:01 2008 +0000 - - Update the README - - README | 36 ++++++++++++++++++++++++++++++++++++ - 1 files changed, 36 insertions(+), 0 deletions(-) - -commit 1a078c783a5a03b3367ce59eb25248dd6e23b5c6 -Author: Emmanuele Bassi -Date: Tue Mar 4 07:05:01 2008 +0000 - - Update the README - - README | 36 ++++++++++++++++++++++++++++++++++++ - 1 files changed, 36 insertions(+), 0 deletions(-) - -commit 44891ea1040ceae95a994b646174696de7779ea1 -Author: Emmanuele Bassi -Date: Tue Mar 4 06:44:59 2008 +0000 - - Update gitignore file - - .gitignore | 11 +++++------ - 1 files changed, 5 insertions(+), 6 deletions(-) - -commit 3ea189acf52ea39653c6505c136f1f45a660a24c -Author: Emmanuele Bassi -Date: Tue Mar 4 06:34:11 2008 +0000 - - Add validation to the simple object test values - - Like for the simple arrays test case, add validation of the values types - for the members of the simple objects test case. - - tests/test-parser.c | 31 ++++++++++++++++++++++++------- - 1 files changed, 24 insertions(+), 7 deletions(-) - -commit 40b3e9330f482e002aea90b0c1a4b9db2adffff0 -Author: Emmanuele Bassi -Date: Tue Mar 4 06:27:24 2008 +0000 - - Add validation of the simple array test values - - Instead of just checking that the array contains something, the simple-array - test case should validate the contents of the array. - - The test now uses a struct defining: - - the test array - - the size of the array - - an element to check - - the type of the node for the element - - the type of the value for the node - - All the fields are checked for a match. This makes the simple arrays test - case more reliable. - - tests/test-parser.c | 40 +++++++++++++++++++++++++++++++--------- - 1 files changed, 31 insertions(+), 9 deletions(-) - -commit 7e6dab14302b94979672acf81eec8710ea95e288 -Author: Emmanuele Bassi -Date: Sun Mar 2 17:44:27 2008 +0000 - - Add array-test to the JSON-GLib types unit tests - - This simple unit will test the JsonArray API, as part of the coverage - test for the JSON-GLib types. - - json-glib/tests/Makefile.am | 10 ++++++-- - json-glib/tests/array-test.c | 50 ++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 57 insertions(+), 3 deletions(-) - -commit 441ee88a6e024fc5ab2cf8355adad1fecc276088 -Author: Emmanuele Bassi -Date: Sun Mar 2 15:09:05 2008 +0000 - - Coalesce test-03 into test-parser - - The third test under the tests/ directory was the last JsonParser test, - dealing with object parsing. Now, test-parser is complete and contains - all the JsonParser test cases. It still needs further testing to - verify the DOM created by the parser object. - - tests/test-02.c | 225 --------------------------------------------------- - tests/test-03.c | 214 ------------------------------------------------ - tests/test-parser.c | 167 ++++++++++++++++++++++++++++++++++++-- - 3 files changed, 161 insertions(+), 445 deletions(-) - -commit 71db86d84a5544d603b03721891e0ad14f92178d -Author: Emmanuele Bassi -Date: Sun Mar 2 14:58:58 2008 +0000 - - Update the tests build to be a testing unit - - Instead of having stand alone tests, use the GTest framework and start - coalescing multiple test cases into one. - - The tests directory will be used for JsonParser, JsonGenerator and - the JSON-GObject integration API, by reusing the previous test cases - and remolding them into a more interesting test framework. - - tests/Makefile.am | 39 +++++---------------------------------- - 1 files changed, 5 insertions(+), 34 deletions(-) - -commit 1e6aa16a2a6432cf96d0a86d4650c13e63c67e43 -Author: Emmanuele Bassi -Date: Sun Mar 2 14:56:56 2008 +0000 - - Remove old, empty string test - - tests/test-01.c | 57 ------------------------------------------------------- - 1 files changed, 0 insertions(+), 57 deletions(-) - -commit 989c807fd61cc65c1e4058c5d0794ae2fe438ba1 -Author: Emmanuele Bassi -Date: Sun Mar 2 14:56:28 2008 +0000 - - Rename JsonParser test, and coaelesce basic parser and array tests - - Instead of using a single test for empty strings and another test for - arrays, merge the two into a single test unit, using the GTest API. - - The JsonObject parsing test will also be merged later. - - tests/test-parser.c | 262 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 262 insertions(+), 0 deletions(-) - -commit f1e1c0e7796903abb725e8216fc54f53573ecdc9 -Author: Emmanuele Bassi -Date: Sun Mar 2 10:51:09 2008 +0000 - - Port the empty string test to the GLib testing framework - - The old test-01 program tested the JsonParser with an empty string; instead - of relying on the exit code and error messages on screen, it shoul use the - new GTest API. - - This is the first test of the old test suite to be ported to the new test - framework API. - - tests/test-01.c | 44 +++++++++++++++++++++++++++++++++++--------- - 1 files changed, 35 insertions(+), 9 deletions(-) - -commit cb5b3d5fa6244b0d20258203bd9df7e3148af57b -Author: Emmanuele Bassi -Date: Sun Mar 2 10:50:17 2008 +0000 - - Add a JsonNode copy test unit - - The test unit copies a NULL JsonNode and checks that the copy and the - original nodes are equivalent. - - json-glib/tests/node-test.c | 15 +++++++++++++++ - 1 files changed, 15 insertions(+), 0 deletions(-) - -commit 40c757835e329fe01f8f22aba74d2e47f3a5e55c -Author: Emmanuele Bassi -Date: Sun Mar 2 10:49:52 2008 +0000 - - Update Makefile templates to include the testing framework - - contrib/Makefile.am | 2 ++ - doc/Makefile.am | 2 ++ - doc/reference/Makefile.am | 1 + - tests/Makefile.am | 38 ++++++++++++++++++++++++++++++++------ - 4 files changed, 37 insertions(+), 6 deletions(-) - -commit 75939c2b43430583150b18f0a8e82e3d60a4f4f1 -Author: Emmanuele Bassi -Date: Sat Mar 1 19:35:47 2008 +0000 - - Update gitignore file - - .gitignore | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit e4be0d896359cc1d0ba99dd81a66855389ebd5df -Author: Emmanuele Bassi -Date: Sat Mar 1 19:30:41 2008 +0000 - - Add initial test suite support using GLib's new testing framework - - GLib 2.15 added a new test unit framework to the GLib API. It allows - integrating unit testing into GLib and GObject based libraries and - applications. - - It requires a specially crafter Makefile holding a set of declarations, - which must be included into the project own Makefile templates; then - it is possible to drop tests inside a subdirectory, which will be built - after the library or application, and executed upon "make check". - - At the moment, there is a simple test for the JsonNode API, with a - single unit for the "null" node type. - - Makefile.am | 4 ++- - Makefile.decl | 57 +++++++++++++++++++++++++++++++++++++++++++ - configure.ac | 3 +- - json-glib/Makefile.am | 9 ++++++- - json-glib/tests/Makefile.am | 15 +++++++++++ - json-glib/tests/node-test.c | 27 ++++++++++++++++++++ - 6 files changed, 112 insertions(+), 3 deletions(-) - -commit d313aa1e9e472834252ec173c0409eba11ebcff9 -Author: Emmanuele Bassi -Date: Fri Feb 29 16:40:33 2008 +0000 - - Update gitignore - - .gitignore | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 8a2bb3c4400b9df6cd864eb29920a7767e8170c7 -Author: Emmanuele Bassi -Date: Fri Feb 29 16:37:18 2008 +0000 - - Sanitize JsonScanner code - - Use a closure instead of (*eugh*) an array of gpointers and casting - to void*. - - Also, use the Slice allocator for the ScannerKey structs. - - json-glib/json-scanner.c | 42 ++++++++++++++++++++---------------------- - 1 files changed, 20 insertions(+), 22 deletions(-) - -commit 42f7800c5b1c30ff187fc824a9bb39565033488e -Author: Emmanuele Bassi -Date: Fri Feb 29 16:01:48 2008 +0000 - - Update JsonParser to fix compilation - - JsonParser now uses JsonScanner, the internal copy of GScanner. - - json-glib/json-parser.c | 33 +++++++++++++++++---------------- - 1 files changed, 17 insertions(+), 16 deletions(-) - -commit 314f24fd0c8c6b024c93b1d8d275f9049ef22951 -Author: Emmanuele Bassi -Date: Fri Feb 29 16:00:55 2008 +0000 - - Completely internalize the JsonScanner - - Rename all the API and the data types to the Json namespace, so we can - use the internal copy instead of GScanner. - - json-glib/json-scanner.c | 639 +++++++++++++++++++++++----------------------- - json-glib/json-scanner.h | 6 +- - 2 files changed, 328 insertions(+), 317 deletions(-) - -commit 65708000ab02d0a4080b662bb409ac4b79101488 -Author: Emmanuele Bassi -Date: Fri Feb 29 16:00:30 2008 +0000 - - Add JsonScanner to the build - - json-glib/Makefile.am | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 8e27ac27a9b22361296564d740301c2c49b387f8 -Author: Emmanuele Bassi -Date: Fri Feb 29 15:59:57 2008 +0000 - - Bump up autotools requirements - - Do not require an ancient version of automake, and settle for one slightly - less ancient. - - configure.ac | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit a475b0896d5760c893a099c9411f9790e5c492ba -Author: Emmanuele Bassi -Date: Fri Feb 29 12:24:14 2008 +0000 - - Update the JsonScanner default configuration - - json-glib/json-scanner.c | 84 +++++++++++++++++++-------------------------- - 1 files changed, 36 insertions(+), 48 deletions(-) - -commit 10ac1734b326700257ef318d9a2000c538b5cd38 -Author: Emmanuele Bassi -Date: Fri Feb 29 12:22:02 2008 +0000 - - Use JsonScanner API into JsonParser - - Rename the GScanner function calls into JsonScanner, to see what we - actually need to have public. - - Also, remove the configuration: JsonScanner will provide us with one. - - json-glib/json-parser.c | 127 ++++++++++++++++------------------------------ - 1 files changed, 44 insertions(+), 83 deletions(-) - -commit 4a4095c360fc29f766e8baba3529a78b6d736b19 -Author: Emmanuele Bassi -Date: Fri Feb 29 12:21:20 2008 +0000 - - Add json-scanner.h to the exported headers - - json-glib/json-glib.h | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 469a22e4f1fac6b4fd8110823322b7fbfa9b6552 -Author: Emmanuele Bassi -Date: Fri Feb 29 12:13:54 2008 +0000 - - Include JsonScanner into JsonParser - - json-glib/json-parser.c | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit 8537549a5a65f3111a4436b69499664c167b1534 -Author: Emmanuele Bassi -Date: Fri Feb 29 12:10:16 2008 +0000 - - Move JsonTokenType into JsonScanner - - The GTokenType extension enumeration belongs with the tokenizer. - - json-glib/json-parser.h | 15 ++------------- - 1 files changed, 2 insertions(+), 13 deletions(-) - -commit 1ddd45d36a3a25aa86a95c60e0c29e83687971bd -Author: Emmanuele Bassi -Date: Fri Feb 29 12:06:19 2008 +0000 - - Copy GScanner into JSON-GLib as JsonScanner - - Instead of writing our tokenizer we can fork GScanner and make a - specialized version for JSON (as per RFC), luckily the licenses - are compatible (LGPLv2.1 with "any later" clause). - - GScanner does not support Unicode "\uNNNN" escaping and we need to - ensure UTF-8 strings as well. - - The API will mostly be the same, but the generic bits not used by - JsonParser will be hidden: this is, after all, a specialized - tokenizer. - - json-glib/json-scanner.c | 1809 ++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-scanner.h | 167 +++++ - 2 files changed, 1976 insertions(+), 0 deletions(-) - -commit 3a9ec8f1ca9bf525875c3fbfaf1ab2f3c708bf36 -Author: Emmanuele Bassi -Date: Tue Jan 29 19:13:15 2008 +0000 - - Update the JSON-GLib Vala bindings - - Add a dependencies file, so that valac can simply use the json-glib-1.0 - package and correcly chain up all the dependencies needed (at the moment, - only glib-2.0). - - Update the vapi file to match with the GLib bindings with regards to the - out length parameters and some weak pointers. The only way to properly - solve the weak assignments issue would be to make JsonNode, JsonObject - and JsonArray proper GObjects, or at least add reference counting to - JsonNode. Not going to happend in 0.6, but it's worth adding it to the - 1.0 roadmap. - - contrib/json-glib-1.0.deps | 1 + - contrib/json-glib-1.0.vapi | 14 +++++----- - contrib/json-test.vala | 62 +++++++++++++++++++++---------------------- - 3 files changed, 38 insertions(+), 39 deletions(-) - -commit e8a59f086f43e5abd5414033ea8c9a886eb112ed -Author: Emmanuele Bassi -Date: Tue Jan 29 19:12:35 2008 +0000 - - Remove % from the pkg-config file rule - - Rules starting with '%' are a make-isms, and automake 1.10 complains a - lot about them. - - Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit b6963328f3d8d8e85ca0b21f9bdeca77b5611019 -Author: Emmanuele Bassi -Date: Tue Jan 29 18:19:16 2008 +0000 - - Remove json_parser_peek_root from the gtk-doc sections - - The json_parser_peek_root() function has been removed, and so we do not - its symbol in the json-glib-sections.txt file anymore. - - doc/reference/json-glib-sections.txt | 1 - - 1 files changed, 0 insertions(+), 1 deletions(-) - -commit 48079c2f580171235eecc298b0193022a67e0b79 -Author: Emmanuele Bassi -Date: Tue Jan 29 18:18:01 2008 +0000 - - Update after the JsonParser::get_root change - - Do not free the root node returned by the get_root() method in the - JSON-GObject API and in the JsonParser tests. - - json-glib/json-gobject.c | 4 +--- - tests/test-01.c | 2 +- - tests/test-02.c | 2 -- - tests/test-03.c | 2 -- - 4 files changed, 2 insertions(+), 8 deletions(-) - -commit a86a300fdc256ad4270881cf9b7b97367cd87c87 -Author: Emmanuele Bassi -Date: Tue Jan 29 18:14:49 2008 +0000 - - Revert JsonParser::get_root semantics - - The get_root() method should not return a copy of the parsed node: it is - up to the developer copying it, if it needs to be kept around across multiple - parsing runs. - - This commit reverts the 0b6b09c0 commit, by removing the peek_root() method - and restoring the previous get_root() method behaviour. - - json-glib/json-parser.c | 26 ++------------------------ - json-glib/json-parser.h | 1 - - 2 files changed, 2 insertions(+), 25 deletions(-) - -commit 9a167068edcde51b50a15bab4ee8623994eb9c04 -Author: Emmanuele Bassi -Date: Mon Jan 28 11:02:30 2008 +0000 - - Use the normalized member name in has_member - - The json_object_has_member() used the passed in member name, instead of - the correctly normalized one. - - json-glib/json-object.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit f2f08d282ac6bc69ba9029d065979b1332abd5a5 -Author: Emmanuele Bassi -Date: Sun Jan 27 21:26:51 2008 +0000 - - Extract the parser state clearing into its own function - - The JsonParser object clears its state upon starting the parsing sequence - or during the instance destruction process. It's worth moving the free - and unref calls into their own function to be called by the load_from_data() - and dispose methods. As further optimisation, inlining them should be - worth as well. - - json-glib/json-parser.c | 51 +++++++++++++++++++++++++++------------------- - 1 files changed, 30 insertions(+), 21 deletions(-) - -commit 629d4a54913c578d7b612f10d9b04addc8e0c7fb -Author: Emmanuele Bassi -Date: Tue Dec 25 21:44:03 2007 +0000 - - Wrap config.h include with conditionals - - Including the autotools generated config.h should always be conditional - on the HAVE_CONFIG_H definitions. - - json-glib/json-array.c | 2 ++ - json-glib/json-generator.c | 2 ++ - json-glib/json-gobject.c | 2 ++ - json-glib/json-node.c | 3 +++ - json-glib/json-object.c | 2 ++ - 5 files changed, 11 insertions(+), 0 deletions(-) - -commit e172e9ccec88999e7d8433df08d8d92568537cf7 -Author: Emmanuele Bassi -Date: Tue Dec 25 21:41:44 2007 +0000 - - Kill off a few indirections - - Use an intermediary pointer to avoid a lot of pointer dereferences - - json-glib/json-parser.c | 25 ++++++++++++++----------- - 1 files changed, 14 insertions(+), 11 deletions(-) - -commit 61a6a144a2182946be4fb975d05e1c26d814c323 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:55:36 2007 +0000 - - Some miscellaneous fixes to the Vala bindings - - Expose the properties as members and remove the accessor methods in case - it's obvious that they are just function proxies. - - Also, start binding the basic GObject API, even though no serializable - support is ready, yet. - - contrib/json-glib-1.0.vapi | 21 ++++++++++-- - contrib/json-object.vala | 10 ++++- - contrib/json-test.vala | 81 ++++++++++++++++++++++++++++++++------------ - 3 files changed, 85 insertions(+), 27 deletions(-) - -commit 8ec0c93715f6f43e4829a6f3ac534f9ec05e0363 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:53:04 2007 +0000 - - Provide a default implementation of JsonSerializable - - The JsonSerializable interface can provide a default implementation, using - the powers of GTypeInterface. This means that classes implementing the - interface can opt to implement both, either or none of the JsonSerializable - methods, and still be able to retain some basic functionality for the methods - they decide not to implement. - - json-glib/json-gobject.c | 208 ++++++++++++++++++++++++++------------------- - 1 files changed, 120 insertions(+), 88 deletions(-) - -commit 5bb6dd7b77dcd0d1996f484990223287d2144ff3 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:51:20 2007 +0000 - - Plug a leak when loading a new buffer with the same parser - - When the same JsonParser loads a different buffer it needs to clear out the - current state; this means clearing the variable_name string it saves when - the passed JSON stream is a JavaScript assignment. - - json-glib/json-parser.c | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit a90a842f269314c4423de9d84d03391a8efbd7b5 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:49:20 2007 +0000 - - Use gssize for the buffer length parameter - - Since we allow a negative value, meaning "take the whole string", for the - length parameter, when need a signed size_t. This also fixes the bug where - we implicitly always computed the buffer length and discarded the passed - length parameter. - - json-glib/json-parser.c | 10 +++++----- - json-glib/json-parser.h | 2 +- - 2 files changed, 6 insertions(+), 6 deletions(-) - -commit 7229b9bf0bd15c6c1e5b695f8e291218a041ab45 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:47:10 2007 +0000 - - Initialise to zero when creating/copying a JsonNode - - Avoid feeding garbage to the callers by using g_slice_new0(). - - json-glib/json-node.c | 9 +++++---- - 1 files changed, 5 insertions(+), 4 deletions(-) - -commit ba7282dd23e2980203208cb73942535bfefa5906 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:45:56 2007 +0000 - - Do not leak the intermediate strings when generating JSON - - Found this very dumb leak while using Valgrind. - - json-glib/json-generator.c | 6 ++++++ - 1 files changed, 6 insertions(+), 0 deletions(-) - -commit 193aca9aabbfc3db8e1faca0a65b19ac7ba96341 -Author: Emmanuele Bassi -Date: Tue Dec 25 11:44:18 2007 +0000 - - Do not free the pointer to the boxed type we get when serialising - - The pointer returned by g_value_get_boxed() is just a pointer to the internal - copy inside GValue, and it's not ours to free, as Valgrind gently pointed - out. - - tests/test-07.c | 2 -- - 1 files changed, 0 insertions(+), 2 deletions(-) - -commit a6fae2d61b1cfefa742574761edc19c8d6f702f5 -Author: Emmanuele Bassi -Date: Thu Nov 22 16:00:35 2007 +0000 - - Add a simple Vala serialization example - - We don't provide the Serializable interface at the moment, because it - is too much C-oriented. This example shows how to serialize a class in - Vala to a JSON string. - - contrib/json-object.vala | 40 ++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 40 insertions(+), 0 deletions(-) - -commit ea6cc8756f70d488eae128e4a01f63ce2766cc3a -Author: Emmanuele Bassi -Date: Thu Nov 22 15:59:25 2007 +0000 - - Omit the lenght argument now that we provide a default - - contrib/json-test.vala | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 9492f3439dd491bb5afadfe6b2bd49a72ec9bb1e -Author: Emmanuele Bassi -Date: Thu Nov 22 15:58:23 2007 +0000 - - Fix the Vala bindings - - Miscellaneous fixes for the Vala bindings of JSON-GLib: - * add missing return values for a couple of methods - * decorate the Object and Array constructors with their C names - * correctly transfer the ownership when adding members/elements - * add the non-null value marker for strings - * provide default values for the length argument in from_data()/to_data() - - contrib/json-glib-1.0.vapi | 20 +++++++++++--------- - 1 files changed, 11 insertions(+), 9 deletions(-) - -commit a255b4f5eb8769c444a9ac3a4cc7404fccd44ee3 -Author: Emmanuele Bassi -Date: Thu Nov 22 00:01:37 2007 +0000 - - Recurse into the contrib directory only if Vala is available - - If Vala is not available then there's no point in getting into the - contrib directory. This might change in the future, so we already - have the HAVE_VALA conditional for the Makefiles. - - Makefile.am | 8 +++++++- - configure.ac | 3 +++ - 2 files changed, 10 insertions(+), 1 deletions(-) - -commit aa8911ca4d63bfb3dd34997f9a745d70d12673af -Author: Emmanuele Bassi -Date: Wed Nov 21 20:44:08 2007 +0000 - - Update the test case for the Vala bindings - - contrib/json-test.vala | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 7083e9e6733611b5313f0708c4b93b9726ef26d0 -Author: Emmanuele Bassi -Date: Wed Nov 21 20:43:35 2007 +0000 - - Wrap the newly added API in the Vala bindings - - Add the Json.Object.dup_member() and Json.Array.dup_element() functions. - Also, export the JSON_NODE_TYPE() macro as Json.Node.type() method. - - contrib/json-glib-1.0.vapi | 8 ++++++-- - 1 files changed, 6 insertions(+), 2 deletions(-) - -commit 9d4588e97a88960a4dd6a28debb3cb0f8d75f098 -Author: Emmanuele Bassi -Date: Wed Nov 21 20:42:07 2007 +0000 - - Add symbols of the newly committed API - - doc/reference/json-glib-sections.txt | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit cf2eceeb69ccbda4f2ff583ee7869c7fd3cda603 -Author: Emmanuele Bassi -Date: Wed Nov 21 20:41:42 2007 +0000 - - Add API to retrieve copies of the nodes inside objects and arrays - - Getting copies of the nodes might work better for high level languages - binding the JSON-GLib API, because they can manage the lifetime of the - returned values using their own rules. - - json-glib/json-array.c | 29 +++++++++++++++++++++++++++++ - json-glib/json-object.c | 29 +++++++++++++++++++++++++++++ - json-glib/json-types.h | 4 ++++ - 3 files changed, 62 insertions(+), 0 deletions(-) - -commit 5a4a8761af0562fbee8e1a56ce1771a20c1ad8e3 -Author: Emmanuele Bassi -Date: Wed Nov 21 20:07:12 2007 +0000 - - Fix leaks in the test suite - - Dispose the root node when using the JsonParser and JsonGenerator - objects after the change in sematics for their accessors. - - tests/test-01.c | 2 +- - tests/test-02.c | 2 ++ - tests/test-03.c | 2 ++ - tests/test-04.c | 8 ++++++++ - tests/test-05.c | 6 ++++++ - 5 files changed, 19 insertions(+), 1 deletions(-) - -commit ac699263493e09eeb203f9bf88c0a8296f9e4a8f -Author: Emmanuele Bassi -Date: Wed Nov 21 20:06:06 2007 +0000 - - Free the root node obtained using json_parser_get_root() - - Update json_construct_gobject() to the change of behaviour in the - root node getter function of JsonParser. - - json-glib/json-gobject.c | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 0b6b09c0fe2fdd21b18593192e7213d1b0098f12 -Author: Emmanuele Bassi -Date: Wed Nov 21 20:05:07 2007 +0000 - - Change json_parser_get_root() semantics - - The json_parser_get_root() returns a pointer to the root node. This does - not conform to the API naming convention inherited from GLib, where - functions returning an internal pointer are called "peek" and function - returning a copy are called "get". - - Thus, json_parser_get_root() will now return a copy of the root node and - it is left to the developer to free the returned JsonNode. - - A function returning the pointer has also been added, and it's called - json_parser_peek_root(). - - json-glib/json-parser.c | 26 ++++++++++++++++++++++++-- - json-glib/json-parser.h | 2 ++ - 2 files changed, 26 insertions(+), 2 deletions(-) - -commit 5f110dc5ad338497c95418b9ad1b267c95fb8ded -Author: Emmanuele Bassi -Date: Wed Nov 21 18:39:04 2007 +0000 - - Add JSON-GLib Vala bindings - - Add bindings for the basic JSON-GLib API. GObject API will arrive later. - - Makefile.am | 2 +- - configure.ac | 12 +++++ - contrib/Makefile.am | 4 ++ - contrib/json-glib-1.0.vapi | 118 ++++++++++++++++++++++++++++++++++++++++++++ - contrib/json-test.vala | 87 ++++++++++++++++++++++++++++++++ - 5 files changed, 222 insertions(+), 1 deletions(-) - -commit 557a60b4e0f1fd6fc0fa79efc60f9bfd777e0670 -Author: Emmanuele Bassi -Date: Wed Nov 21 14:52:15 2007 +0000 - - Use a unicode character for the indent-char property of JsonGenerator - - The indent character should be any Unicode character available instead - of a generic char. - - json-glib/json-generator.c | 16 ++++++++-------- - tests/test-05.c | 6 +++++- - 2 files changed, 13 insertions(+), 9 deletions(-) - -commit 5fc37f8f2a1594821623419f75ceaa4b95fe07cf -Author: Emmanuele Bassi -Date: Wed Nov 21 01:39:00 2007 +0000 - - Add the indent-char property to JsonGenerator - - The JsonGenerator:indent-char can be used to control the character that - indents the lines when pretty printing. - - json-glib/json-generator.c | 54 ++++++++++++++++++++++++++++++++----------- - 1 files changed, 40 insertions(+), 14 deletions(-) - -commit 58133b51152ca76b8cb5c93b5991f9b1a565e9a9 -Author: Emmanuele Bassi -Date: Wed Nov 21 01:20:20 2007 +0000 - - Use G_TYPE_DOUBLE when dumping a value. - - JsonNode of type value for floating point numbers is G_TYPE_DOUBLE - and not G_TYPE_FLOAT anymore. - - json-glib/json-generator.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit 80006db7bcea2bd8c44a648a64ba3da6a05a6fd1 -Author: Emmanuele Bassi -Date: Tue Nov 20 18:30:42 2007 +0000 - - Test correct deserialization of enum values - - Update the GObject deserialization test suite to check for the correct - deserialization of the enum/flags values. - - tests/test-08.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++------ - 1 files changed, 53 insertions(+), 7 deletions(-) - -commit 1110e098fa879abf7f67f24af2a1b736ce359dd6 -Author: Emmanuele Bassi -Date: Tue Nov 20 18:20:33 2007 +0000 - - Allow deserialization of strings into enums/flags - - If the target value is a G_TYPE_ENUM or a G_TYPE_FLAGS we can effectively - deserialize a string into the corresponding value (or bit mask) using - the introspection API for the GEnum and GFlags types. - - This code is taken from ClutterScript and it was adapted from GtkBuilder. - - json-glib/json-gobject.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 170 insertions(+), 0 deletions(-) - -commit 2674ce68e574cebeca147944cf748b41fbe27507 -Author: Emmanuele Bassi -Date: Tue Nov 13 11:34:05 2007 +0000 - - Bump up to 0.5.0 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit c1547eb3aba6f09b3ce4c23bd66a798e03b35a34 -Author: Emmanuele Bassi -Date: Tue Nov 13 11:29:19 2007 +0000 - - Bump up to 0.4.0 - - NEWS | 9 +++++++++ - configure.ac | 2 +- - 2 files changed, 10 insertions(+), 1 deletions(-) - -commit 03325e108e40d5deba979852ee402d7d6579ac81 -Author: Emmanuele Bassi -Date: Tue Nov 13 11:20:34 2007 +0000 - - Fix variable shadowing for distcheck - - json-glib/json-parser.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit afeec9b40468d289351c78007b5122ff716bb977 -Author: Emmanuele Bassi -Date: Tue Nov 13 11:16:51 2007 +0000 - - Add 0.4 symbols index - - doc/reference/json-glib-docs.sgml | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit 32023e03ca9c976e66b9af949d4aea36e1d4d874 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:59:14 2007 +0000 - - Change "responsible" to "asked" in the (de)serialization functions docs - - We provide fallbacks in case a JsonSerializable object does not translate - a property into a JSON object member and vice versa. - - json-glib/json-gobject.c | 15 ++++++++------- - 1 files changed, 8 insertions(+), 7 deletions(-) - -commit c669a28d37795be68f3a51e9353f6f9d8e695a52 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:55:23 2007 +0000 - - Add new symbols to the documentation - - doc/reference/json-glib-sections.txt | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletions(-) - -commit b83a2bfa96885837ca48bacb6492fd68a2b5b564 -Merge: 1f9b3e5 198ed83 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:51:58 2007 +0000 - - Merge branch 'gobject-deserialize' into work - -commit 198ed839424dc7791d22dede152f4d7abc16a8b2 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:51:31 2007 +0000 - - Use the fallback value-to-node generator even for serializables - - To avoid reimplementing the same code all over again, if the implementation - of the serialize_property virtual function of JsonSerializable returns NULL - we will fall back to the simple value-to-node generator we provide for - non-serializable classes. - - json-glib/json-gobject.c | 17 +++++++++++------ - tests/test-07.c | 13 +------------ - 2 files changed, 12 insertions(+), 18 deletions(-) - -commit 10e937a68bd802a4f5948d900aa2201344cfc138 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:46:02 2007 +0000 - - Add test unit for the GObject deserialization - - .gitignore | 2 + - tests/Makefile.am | 4 +- - tests/test-08.c | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 296 insertions(+), 1 deletions(-) - -commit 7b93db7ad996b29a6c576db33803029dc94e16fc -Author: Emmanuele Bassi -Date: Tue Nov 13 10:45:23 2007 +0000 - - Fix a couple of dumb typos in the GObject deserialization code - - We need to skip if the CONSTRUCT_ONLY flag is set, not unset. We also need - to copy the value from the JSON node into the target GValue, not the other - way around. - - json-glib/json-gobject.c | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -commit 9e61004365982017bfe9b76889e2a7d1a0320350 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:11:34 2007 +0000 - - Update git ignore file - - .gitignore | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit 4b496c7d906c81dceafe6a5f442b55b6e161f762 -Author: Emmanuele Bassi -Date: Tue Nov 13 10:11:00 2007 +0000 - - Add node-to-property simple fallback parser for deserialization - - The fallback parser for json_construct_gobject() is invoked if the GType - does not implement the JsonSerializable interface, or if the interface - was not handling the property. - - It will natively convert integers, booleans, strings and double precision - floating point values; it also handles string vectors in form of arrays. - - json-glib/json-gobject.c | 94 +++++++++++++++++++++++++++++++++++++++++---- - 1 files changed, 85 insertions(+), 9 deletions(-) - -commit a7c39c910e08093ee0d0723685005623f26b9eae -Author: Emmanuele Bassi -Date: Tue Nov 13 09:28:57 2007 +0000 - - Add the JsonGenerator:root property - - JsonGenerator now has a :root property, so it can be constructed using - just g_object_new(): - - generator = g_object_new (JSON_TYPE_GENERATOR, - "pretty", TRUE, - "indent", 4, - "root", node, - NULL); - - This means that the root node is copied inside the generator, instead of - just taking ownership (it was quite confusing). The documentation now - clearly states what happens, and that you can safely free the node after - feeding it to the JsonGenerator. - - json-glib/json-generator.c | 30 ++++++++++++++++++++++++++++-- - 1 files changed, 28 insertions(+), 2 deletions(-) - -commit 6132d7325c33e26740b4c955d8ccbe53fd817cd8 -Author: Emmanuele Bassi -Date: Tue Nov 13 09:26:02 2007 +0000 - - Fix member name in json_node_get_value_type() - - JsonNode payload is inside a union. - - json-glib/json-node.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit f051b948714e4928a7d7f903e891639ce4ba82fd -Author: Emmanuele Bassi -Date: Tue Nov 13 09:17:22 2007 +0000 - - Add a GType for JsonNode - - We need a GType for nodes if we want to add JsonNode properties or signal - marshallers to a GObject class. We could use pointers, but we'd loose type - safety, so it's a no-no. - - json-glib/json-node.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 8 ++++++-- - 2 files changed, 54 insertions(+), 2 deletions(-) - -commit 1f9b3e50282f8aa4a421c83ad596f6186ef82ec9 -Author: Emmanuele Bassi -Date: Sat Nov 10 15:12:20 2007 +0000 - - When parsing a full assignment, also swallow any trailing semi-colon - - There's no end to web developers insanity when they can twist and turn a - perfectly simple and elegant notation into something that allows lazyness - and breakage. - - json-glib/json-parser.c | 12 +++++++++++- - tests/test-02.c | 1 + - 2 files changed, 12 insertions(+), 1 deletions(-) - -commit 261d05a4cdcc1f64824615cdc81b4b467d0a5f57 -Author: Emmanuele Bassi -Date: Sat Nov 10 02:15:44 2007 +0000 - - Add support for parsing assignments - - Some JSON web APIs return a full JavaScript assignment instead of just - the data structure (and I'm looking at you, Tumblr). This is done in clear - violation of the grammar published in the RFC 4627, and it's evidently - done because most web developers are too lazy for doing a - - var foo = eval('(' + text ')'); - - and want everything defined for them. JsonParser will blissfully ignore - the left-hand part of the assignment but, in the interest of the developer - who cares, will record: 1. that the parsed statement was in fact an - assignment and 2. the name of the variable used. - - The function json_parser_has_assignment() can be used to query both the - presence of an assignment and the variable name at the same time. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-parser.c | 80 +++++++++++++++++++++++++++++++++- - json-glib/json-parser.h | 5 ++ - tests/test-02.c | 5 ++ - 4 files changed, 89 insertions(+), 2 deletions(-) - -commit 45c697263364a975fd6a54373f999f2932436b6f -Author: Emmanuele Bassi -Date: Sat Nov 10 01:26:46 2007 +0000 - - Initial implementation of GObject deserialization function - - The json_construct_gobject() function takes a GType and a JSON data stream - and constructs a new instance for the given type. If the type is a - JsonSerializable, it will use the JsonSerializable interface for parsing - the JsonNodes of each object member. - - This is the initial implementation of the function: the JsonNode-to-GValue - fallback parser is just a stub. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-gobject.c | 182 +++++++++++++++++++++++++++++++--- - json-glib/json-gobject.h | 8 +- - 3 files changed, 177 insertions(+), 14 deletions(-) - -commit 4eade1089355ebcf0614d0cfbc9c441513b7d97a -Author: Emmanuele Bassi -Date: Mon Oct 29 22:23:36 2007 +0000 - - Fix objects test suite to match the arrays one - - tests/test-03.c | 8 ++++---- - 1 files changed, 4 insertions(+), 4 deletions(-) - -commit 3948d83795d68d665b8b969c08b6c40498eb2661 -Author: Emmanuele Bassi -Date: Mon Oct 29 22:23:07 2007 +0000 - - More sanity checks for objects - - Add a check for commas after complex data types inside object members. - - json-glib/json-parser.c | 8 +++++++- - 1 files changed, 7 insertions(+), 1 deletions(-) - -commit 6182457fa305a1f159e9009d3fbef42a93f2768e -Author: Emmanuele Bassi -Date: Mon Oct 29 22:17:44 2007 +0000 - - Fix the test suite for arrays - - Fix a typo in test number 7 (missing comma to separate the C strings) and - use G_TYPE_DOUBLE instead of G_TYPE_FLOAT for the floating point values. - - tests/test-02.c | 8 ++++---- - 1 files changed, 4 insertions(+), 4 deletions(-) - -commit 25cdc18be8acdad54561f919c5805ad4fa9b3ac9 -Author: Emmanuele Bassi -Date: Mon Oct 29 22:16:31 2007 +0000 - - Add more sanity checks to the parser - - Catch missing commas after an array element or an object member. - - json-glib/json-parser.c | 10 ++++++++++ - 1 files changed, 10 insertions(+), 0 deletions(-) - -commit 812422e4ed4df83374cdda6d94637448ab94dfef -Author: Emmanuele Bassi -Date: Mon Oct 29 18:18:34 2007 +0000 - - Backport fixes from Clutter trunk - - The copy of JSON-GLib in Clutter trunk has two fixes for the JsonParser - object: - - * support for negative numbers (ints and floats); - * correct parse error propagation - - which should make the JsonParser hopefully complete. - - json-glib/json-parser.c | 123 +++++++++++++++++++++++++++++++++++++++-------- - 1 files changed, 103 insertions(+), 20 deletions(-) - -commit 72d007d865a822875dfa311698fb2d13f5d3df69 -Author: Emmanuele Bassi -Date: Mon Oct 29 18:16:24 2007 +0000 - - Check if the payload is set in json_node_free() - - Before calling json_object_unref() or json_array_unref() in json_node_free() - we need to check if the payload of JsonNode is set to avoid a critical. - - json-glib/json-node.c | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -commit 59a66484befba457eda2ee7a9540f2b33ff04031 -Author: Emmanuele Bassi -Date: Tue Oct 16 23:20:22 2007 +0100 - - Add test unit for the JsonSerializable interface - - This should have been done before relasing 0.2.0. Well, that's what - point releases are for. - - tests/Makefile.am | 4 +- - tests/test-07.c | 265 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 268 insertions(+), 1 deletions(-) - -commit 34515af7bb1d69317b9e52d0ced92beaf6770e7d -Author: Emmanuele Bassi -Date: Tue Oct 16 23:19:35 2007 +0100 - - We need the actual implementation of the JsonSerializable GType function - - A placeholder, while syntactically correct, won't do. - - json-glib/json-gobject.c | 6 ++++++ - 1 files changed, 6 insertions(+), 0 deletions(-) - -commit 0656c4bee8e14c375481c89a62f0e6e95be758ce -Author: Emmanuele Bassi -Date: Tue Oct 16 23:18:47 2007 +0100 - - Fix the compiler fixes - - This is what happens when you fix a compiler warning about a shadowing - variable and you don't run the test suite to check the results. - - json-glib/json-generator.c | 10 ++++++---- - 1 files changed, 6 insertions(+), 4 deletions(-) - -commit 88794df33e08cb409f71d1aaf702cd509b600954 -Author: Emmanuele Bassi -Date: Tue Oct 16 19:53:27 2007 +0100 - - Bump up to 0.3.0 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 0ce3bf30d84aedcf5f8f75e6c1112d91dcc1d654 -Author: Emmanuele Bassi -Date: Tue Oct 16 19:49:42 2007 +0100 - - Bump up to 0.2.0 - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 77248800533f3dabfb09dfa8ba32e3084ea62d5f -Author: Emmanuele Bassi -Date: Tue Oct 16 19:43:27 2007 +0100 - - Fix DISTCHECK configure flags - - Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 70be36c97a8cd598af061eb9ac5a9a5852858682 -Author: Emmanuele Bassi -Date: Tue Oct 16 19:42:05 2007 +0100 - - Fix compilation errors with extra maintainer CFLAGS - - json-glib/json-array.c | 2 +- - json-glib/json-generator.c | 16 ++++++++-------- - json-glib/json-parser.c | 4 ++-- - 3 files changed, 11 insertions(+), 11 deletions(-) - -commit 57c39582818b8a6579fed327f5c6e2fc34e93694 -Author: Emmanuele Bassi -Date: Tue Oct 16 19:41:18 2007 +0100 - - Drop -Wextra from the maintainer CFLAGS - - Some autogenerated code caused -Werror to croak, so -Wextra has to go. - - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -commit 9c690da734ee4513f19841f93a08ae35bbaa65b1 -Author: Emmanuele Bassi -Date: Tue Oct 16 18:20:19 2007 +0100 - - Autogenerate the ChangeLog when disting - - Makefile.am | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit 95fc9c4fb5af82c766d2f4f515b361028bc348e7 -Author: Emmanuele Bassi -Date: Tue Oct 16 18:20:01 2007 +0100 - - Fix EXTRA_DIST files for distcheck - - json-glib/Makefile.am | 16 +++++++++------- - 1 files changed, 9 insertions(+), 7 deletions(-) - -commit 87a36b8a5e23f3cf80730627f9b89061934a5bbf -Author: Emmanuele Bassi -Date: Tue Oct 16 17:40:06 2007 +0100 - - Add the JsonSerializable interface - - The JsonSerializable interface allows implementations to override the - GObject-to-JSON serialization process, by providing two virtual methods - to control the (de)serialization of GObject properties. This way it's - possible to serialize GObjects with properties holding complex data types. - - doc/reference/json-glib-sections.txt | 15 +++ - json-glib/json-gobject.c | 188 ++++++++++++++++++++++++++++------ - json-glib/json-gobject.h | 51 +++++++++ - json-glib/json-types.h | 1 + - 4 files changed, 224 insertions(+), 31 deletions(-) - -commit 85cb0f44c4c7297a75141999674f3eb0fdf6a308 -Author: Emmanuele Bassi -Date: Tue Oct 16 17:25:08 2007 +0100 - - Add a method for getting all the nodes from a JsonObject - - To map json_array_get_elements(), a json_object_get_values() method has - been added which returns the list of JsonNodes contained by a JsonObject. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-object.c | 41 ++++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 1 + - 3 files changed, 43 insertions(+), 0 deletions(-) - -commit 474ecf1cc6aae35b184edffc75fc8626c3f12f61 -Author: Emmanuele Bassi -Date: Tue Oct 16 16:40:57 2007 +0100 - - Add a note in the JsonObject documentation for the member name normalization - - json-glib/json-object.c | 6 +++++- - 1 files changed, 5 insertions(+), 1 deletions(-) - -commit 93e26b94d9bb1909f3b16a4b0500f27660d7e621 -Author: Emmanuele Bassi -Date: Tue Oct 16 16:37:01 2007 +0100 - - Normalize every member name before using it - - Every member name is stored inside the internal hash table of JsonObject - using a normalized string: every delimiter found matching G_STR_DELIMITERS - is automatically transformed in an underscore ('_'). - - This means that "member-name" and "member_name" are completely equivalent - for a JsonObject. - - json-glib/json-object.c | 31 ++++++++++++++++++++++++++----- - 1 files changed, 26 insertions(+), 5 deletions(-) - -commit 73a7671dedfd3bb9bc1a8c197a68dcef90e627f7 -Author: Emmanuele Bassi -Date: Mon Oct 15 10:28:39 2007 +0100 - - Provide an internal g_hash_table_get_keys() and bump down GLib dependency - - Even though GLib 2.14 is now available, many systems still come out with - GLib 2.12. Since we are using just a single 2.14 function for retrieving - the members from a JsonObject, we can provide an internal version of that - function and hideit behind a pre-processor macro. - - configure.ac | 2 +- - json-glib/json-object.c | 25 +++++++++++++++++++++++++ - 2 files changed, 26 insertions(+), 1 deletions(-) - -commit 28928a2f1cbe83a2f1bf699c915daa6eca80f587 -Author: Emmanuele Bassi -Date: Mon Oct 15 10:25:09 2007 +0100 - - Add API for removing nodes from arrays and objects - - Write and document json_object_remove_member() and json_array_remove_element() - which can be used to remove a JsonNode from a JsonObject or a JsonArray - respectively. This way, the JsonObject and JsonArray are API-complete and - the object model can be manipulated in code. - - doc/reference/json-glib-sections.txt | 2 + - json-glib/json-array.c | 18 +++++ - json-glib/json-object.c | 17 +++++ - json-glib/json-types.h | 126 +++++++++++++++++---------------- - 4 files changed, 102 insertions(+), 61 deletions(-) - -commit b3ecd6e2fbdd58250427f406c43d60b8cb8d2644 -Author: Emmanuele Bassi -Date: Wed Oct 10 12:03:59 2007 +0100 - - Parse bare root values - - If the root node contains just a bare value (true, false, null, fundamental - type) then it's still valid JSON. - - Also, use the commodity JsonNode API to avoid using values in the parser - code. - - json-glib/json-parser.c | 79 +++++++++++++++++----------------------------- - 1 files changed, 29 insertions(+), 50 deletions(-) - -commit a7839a06da53d32eb372b4813e5883a04e1c36b7 -Author: Emmanuele Bassi -Date: Tue Oct 9 20:52:56 2007 +0100 - - Add the forgotten JsonGenerator type function - - doc/reference/json-glib.types | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit daeef3345c3a7f3325cea8c945f0e1d814defcc1 -Author: Emmanuele Bassi -Date: Mon Oct 8 18:29:44 2007 +0100 - - Add json_node_dup_string() - - The newly added json_node_dup_string() is a convenience function for - getting a copy of the string contained inside a JsonNode. - - doc/reference/json-glib-sections.txt | 1 + - json-glib/json-node.c | 20 ++++++++++++++++++++ - json-glib/json-types.h | 1 + - 3 files changed, 22 insertions(+), 0 deletions(-) - -commit b12efcec57fff6e7637fc924fc50333b97eb2594 -Author: Emmanuele Bassi -Date: Sun Oct 7 00:47:32 2007 +0100 - - Fix documentation about the ownership of the nodes - - When adding a JsonNode to a JsonObject or a JsonArray, the containers - take ownership of the node. - - json-glib/json-array.c | 7 +++++-- - json-glib/json-object.c | 13 ++++++++----- - 2 files changed, 13 insertions(+), 7 deletions(-) - -commit bd5a60ca658257752993ccea47950b97cdc45246 -Author: Emmanuele Bassi -Date: Fri Oct 5 18:24:27 2007 +0100 - - Add convenience accessors for fundamental types in JsonNode - - This commit adds some convenience accessors for setting and - getting fundamental types in and from a JsonNode, to avoid - jumping through all the GValue hoops. - - doc/reference/json-glib-sections.txt | 8 ++ - json-glib/json-node.c | 201 ++++++++++++++++++++++++++++++++++ - json-glib/json-types.h | 12 ++ - 3 files changed, 221 insertions(+), 0 deletions(-) - -commit ad95c8bf8e4103058d42ae71f47e6980e3b52c34 -Author: Emmanuele Bassi -Date: Fri Oct 5 18:23:15 2007 +0100 - - Use doubles when parsing, not floats - - GScanner advertise the floating point values as floats, but it really - uses doubles. Hence, we need to use G_TYPE_DOUBLE when saving the - parsed constants into a GValue. - - json-glib/json-parser.c | 8 ++++---- - 1 files changed, 4 insertions(+), 4 deletions(-) - -commit 220838e4e61c5a8fd9cf627da7309acf44fa82f0 -Author: Emmanuele Bassi -Date: Fri Oct 5 16:39:10 2007 +0100 - - Add line/position getters to JsonParser - - Add two methods to JsonParser to retrieve the currently parsed line - and position within that line. These methods works only while parsing, - so within the signal handlers and inside subclasses. - - doc/reference/json-glib-sections.txt | 6 ++++ - json-glib/json-parser.c | 46 +++++++++++++++++++++++++++++++-- - json-glib/json-parser.h | 21 +++++++++------ - 3 files changed, 61 insertions(+), 12 deletions(-) - -commit ea5ee264a5b82fd1d09fa84ec81e17c4ea0d0c4a -Author: Emmanuele Bassi -Date: Fri Oct 5 15:13:21 2007 +0100 - - Document the newly added signals - - json-glib/json-parser.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-parser.h | 10 ++++++- - 2 files changed, 73 insertions(+), 1 deletions(-) - -commit fa9d1676da588306be5a14bcab100ad58a41b799 -Author: Emmanuele Bassi -Date: Fri Oct 5 11:59:44 2007 +0100 - - Add more signals to the JsonParser class - - JsonParser should emit signals in critical places, like: start/end of - the parsing process; start and end of a JsonObject and a JsonArray; - completion of every member and element of a JsonObject and a JsonArray. - These signals require the addition of some custom marshaller. - - json-glib/json-marshal.list | 4 ++ - json-glib/json-parser.c | 118 +++++++++++++++++++++++++++++++++++++++++- - json-glib/json-parser.h | 25 ++++++++- - 3 files changed, 141 insertions(+), 6 deletions(-) - -commit aa2b31234f7cfac63b870e8d9d74e682b3121d4a -Author: Emmanuele Bassi -Date: Fri Oct 5 11:57:53 2007 +0100 - - Implement the GType functions for JsonObject and JsonArray - - The type functions for the JsonObject and JsonArray types were declared, - albeit with the wrong return value, but not implemented. This commit - fixed the return value and implements them. - - JsonObject and JsonArray are boxed types because we don't need them to - be GObjects (no signals, no inheritance and their implementation must be - completely opaque for the developer). - - json-glib/json-array.c | 13 +++++++++++++ - json-glib/json-object.c | 13 +++++++++++++ - json-glib/json-types.h | 4 ++-- - 3 files changed, 28 insertions(+), 2 deletions(-) - -commit bd41854505f47d2176ea4cfba8083ce998c482cc -Author: Emmanuele Bassi -Date: Tue Oct 2 12:13:23 2007 +0100 - - Document the GObject integration API into the API reference - - doc/reference/json-glib-docs.sgml | 6 ++++++ - doc/reference/json-glib-sections.txt | 6 ++++++ - 2 files changed, 12 insertions(+), 0 deletions(-) - -commit cea3f69f2cde1cb4e6ea9242f6014b31864ad80f -Author: Emmanuele Bassi -Date: Tue Oct 2 12:12:49 2007 +0100 - - Add test case for GObject integration - - .gitignore | 2 + - tests/Makefile.am | 4 +- - tests/test-06.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 159 insertions(+), 1 deletions(-) - -commit 3666613e47b66d67a28bc06c6dcf678fe97eae50 -Author: Emmanuele Bassi -Date: Tue Oct 2 12:11:55 2007 +0100 - - Add GObject serialization support for JSON-GLib - - This commit adds json-gobject.h and json_serialize_gobject() to - JSON-GLib, to serialize a GObject instance into a JSON data stream. - - .gitignore | 1 + - json-glib/Makefile.am | 2 + - json-glib/json-gobject.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-gobject.h | 33 +++++++++ - 4 files changed, 205 insertions(+), 0 deletions(-) - -commit 8398253c76cf5dda23891b49b1aaa49e57d95a8d -Author: Emmanuele Bassi -Date: Tue Oct 2 10:03:00 2007 +0100 - - Complete the tests suite with the object deserialization - - Add a test unit for JSON object generation using JsonGenerator. The - empty, simple (1-depth) and complex (nested object and array) cases - are exercised. - - The complex object generation is taken from the RFC 4627, Examples - section. - - .gitignore | 2 + - tests/Makefile.am | 4 +- - tests/test-05.c | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 222 insertions(+), 1 deletions(-) - -commit 2b25dbfa802f9af6e76fbe72140b687535cae8e5 -Author: Emmanuele Bassi -Date: Tue Oct 2 08:07:56 2007 +0100 - - Add objects support - - JsonGenerator can now create objects and array-nested objects, with and without - pretty printing. The test suite has been updated accordingly. - - json-glib/json-generator.c | 125 ++++++++++++++++++++++++++++++++++++++++++- - tests/test-04.c | 68 ++++++++++++++++++++++++ - 2 files changed, 190 insertions(+), 3 deletions(-) - -commit 326cdead6f1c7b1bbaae0961d28bfe5ca3af0a1a -Author: Emmanuele Bassi -Date: Mon Oct 1 23:07:18 2007 +0100 - - Add nested arrays support - - JsonGenerator now supports nested arrays, both with and without pretty - printing. The tests suite has been updated accordingly. - - json-glib/json-generator.c | 10 +++++++ - tests/test-04.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 71 insertions(+), 0 deletions(-) - -commit 6f4dd6b154a150e8b4221800b61f85e5c4277d1b -Author: Emmanuele Bassi -Date: Mon Oct 1 22:58:04 2007 +0100 - - Simple arrays generation - - JsonGenerator now can create simple arrays, with "pretty" enabled and disabled. - Simple arrays are just one-level, value-only arrays. - - The test unit has been updated to exercise this new feature. - - json-glib/json-generator.c | 160 ++++++++++++++++++++++++++++++++++++++++++-- - tests/test-04.c | 86 ++++++++++++++++++++++-- - 2 files changed, 234 insertions(+), 12 deletions(-) - -commit 7f0232eaab0af434e2e086c83b68395146e410f9 -Author: Emmanuele Bassi -Date: Mon Oct 1 22:22:12 2007 +0100 - - Update list of git ignored files - - .gitignore | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -commit 47b34271f989cb5f2ba01a633d003adb6052cbd1 -Author: Emmanuele Bassi -Date: Mon Oct 1 22:20:23 2007 +0100 - - Add initial test unit for the JsonGenerator object - - tests/Makefile.am | 4 +++- - tests/test-04.c | 29 +++++++++++++++++++++++++++++ - 2 files changed, 32 insertions(+), 1 deletions(-) - -commit 8edb4ef3232428ac9e548ae6c1dfa2328bf7198c -Author: Emmanuele Bassi -Date: Mon Oct 1 22:19:28 2007 +0100 - - Add missing json-generator.h header - - json-glib/json-glib.h | 1 + - 1 files changed, 1 insertions(+), 0 deletions(-) - -commit f09acae8e0d6ceba5d13de75551491835a7e71de -Author: Emmanuele Bassi -Date: Mon Oct 1 19:49:43 2007 +0100 - - Document the new public functions - - Now that we moved the constructors and setters for the JSON data types into - the public symbols we need to document them to get back to 100% doc coverage. - - doc/reference/json-glib-sections.txt | 26 ++++++++++- - json-glib/json-array.c | 22 ++++++++++ - json-glib/json-node.c | 78 ++++++++++++++++++++++++++++++++++ - json-glib/json-object.c | 15 +++++++ - json-glib/json-types.h | 2 + - 5 files changed, 141 insertions(+), 2 deletions(-) - -commit 228a5e4efe65995778847f48d2be43f3df988e10 -Author: Emmanuele Bassi -Date: Mon Oct 1 18:01:20 2007 +0100 - - Move data types ctors and setters into the public headers - - Now that we are providing a generator class we need to provide the - constructors and setters for JsonNode, JsonObject and JsonArray. This - also means that the json-private.h header is now useless, so we can - remove it from the build and repository. - - json-glib/Makefile.am | 2 +- - json-glib/json-array.c | 1 - - json-glib/json-generator.c | 1 - - json-glib/json-node.c | 1 - - json-glib/json-object.c | 1 - - json-glib/json-parser.c | 1 - - json-glib/json-private.h | 35 ----------------------------------- - json-glib/json-types.h | 38 +++++++++++++++++++++++++++++++------- - 8 files changed, 32 insertions(+), 48 deletions(-) - -commit bfa60e9ef9da71e3c0d171f81cd08e8eac749061 -Author: Emmanuele Bassi -Date: Mon Oct 1 17:48:34 2007 +0100 - - Add stub class for JsonGenerator - - JsonGenerator is an object that creates JSON data streams from a data - model tree. This commit adds the JsonGenerator class to the build and - API reference. - - doc/reference/json-glib-docs.sgml | 1 + - doc/reference/json-glib-sections.txt | 25 ++++ - json-glib/Makefile.am | 2 + - json-glib/json-generator.c | 255 ++++++++++++++++++++++++++++++++++ - json-glib/json-generator.h | 82 +++++++++++ - 5 files changed, 365 insertions(+), 0 deletions(-) - -commit 41849494890f1f51bc7c4429f0ee7b5d168da302 -Author: Emmanuele Bassi -Date: Mon Oct 1 16:37:14 2007 +0100 - - Fix ids inside the main documentation index - - doc/reference/json-glib-docs.sgml | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -commit c3f8ea960ef7f8733969d9fb0f71531bc7449a16 -Author: Emmanuele Bassi -Date: Mon Oct 1 16:25:47 2007 +0100 - - Complete API reference of JSON-GLib - - With this commit, we reach 100% coverage. - - json-glib/json-parser.h | 19 +++++++++++++++++++ - json-glib/json-types.h | 20 ++++++++++++++++++++ - 2 files changed, 39 insertions(+), 0 deletions(-) - -commit 2211e4e60b90b92d868c9b5f6b61e133d2435b4d -Author: Emmanuele Bassi -Date: Mon Oct 1 16:25:11 2007 +0100 - - Implement json_node_get_parent() - - It seems that the parent accessor fell through. This commit implements - the declared json_node_get_parent() function. - - json-glib/json-node.c | 16 ++++++++++++++++ - 1 files changed, 16 insertions(+), 0 deletions(-) - -commit 29feafc236f888021b817fdfe0cfe685f5e3b65e -Author: Emmanuele Bassi -Date: Mon Oct 1 16:16:15 2007 +0100 - - Add licensing informations to the source code - - json-glib/json-array.c | 29 ++++++++++++++++++++++++ - json-glib/json-node.c | 52 ++++++++++++++++++++++++++++++++++++------ - json-glib/json-object.c | 34 ++++++++++++++++++++++++--- - json-glib/json-parser.c | 28 +++++++++++++++++++++- - json-glib/json-parser.h | 19 +++++++++++++++ - json-glib/json-types.h | 35 +++++++++++++++++++++++++++++ - json-glib/json-version.h.in | 19 +++++++++++++++ - 7 files changed, 202 insertions(+), 14 deletions(-) - -commit 6eb1a5e94957d3555e7de5f6744a8777cd89efaf -Author: Emmanuele Bassi -Date: Mon Oct 1 15:55:04 2007 +0100 - - Fix a stray newline in the documentation - - doc/reference/json-glib-docs.sgml | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -commit a5ecf553082816a1ce6c4354ff23e8addf8d9c80 -Author: Emmanuele Bassi -Date: Mon Oct 1 15:52:54 2007 +0100 - - Update git ignore file - - .gitignore | 22 ++++++++++++++++++++++ - 1 files changed, 22 insertions(+), 0 deletions(-) - -commit 9bdee4c01adef7e9d7ed18d5dd94671057f1459b -Author: Emmanuele Bassi -Date: Mon Oct 1 15:50:49 2007 +0100 - - Add API reference for JSON-GLib - - Use gtk-doc to build the various bits and pieces of the API reference - for JSON-GLib. - - doc/Makefile.am | 1 + - doc/reference/Makefile.am | 2 +- - doc/reference/json-glib-docs.sgml | 153 ++++++++++++++++++++++++++++++++++ - doc/reference/json-glib-sections.txt | 92 ++++++++++++++++++++ - doc/reference/json-glib.types | 1 + - json-glib/json-node.c | 2 +- - json-glib/json-version.h.in | 8 ++ - 7 files changed, 257 insertions(+), 2 deletions(-) - -commit 2e362edd46f11f2fd1fa327877372b902b70c280 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:57:39 2007 +0100 - - Add more test cases for the object parsing - - tests/test-03.c | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit 79423943a8588a8ed6d5bedbc038255111897261 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:57:25 2007 +0100 - - Swallow the comma earlier in the parser - - The comma is used as a member and element separator, so it should be - swallowed by the parser as soon as possible. - - json-glib/json-parser.c | 25 ++++++++++++++++--------- - 1 files changed, 16 insertions(+), 9 deletions(-) - -commit e711b883dba88d68b6986d87f14a06361cf54be7 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:46:31 2007 +0100 - - Update gitignore - - .gitignore | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -commit 591989c80b16fe68bdd79bcc7759a4249fdaf129 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:45:42 2007 +0100 - - Test object parsing - - Add JSON object parsing testing to the test units. - - tests/Makefile.am | 8 +- - tests/test-02.c | 73 +++++++++++++++++- - tests/test-03.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 285 insertions(+), 7 deletions(-) - -commit ba3a6e6afed0d4fe3853b8e7400516557a20f775 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:44:51 2007 +0100 - - Add JSON object parsing - - This commit completes the JsonParser class by adding the ability to - parse JSON objects, either alone or inside arrays. JsonParser is now - a JSON parser. - - json-glib/json-parser.c | 235 ++++++++++++++++++++++++++++++++++++++++++++--- - 1 files changed, 220 insertions(+), 15 deletions(-) - -commit fd89ad3d7127e68df06345fa52863e73ada93689 -Author: Emmanuele Bassi -Date: Mon Oct 1 14:43:12 2007 +0100 - - Declare json_node_take_object() and json_node_take_array() - - JsonParser uses the take variant of JsonNode setters for objects and arrays - since it's the one creating the objects. This way, we avoid leaks and the - extra complexity of unreffing the newly created complex containers after - setting them into the JsonNodes. - - json-glib/json-private.h | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit b2ee98f9b0baac019540020e177189b6a3780b83 -Author: Emmanuele Bassi -Date: Mon Oct 1 13:01:32 2007 +0100 - - Chain up nodes to their parent - - When parsing a JSON node we need to correctly set up the parent node - of the newly created ones. - - json-glib/json-parser.c | 6 +++++- - 1 files changed, 5 insertions(+), 1 deletions(-) - -commit 88b11be5eec1da769328e93189bc2f3316c9cd0a -Author: Emmanuele Bassi -Date: Mon Oct 1 12:57:46 2007 +0100 - - Add JsonNode, a generic container for JSON types - - This huge commit removes JsonData and adds JsonNode, the generic container - for fundamental and complex data types extracted from a JSON stream. The - contents of a JsonNode can be extracted from it in form of a GValue for - fundamental types (integers, floats, strings, booleans) or in form of - JsonObject and JsonArray objects. JsonObject and JsonArray now accept - JsonNodes instead of GValues. - - The JsonParser object builds the data model tree when parsing a JSON stream; - the tree can be recursed by getting the root node and walking it using the - GValue API for the fundamental types and the objects/arrays API for complex - types. - - The API has been updated and the tests now recurse through the generated - data model tree. - - json-glib/Makefile.am | 2 +- - json-glib/json-array.c | 64 +++++------ - json-glib/json-data.c | 93 ---------------- - json-glib/json-node.c | 269 ++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-object.c | 44 ++------ - json-glib/json-parser.c | 87 +++++++++++---- - json-glib/json-parser.h | 2 +- - json-glib/json-private.h | 38 +++---- - json-glib/json-types.h | 59 ++++++----- - tests/test-01.c | 2 +- - tests/test-02.c | 112 ++++++++++++++++++- - 11 files changed, 535 insertions(+), 237 deletions(-) - -commit c11ebd32f73a1e21d6097bf9eba8e12f7e35497a -Author: Emmanuele Bassi -Date: Fri Sep 21 21:07:12 2007 +0100 - - Add JsonData, an opaque container for JSON data types - - JsonData is like GValue, but it stores JSON data types (objects and - arrays) and allows us to retrieve them safely. This way we can actually - know the type of the objects returned by the parser and by the other - object walking functions. - - json-glib/Makefile.am | 1 + - json-glib/json-data.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++ - json-glib/json-private.h | 7 +++ - json-glib/json-types.h | 53 ++++++++++++++++++-------- - 4 files changed, 138 insertions(+), 16 deletions(-) - -commit f661c7e1a04c2fb198279030c9dd812f357240a3 -Author: Emmanuele Bassi -Date: Fri Sep 21 21:05:12 2007 +0100 - - Skip the token check after parsing a nested array - - Since there cannot be any other token except for the comma, which we - eat anyway, there's no point in going through the switch() check - after we have finished parsing a nested array. - - json-glib/json-parser.c | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -commit ae3a66e6a90b6cfd71cb8c41c0d752fd1b0a67cc -Author: Emmanuele Bassi -Date: Fri Sep 21 20:15:52 2007 +0100 - - Update gitignore file - - .gitignore | 7 +++++++ - 1 files changed, 7 insertions(+), 0 deletions(-) - -commit 7875c5f573fdc6c2a39e958d2032f4c26d1f91ff -Author: Emmanuele Bassi -Date: Fri Sep 21 20:14:49 2007 +0100 - - Start the test suite - - Add the first two test units: - - - test-01.c: build/empty test unit - - test-02.c: array test unit - - Every test unit must follow the same naming policy, so we can add - a run-tests script later on and a pre-commit hook to invoke it - and catch regressions automagically. - - tests/Makefile.am | 12 ++++++++++++ - tests/test-01.c | 31 +++++++++++++++++++++++++++++++ - tests/test-02.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 95 insertions(+), 0 deletions(-) - -commit 81ad2e5c61db2391d2d98a6b5df1247e3abf16ec -Author: Emmanuele Bassi -Date: Fri Sep 21 20:12:02 2007 +0100 - - Parse JSON arrays - - Add the array parsing code. The parser identifies and builds nested - levels of arrays, but the storage is not quite right. That is a problem - of the parser object, though, so this can be considered a first raw - pass at the problem. - - json-glib/json-parser.c | 114 ++++++++++++++++++++++++++++++++++++++++------- - 1 files changed, 97 insertions(+), 17 deletions(-) - -commit b433703db6722785e33f968830e23c5806230ac2 -Author: Emmanuele Bassi -Date: Fri Sep 21 12:16:15 2007 +0100 - - Add RFC 4627 text, where JSON is defined - - doc/rfc4627.txt | 563 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 563 insertions(+), 0 deletions(-) - -commit c77af0ec13e3e11cdb784510e6a75125bb8ef667 -Author: Emmanuele Bassi -Date: Fri Sep 21 12:08:09 2007 +0100 - - Top-levels in JSON can only be objects or arrays - - JSON is an object serialisation format (thanks, RFC4627), so it can - only express objects and/or arrays as top-levels. - - json-glib/json-parser.c | 24 ++++++++++++++---------- - 1 files changed, 14 insertions(+), 10 deletions(-) - -commit 0ff67fb63c5e021b88d6a3d17c5e34dc95ac2676 -Author: Emmanuele Bassi -Date: Fri Sep 21 11:58:00 2007 +0100 - - Update gitignore file - - .gitignore | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -commit d98d8c3d245192abe6ec5a531c9d0d678b07d061 -Author: Emmanuele Bassi -Date: Fri Sep 21 11:54:40 2007 +0100 - - Add stubs to JsonParser for actually parsing a JSON stream - - Initial commit for getting JsonParser to work. Because GScanner API - is old and mostly sucks, we need to do some magic with signals. - - If json_parser_load_from_data() fails, the passed GError will be set - with a JSON_PARSER_ERROR code and message; unfortunately, we can't get - the nice error message out of GScanner. We can, however, override the - default message handler and make it emit a signal on the JsonParser - object. - - So, to make a long story short: the GError passed to the load_from_data() - method is filled with a short error message; the *real* error message - is passed to the ::error signal handlers so they can actually use it. - - GScanner should really get a way to retrieve the last error message. - - json-glib/json-parser.c | 266 ++++++++++++++++++++++++++++++++++++++++++++++- - json-glib/json-parser.h | 28 +++++- - 2 files changed, 290 insertions(+), 4 deletions(-) - -commit cd1040e2fb6f6da50aaf72017746b33234c39704 -Author: Emmanuele Bassi -Date: Fri Sep 21 11:08:06 2007 +0100 - - Add marshallers generation to the build - - Use glib-genmarshal to generate the marshallers we need. For the - time being, we just need a (void,pointer). - - json-glib/Makefile.am | 30 +++++++++++++++++++++++++----- - json-glib/json-marshal.list | 1 + - 2 files changed, 26 insertions(+), 5 deletions(-) - -commit 821ac3e602f936318f9a2c3b831f135408ca5d74 -Author: Emmanuele Bassi -Date: Thu Sep 20 20:41:09 2007 +0100 - - Add gitignore file - - .gitignore | 29 +++++++++++++++++++++++++++++ - 1 files changed, 29 insertions(+), 0 deletions(-) - -commit c5bfb22f964b8f1feecdc8fb29d8a74b36861d32 -Author: Emmanuele Bassi -Date: Thu Sep 20 17:33:28 2007 +0100 - - Initial import of JSON-GLib - - JSON-GLib is a JSON parser library written with GLib and GObject. - - JSON is the JavaScript Object Notation, and it's used to define objects - and object hierarchies in a human-readable way. - - AUTHORS | 1 + - COPYING | 504 +++++++++++++++++++++++++++++++++++++ - ChangeLog | 6 + - Makefile.am | 15 ++ - README | 39 +++ - autogen.sh | 4 + - configure.ac | 119 +++++++++ - doc/reference/Makefile.am | 82 ++++++ - doc/reference/version.xml.in | 1 + - json-glib.pc.in | 11 + - json-glib/Makefile.am | 52 ++++ - json-glib/json-array.c | 176 +++++++++++++ - json-glib/json-glib.h | 8 + - json-glib/json-object.c | 201 +++++++++++++++ - json-glib/json-parser.c | 152 +++++++++++ - json-glib/json-parser.h | 57 +++++ - json-glib/json-private.h | 26 ++ - json-glib/json-types.h | 32 +++ - json-glib/json-version.h.in | 65 +++++ - 19 files changed, 1551 insertions(+), 0 deletions(-) diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 7d1c323..0000000 --- a/INSTALL +++ /dev/null @@ -1,365 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008, 2009 Free Software Foundation, Inc. - - 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 warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/Makefile.am b/Makefile.am index fb2170e..7f4c3f9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,38 +1,44 @@ -include $(top_srcdir)/build/autotools/Makefile.am.gtest -include $(top_srcdir)/build/autotools/Makefile.am.silent - ACLOCAL_AMFLAGS = -I build/autotools -SUBDIRS = build json-glib doc - -if ENABLE_GLIB_TEST -SUBDIRS += tests -endif - -DIST_SUBDIRS = build json-glib doc tests - -pcfiles = json-glib-1.0.pc - -json-glib-1.0.pc: json-glib.pc - $(QUIET_GEN)cp -f $< $@ +EXTRA_DIST = -pkgconfig_DATA = $(pcfiles) -pkgconfigdir = $(libdir)/pkgconfig +SUBDIRS = json-glib build po -EXTRA_DIST += json-glib.pc.in - -CLEANFILES = $(pcfiles) test-report.xml - -DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-maintainer-flags --enable-introspection +DISTCHECK_CONFIGURE_FLAGS = --enable-man --enable-maintainer-flags --enable-introspection dist-hook: @if test -d "$(srcdir)/.git"; then \ echo Generating ChangeLog ; \ ( cd "$(srcdir)" \ - && $(top_srcdir)/missing --run git log --stat ) > ChangeLog.tmp \ + && $(top_srcdir)/build/missing --run git log --stat ) > ChangeLog.tmp \ && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \ || ( rm -f ChangeLog.tmp; \ echo Failed to generate ChangeLog >&2 ); \ else \ echo A git checkout is required to generate a ChangeLog >&2; \ fi + +if ENABLE_GCOV +# use recursive makes in order to ignore errors during check/perf +lcov: + -$(MAKE) $(AM_MAKEFLAGS) check + $(MAKE) $(AM_MAKEFLAGS) genlcov + +# we have to massage the lcov.info file slightly to hide the effect of libtool +# placing the objects files in the .libs/ directory separate from the *.c +genlcov: + $(LTP) --directory $(top_builddir) --capture --output-file json-lcov.info --test-name JSON_TEST --no-checksum + $(SED) -e 's#.libs/##' < json-lcov.info > json-lcov.info.tmp + LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory json-lcov --title "JSON-GLib Code Coverage" --show-details json-lcov.info.tmp + rm -f json-lcov.info.tmp + +lcov-clean: + -$(LTP) --directory $(top_builddir) -z + -$(RM) -rf json-lcov.info json-lcov +else +lcov genlcov lcov-clean: + @echo You need to configure JSON-GLib with support for gcov enabled. + @echo e.g., ./configure --enable-gcov +endif + +.PHONY: lcov genlcov lcov-clean diff --git a/NEWS b/NEWS index 631a5c2..fbe9935 100644 --- a/NEWS +++ b/NEWS @@ -1,14 +1,57 @@ -Overview of changes for 0.10.4 +Overview of changes for 1.0 ============================== -• Improve the strictness of the JsonParser code by refactoring a large - chunk of it -• Fix JsonGenerator when dumping nodes with a floating point value -• Add negative conformance test cases +• Bump the dependency on GLib to 2.38 +• Use the TAP driver for the test suite +• Improve the syntax validation in JsonPath +• Validate the JsonParser input to be UTF-8 +• Add command line tools for validating and formatting JSON +• Improve documentation -Overview of changes for 0.10.2 +Overview of changes for 0.16.0 ============================== -• Documentation fixes for GBoxed transformation functions -• Zero all fields of JsonObject on creation +• Fixes for building with VisualStudio. [Chun-wei Fan] +• Allow out-of-tree builds. [Colin Walters] +• Bump the dependency on GLib to 2.31. +• Use the new deprecation system provided by GLib. +• Simplify the value handling inside JsonNode. +• Use lcov to generate coverage reports for the test suite. +• Check expected ABI when building. +• Drop dependency on gnome-autogen.sh when building from Git. + +Overview of changes for 0.14.0 +============================== +• Documentation fixes +• Bump the dependency on GLib to 2.26 +• Allow building on Windows using VisualStudio [Chun-wei Fan] +• Add JSON ↔ GVariant translation [Eduardo Lima Mitev] +• Improve sanity checks when (de)serializing GObject + properties [Tristan Van Berkom] +• Add missing introspection annotations [Luca Bruno] +• Add JsonReader.list_members() +• Allow using JsonReader.read_element() on JSON objects +• Remove all G_CONST_RETURN usage after the deprecation +• Allow JsonSerializable to override the introspection and + modification of properties +• Add i18n support for GError messages +• Do not serialize GObject properties that match their default + values. +• Make JsonReader perform a stricter validation especially when using + the strongly typed accessors. + +Overview of changes for 0.12.0 +============================== +• Support surrogate pairs in JSON strings [Eiichi Sato] +• Update the test suite +• Add (optional) coverage reports +• Improve strictness of JsonParser +• Improve error reporting of JsonParser +• Add JsonBuilder, a convenience API for programmatic building + of JSON trees [Luca Bruno] +• Add methods for JsonParser and JsonGenerator to handle Input|OutputStream + objects coming from GIO. +• Add JsonReader, a convenience API for cursor-based parsing of + JSON trees +• Depend on GObject-Introspection ≥ 0.9.5 Overview of changes for 0.10.0 ============================== diff --git a/README b/README deleted file mode 100644 index 2cc23ab..0000000 --- a/README +++ /dev/null @@ -1,103 +0,0 @@ -JSON-GLib - A JSON parser for GLib-based libraries and applications -=============================================================================== - -JSON-GLib implements a full JSON parser using GLib and GObject. - -Use JSON-GLib it is possible to parse and generate valid JSON data -structures, using a DOM-like API. JSON-GLib also offers GObject -integration, providing the ability to serialize and deserialize -GObject instances to and from JSON data types. - -JSON is the JavaScript Object Notation; it can be used to represent -objects and object hierarchies while retaining human-readability. - -GLib is a C library providing common and efficient data types for -the C developers. - -GObject is a library providing a run-time Object Oriented type system -for C developers. GLib and GObject are extensively used by the GTK+ -toolkit and by the GNOME project. - -For more information, see: - • JSON: http://www.json.org - • GLib and GObject: http://www.gtk.org - -REQUIREMENTS ------------- -In order to build JSON-GLib you will need: - - • pkg-config - • gtk-doc >= 1.11 - • GLib >= 2.16 - -Optionally, JSON-GLib depends on: - - • GObject-Introspection >= 0.6.4 - -INSTALLATION -------------------------------------------------------------------------------- -To build JSON-GLib just run: - - $ ./configure - $ make all - # make install - -BUGS -------------------------------------------------------------------------------- -If you find a bug in JSON-GLib, please create a Bugzilla entry here: - - http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib - -Attaching: - - • the version of JSON-GLib - ◦ if it is a development version, the branch of the git repository - • the JSON data that produced the bug (if any) - • a small test case, if none of the test units exhibit the behaviour - • in case of a segmentation fault, a full stack trace with debugging - symbols obtained through gdb is greatly appreaciated - -RELEASE NOTES -------------------------------------------------------------------------------- -• Prior to JSON-GLib 0.10, a JsonSerializable implementation could - automatically fall back to the default serialization code by simply - returning NULL from an overridden JsonSerializable::serialize_property() - virtual function. Since JSON-GLib 0.10 this is not possible any more. A - JsonSerializable is always expected to serialize and deserialize all - properties. JSON-GLib provides public API for the default implementation - in case the serialization code wants to fall back to that. - -HACKING -------------------------------------------------------------------------------- -JSON-GLib is developed mainly inside a GIT repository available at: - - http://git.gnome.org/cgit/json-glib - -You can clone the GIT repository with: - - git clone git://git.gnome.org/json-glib - -If you want to contribute functionality or bug fixes to JSON-GLib you -can either notify me to pull from your GIT repository or send me a set -of patches using: - - git format-patch master -k -s - -or: - - git send-email -k -s - -Make sure you always run the test suite when you are fixing bugs. New -features should come with a test unit. - -AUTHOR, COPYRIGHT AND LICENSING -------------------------------------------------------------------------------- -JSON-GLib has been written by Emmanuele Bassi - -JSON-GLib is released under the terms of the GNU Lesser General Public License, -either version 2.1 or (at your option) any later version. - -See the file COPYING for details. - -Copyright (C) 2007 OpenedHand Ltd -Copyright (C) 2009 Intel Corp. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3a78001 --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +JSON-GLib +=============================================================================== + +JSON-GLib implements a full suite of JSON-related tools using GLib and GObject. + +Use JSON-GLib it is possible to parse and generate valid JSON data +structures using a DOM-like API. JSON-GLib also integrates with GObject to +provide the ability to serialize and deserialize GObject instances to and from +JSON data types. + +JSON is the JavaScript Object Notation; it can be used to represent objects and +object hierarchies while retaining human-readability. + +GLib is a C library providing common and efficient data types for the C +developers. + +GObject is a library providing a run-time Object Oriented type system for C +developers. GLib and GObject are extensively used by the GTK+ toolkit and by the +GNOME project. + +For more information, see: + + * [JSON][json] + * [GLib and GObject][glib] + * [JSON-GLib][json-glib] + +REQUIREMENTS +------------ +In order to build JSON-GLib you will need: + + * pkg-config + * gtk-doc ≥ 1.13 + * GLib, GIO ≥ 2.38 + +Optionally, JSON-GLib depends on: + + * GObject-Introspection ≥ 1.38 + * LCov ≥ 1.6 + +INSTALLATION +------------ +To build JSON-GLib just run: + + $ ./configure + $ make all + # make install + +BUGS +---- +JSON-GLib tracks bugs in the GNOME Bugzilla. + +If you find a bug in JSON-GLib, please file an issue using +[the appropriate form][bugzilla-enter-bug]. You can also check +[the list of open bugs][bugzilla-bug-page]. + +Required information: + + * the version of JSON-GLib + * if it is a development version, the branch of the git repository + * the JSON data that produced the bug (if any) + * a small, self-contained test case, if none of the test units exhibit the + buggy behaviour + * in case of a segmentation fault, a full stack trace with debugging + symbols obtained through gdb is greatly appreaciated + +RELEASE NOTES +------------- + * Prior to JSON-GLib 0.10, a JsonSerializable implementation could + automatically fall back to the default serialization code by simply + returning NULL from an overridden JsonSerializable::serialize-property + virtual function. Since JSON-GLib 0.10 this is not possible any more. A + JsonSerializable is always expected to serialize and deserialize all + properties. JSON-GLib provides public API for the default implementation + in case the serialization code wants to fall back to that. + +HACKING +------- +JSON-GLib is developed mainly inside a GIT repository available at: + + https://git.gnome.org/browse/json-glib + +You can clone the GIT repository with: + + git clone git://git.gnome.org/json-glib + +If you want to contribute functionality or bug fixes to JSON-GLib you can either +notify me to pull from your Git repository, or you can attach patches for review +to a bug on [the bug tracking system][bugzilla] using + + git format-patch master -k -s + +to generate the patches from each commit. Using [git-bz][git-bz] to automate +this process is strongly encouraged. + +Please, try to conform to the coding style used by JSON-GLib, which is the same +used by projects like GLib, GTK+, and Clutter. Coding style conformance is a +requirement for upstream acceptance. + +Make sure you always run the test suite when you are fixing bugs. New features +should come with a test unit. Patches that regress the test suite will be +rejected. + +AUTHOR, COPYRIGHT AND LICENSING +------------------------------- +JSON-GLib has been written by Emmanuele Bassi + +JSON-GLib is released under the terms of the GNU Lesser General Public License, +either version 2.1 or (at your option) any later version. + +See the file COPYING for details. + +Copyright (C) 2007, 2008 OpenedHand Ltd +Copyright (C) 2009, 2010, 2011, 2012 Intel Corp. +Copyright (C) 2013 Emmanuele Bassi + +[json]: http://www.json.org "JSON" +[glib]: http://www.gtk.org "GTK+" +[json-glib]: https://wiki.gnome.org/Project/JsonGlib "JSON-GLib wiki" +[bugzilla]: https://bugzilla.gnome.org "GNOME Bugzilla" +[bugzilla-bug-page]: https://http://bugzilla.gnome.org/browse.cgi?product=json-glib "GNOME Bugzilla - Browse: json-glib" +[bugzilla-enter-bug]: https://bugzilla.gnome.org/enter_bug.cgi?product=json-glib "GNOME Bugzilla - Enter bug: json-glib" +[git-bz]: http://blog.fishsoup.net/2008/11/16/git-bz-bugzilla-subcommand-for-git/ diff --git a/TC/_export_env.sh b/TC/_export_env.sh deleted file mode 100755 index 72a11ec..0000000 --- a/TC/_export_env.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -. ./config -export TET_INSTALL_PATH=$TET_INSTALL_HOST_PATH # tetware root path -export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target # tetware target path -export PATH=$TET_TARGET_PATH/bin:$PATH -export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH -export TET_ROOT=$TET_TARGET_PATH diff --git a/TC/_export_target_env.sh b/TC/_export_target_env.sh deleted file mode 100755 index 5ddaa53..0000000 --- a/TC/_export_target_env.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -. ./config -export TET_INSTALL_PATH=$TET_INSTALL_TARGET_PATH # path to path -export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target -export PATH=$TET_TARGET_PATH/bin:$PATH -export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH -export TET_ROOT=$TET_TARGET_PATH diff --git a/TC/build.sh b/TC/build.sh deleted file mode 100755 index 72aad6c..0000000 --- a/TC/build.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -. ./_export_env.sh # setting environment variables - -export TET_SUITE_ROOT=`pwd` -FILE_NAME_EXTENSION=`date +%s` - -RESULT_DIR=results -HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html -JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal - -mkdir -p $RESULT_DIR - -tcc -c -p ./ -tcc -b -j $JOURNAL_RESULT -p ./ -grw -c 7 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/clean.sh b/TC/clean.sh deleted file mode 100755 index 29743e0..0000000 --- a/TC/clean.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -. ./_export_env.sh # setting environment variables - -export TET_SUITE_ROOT=`pwd` -RESULT_DIR=results - -tcc -c -p ./ # executing tcc, with clean option (-c) -rm -r $RESULT_DIR -rm -r tet_tmp_dir -rm testcase/tet_captured diff --git a/TC/config b/TC/config deleted file mode 100755 index a30467a..0000000 --- a/TC/config +++ /dev/null @@ -1,2 +0,0 @@ -TET_INSTALL_HOST_PATH=/home/ivan/xuyun/DTS/TETware -TET_INSTALL_TARGET_PATH=/mnt/nfs/DTS/TETware diff --git a/TC/execute.sh b/TC/execute.sh deleted file mode 100755 index a4f6095..0000000 --- a/TC/execute.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -. ./_export_target_env.sh # setting environment variables - -export TET_SUITE_ROOT=`pwd` -FILE_NAME_EXTENSION=`date +%s` - -RESULT_DIR=results -HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html -JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal - -mkdir -p $RESULT_DIR - -tcc -e -j $JOURNAL_RESULT -p ./ -grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/tet_scen b/TC/tet_scen deleted file mode 100755 index e486157..0000000 --- a/TC/tet_scen +++ /dev/null @@ -1,10 +0,0 @@ -all - ^TEST -##### Scenarios for TEST ##### - -# Test scenario -TEST - :include:/unit/TC_Parser/tslist - :include:/unit/TC_Generator/tslist - :include:/unit/TC_Types/tslist - :include:/unit/TC_Gobject/tslist \ No newline at end of file diff --git a/TC/tetbuild.cfg b/TC/tetbuild.cfg deleted file mode 100755 index 1d79cc2..0000000 --- a/TC/tetbuild.cfg +++ /dev/null @@ -1,5 +0,0 @@ -TET_OUTPUT_CAPTURE=False # capture option for build operation checking -TET_BUILD_TOOL=make # build with using make command -TET_BUILD_FILE=-f Makefile # execution file (Makefile) for build -TET_API_COMPLIANT=True # use TET API in Test Case ? -TET_PASS_TC_NAME=True # report passed TC name in Journal file? diff --git a/TC/tetclean.cfg b/TC/tetclean.cfg deleted file mode 100755 index 02d7030..0000000 --- a/TC/tetclean.cfg +++ /dev/null @@ -1,5 +0,0 @@ -TET_OUTPUT_CAPTURE=True # capture option -TET_CLEAN_TOOL= make clean # clean tool -TET_CLEAN_FILE= Makefile # file for clean -TET_API_COMPLIANT=True # TET API useage -TET_PASS_TC_NAME=True # showing name , passed TC diff --git a/TC/tetexec.cfg b/TC/tetexec.cfg deleted file mode 100755 index ef3e452..0000000 --- a/TC/tetexec.cfg +++ /dev/null @@ -1,5 +0,0 @@ -TET_OUTPUT_CAPTURE=True # capturing execution or not -TET_EXEC_TOOL= # ex) exec : execution tool set up/ Optional -TET_EXEC_FILE= # ex) exectool : execution file/ Optional -TET_API_COMPLIANT=True # Test case or Tool usesTET API? -TET_PASS_TC_NAME=True # showing Passed TC name ? diff --git a/TC/unit/Makefile b/TC/unit/Makefile deleted file mode 100755 index 7dad665..0000000 --- a/TC/unit/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -testbuildtype=normal -#export testbuildtype - -all: TCParser TC_Generator TC_Types TC_Gobject - echo done - -TCParser: - make -s -C TC_Parser - -TC_Generator: - make -s -C TC_Generator - -TC_Types: - make -s -C TC_Types - -TC_Gobject: - make -s -C TC_Gobject - -clean: - make clean -C TC_Parser - make clean -C TC_Generator - make clean -C TC_Types - make clean -C TC_Gobject - \ No newline at end of file diff --git a/TC/unit/TC_Generator/Makefile b/TC/unit/TC_Generator/Makefile deleted file mode 100755 index d8b57a5..0000000 --- a/TC/unit/TC_Generator/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -################################################### -# add your TestCase List Here -# -# e.g., -# TC1 = utc_frameworkName_apiName_func -# TC2 = utc_ApplicationLib_recurGetDayOfWeek_func -TARGETS = utc_libjson_json_generator_new_func \ - utc_libjson_json_generator_to_file_func \ - utc_libjson_json_generator_to_data_func \ - utc_libjson_json_generator_set_root_func -################################################### -# add your Package Config Info Here -# -# e.g., -# PKGS=calendar -PKGS=json-glib-1.0 - -LIBS = `pkg-config --libs $(PKGS)` -LIBS += `pkg-config --libs glib-2.0` -LIBS +=$(TET_ROOT)/lib/tet3/tcm_s.o -LIBS +=-L$(TET_ROOT)/lib/tet3 -ltcm_s -LIBS +=-L$(TET_ROOT)/lib/tet3 -lapi_s - -INCS = -I. `pkg-config --cflags $(PKGS)` -INCS += -I. `pkg-config --cflags glib-2.0` -INCS += -I$(TET_ROOT)/inc/tet3 - - -CFLAGS = $(INCS) -CFLAGS += -D_TETWARE_MODE -CFLAGS += -Wall -LDFLAGS = $(LIBS) - -################################################### -# Modify here -# depending on the Test Case you want to build -# -# e.g., -# TCLIST = $(TC1) $(TC2) -all : $(TARGETS) - -$(TARGETS) : %: %.c - $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) - -clean : - rm -rf $(TARGETS) - diff --git a/TC/unit/TC_Generator/tslist b/TC/unit/TC_Generator/tslist deleted file mode 100755 index 43fcfe7..0000000 --- a/TC/unit/TC_Generator/tslist +++ /dev/null @@ -1,4 +0,0 @@ -/unit/TC_Generator/utc_libjson_json_generator_new_func -/unit/TC_Generator/utc_libjson_json_generator_to_file_func -/unit/TC_Generator/utc_libjson_json_generator_to_data_func -/unit/TC_Generator/utc_libjson_json_generator_set_root_func \ No newline at end of file diff --git a/TC/unit/TC_Generator/utc_libjson_json_generator_new_func.c b/TC/unit/TC_Generator/utc_libjson_json_generator_new_func.c deleted file mode 100755 index 9de43fd..0000000 --- a/TC/unit/TC_Generator/utc_libjson_json_generator_new_func.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_generator_new_func_01(void); -static void utc_libjson_json_generator_new_func_02(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_generator_new_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_new_func_02, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_generator_new() - */ -static void utc_libjson_json_generator_new_func_01(void) -{ - JsonGenerator *gen = NULL; - - gen = json_generator_new(); - dts_check_ne("json_generator_new", gen, NULL); - - g_object_unref (gen); -} - -/** - * @brief Negative test case of ug_init json_generator_new() - */ -static void utc_libjson_json_generator_new_func_02(void) -{ - JsonGenerator *gen = NULL; - - gen = json_generator_new(); - dts_check_ne("json_generator_new", gen, NULL); - dts_check_eq("json_generator_new", JSON_IS_GENERATOR (gen), TRUE); - - g_object_unref (gen); -} - diff --git a/TC/unit/TC_Generator/utc_libjson_json_generator_set_root_func.c b/TC/unit/TC_Generator/utc_libjson_json_generator_set_root_func.c deleted file mode 100755 index 4108040..0000000 --- a/TC/unit/TC_Generator/utc_libjson_json_generator_set_root_func.c +++ /dev/null @@ -1,80 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_generator_set_root_func_01(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_generator_set_root_func_01, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static void startup(void) -{ - g_type_init (); -} - -static void cleanup(void) -{ -} - - -static void utc_libjson_json_generator_set_root_func_01(void) -{ - JsonGenerator *gen = NULL; - JsonParser *parser = NULL; - GError *error = NULL; - - JsonNode *root = NULL; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_set_root", gen, NULL); - - root = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (root, json_array_new ()); - - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - json_node_free (root); - g_object_unref (gen); - - parser = json_parser_new (); - g_assert(JSON_IS_PARSER (parser)); - if (!json_parser_load_from_data (parser, data, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_generator_set_root", root, NULL); - dts_check_eq("json_generator_set_root", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - } - - dts_pass("json_generator_set_root", "pass"); - - g_free (data); - g_object_unref (parser); - -} - - diff --git a/TC/unit/TC_Generator/utc_libjson_json_generator_to_data_func.c b/TC/unit/TC_Generator/utc_libjson_json_generator_to_data_func.c deleted file mode 100755 index 3fa534e..0000000 --- a/TC/unit/TC_Generator/utc_libjson_json_generator_to_data_func.c +++ /dev/null @@ -1,277 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_generator_to_data_func_01(void); -static void utc_libjson_json_generator_to_data_func_02(void); -static void utc_libjson_json_generator_to_data_func_03(void); -static void utc_libjson_json_generator_to_data_func_04(void); -static void utc_libjson_json_generator_to_data_func_05(void); -static void utc_libjson_json_generator_to_data_func_06(void); -static void utc_libjson_json_generator_to_data_func_07(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_generator_to_data_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_06, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_data_func_07, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static const gchar *empty_array = "[ ]"; -static const gchar *empty_object = "{ }"; - -static const gchar *simple_array = "[ true, false, null, 42, \"foo\" ]"; -static const gchar *nested_array = "[ true, [ false, null ], 42 ]"; - -static const gchar *simple_object = "{ \"Bool1\" : true, \"Bool2\" : false, \"Null\" : null, \"Int\" : 42, \"String\" : \"foo\" }"; - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/** - * @brief Positive test case of json_generator_to_data() - */ -static void utc_libjson_json_generator_to_data_func_01(void) -{ - gchar *data = NULL; - gsize len = 0; - - data = json_generator_to_data (NULL, &len); - dts_check_eq("json_generator_to_data", len, 0); - dts_check_eq("json_generator_to_data", data, NULL); -} - - -/** - * @brief Positive test case of json_generator_to_data() - */ -static void utc_libjson_json_generator_to_data_func_02(void) -{ - JsonGenerator *gen = NULL; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, 0); - dts_check_eq("json_generator_to_data", data, NULL); - - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_data_func_03(void) -{ - JsonGenerator *gen = NULL; - JsonNode *root = NULL; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - root = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (root, json_array_new ()); - - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, strlen(empty_array)); - dts_check_str_eq("json_generator_to_data", data, empty_array); - - g_free (data); - json_node_free (root); - g_object_unref (gen); - -} - -static void utc_libjson_json_generator_to_data_func_04(void) -{ - JsonGenerator *gen = NULL; - JsonNode *root = NULL; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - root = json_node_new (JSON_NODE_OBJECT); - json_node_take_object (root, json_object_new ()); - - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, strlen(empty_object)); - dts_check_str_eq("json_generator_to_data", data, empty_object); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_data_func_05(void) -{ - JsonGenerator *gen = NULL; - JsonNode *root = NULL; - JsonNode *val = NULL; - JsonArray *array = NULL; - GValue value = { 0, }; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - root = json_node_new (JSON_NODE_ARRAY); - array = json_array_sized_new (6); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, TRUE); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (val, FALSE); - json_array_add_element (array, val); - - val = json_node_new (JSON_NODE_NULL); - json_array_add_element (array, val); - - json_array_add_int_element (array, 42); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_STRING); - g_value_set_string (&value, "foo"); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - json_node_take_array (root, array); - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, strlen(simple_array)); - dts_check_str_eq("json_generator_to_data", data, simple_array); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_data_func_06(void) -{ - JsonGenerator *gen = NULL; - JsonNode *root = NULL; - JsonNode *val = NULL; - JsonArray *array = NULL; - JsonArray *nested = NULL; - GValue value = { 0, }; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - root = json_node_new (JSON_NODE_ARRAY); - array = json_array_sized_new (3); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, TRUE); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - nested = json_array_new (); - json_array_add_boolean_element (nested, FALSE); - json_array_add_null_element (nested); - json_array_add_array_element (array, nested); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT64); - g_value_set_int64 (&value, 42); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - json_node_take_array (root, array); - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, strlen(nested_array)); - dts_check_str_eq("json_generator_to_data", data, nested_array); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_data_func_07(void) -{ - JsonGenerator *gen = NULL; - JsonNode *root = NULL; - JsonObject *object = NULL; - gchar *data = NULL; - gsize len = 0; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - root = json_node_new (JSON_NODE_OBJECT); - object = json_object_new (); - - json_object_set_boolean_member (object, "Bool1", TRUE); - json_object_set_boolean_member (object, "Bool2", FALSE); - json_object_set_null_member (object, "Null"); - json_object_set_int_member (object, "Int", 42); - json_object_set_string_member (object, "String", "foo"); - - json_node_take_object (root, object); - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - dts_check_eq("json_generator_to_data", len, strlen(simple_object)); - dts_check_str_eq("json_generator_to_data", data, simple_object); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - - diff --git a/TC/unit/TC_Generator/utc_libjson_json_generator_to_file_func.c b/TC/unit/TC_Generator/utc_libjson_json_generator_to_file_func.c deleted file mode 100755 index badf0ec..0000000 --- a/TC/unit/TC_Generator/utc_libjson_json_generator_to_file_func.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_generator_to_file_func_01(void); -static void utc_libjson_json_generator_to_file_func_02(void); -static void utc_libjson_json_generator_to_file_func_03(void); -static void utc_libjson_json_generator_to_file_func_04(void); - -static const gchar *test_filename = "gen_test.info"; - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_generator_to_file_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_file_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_file_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_generator_to_file_func_04, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/** - * @brief Positive test case of json_generator_to_file() - */ -static void utc_libjson_json_generator_to_file_func_01(void) -{ - GError *error = NULL; - gboolean ret = FALSE; - - ret = json_generator_to_file (NULL, NULL, &error); - dts_check_eq("json_generator_to_data", ret, FALSE); -} - - -static void utc_libjson_json_generator_to_file_func_02(void) -{ - JsonGenerator *gen = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - ret = json_generator_to_file (gen, NULL, &error); - dts_check_eq("json_generator_to_data", ret, FALSE); - - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_file_func_03(void) -{ - JsonGenerator *gen = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - ret = json_generator_to_file (gen, "", &error); - dts_check_eq("json_generator_to_data", ret, FALSE); - - g_object_unref (gen); -} - -static void utc_libjson_json_generator_to_file_func_04(void) -{ - JsonGenerator *gen = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - gen = json_generator_new(); - dts_check_ne("json_generator_to_data", gen, NULL); - - g_remove(test_filename); - ret = json_generator_to_file (gen, test_filename, &error); - dts_check_eq("json_generator_to_data", ret, TRUE); - - ret = g_file_test(test_filename, G_FILE_TEST_EXISTS); - dts_check_eq("json_generator_to_data", ret, TRUE); - - g_object_unref (gen); -} - diff --git a/TC/unit/TC_Gobject/Makefile b/TC/unit/TC_Gobject/Makefile deleted file mode 100755 index 420b112..0000000 --- a/TC/unit/TC_Gobject/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -################################################### -# add your TestCase List Here -# -# e.g., -# TC1 = utc_frameworkName_apiName_func -# TC2 = utc_ApplicationLib_recurGetDayOfWeek_func -TARGETS = utc_libjson_json_serialize_boxed_func \ - utc_libjson_json_serialize_gobject_func \ - utc_libjson_json_serialize_interface_func \ - utc_libjson_json_serialize_simple_func \ - utc_libjson_json_serialize_complex_func \ - utc_libjson_json_serialize_full_func -################################################### -# add your Package Config Info Here -# -# e.g., -# PKGS=calendar -PKGS=json-glib-1.0 - -LIBS = `pkg-config --libs $(PKGS)` -LIBS += `pkg-config --libs glib-2.0` -LIBS +=$(TET_ROOT)/lib/tet3/tcm_s.o -LIBS +=-L$(TET_ROOT)/lib/tet3 -ltcm_s -LIBS +=-L$(TET_ROOT)/lib/tet3 -lapi_s - -INCS = -I. `pkg-config --cflags $(PKGS)` -INCS += -I. `pkg-config --cflags glib-2.0` -INCS += -I$(TET_ROOT)/inc/tet3 - - -CFLAGS = $(INCS) -CFLAGS += -D_TETWARE_MODE -CFLAGS += -Wall -LDFLAGS = $(LIBS) - -################################################### -# Modify here -# depending on the Test Case you want to build -# -# e.g., -# TCLIST = $(TC1) $(TC2) -all : $(TARGETS) - -$(TARGETS) : %: %.c - $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) - -clean : - rm -rf $(TARGETS) - diff --git a/TC/unit/TC_Gobject/tslist b/TC/unit/TC_Gobject/tslist deleted file mode 100755 index c4eee53..0000000 --- a/TC/unit/TC_Gobject/tslist +++ /dev/null @@ -1,6 +0,0 @@ -/unit/TC_Gobject/utc_libjson_json_serialize_boxed_func -/unit/TC_Gobject/utc_libjson_json_serialize_gobject_func -/unit/TC_Gobject/utc_libjson_json_serialize_interface_func -/unit/TC_Gobject/utc_libjson_json_serialize_simple_func -/unit/TC_Gobject/utc_libjson_json_serialize_complex_func -/unit/TC_Gobject/utc_libjson_json_serialize_full_func \ No newline at end of file diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_boxed_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_boxed_func.c deleted file mode 100755 index 2bc1613..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_boxed_func.c +++ /dev/null @@ -1,360 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_boxed_func_01(void); -static void utc_libjson_json_serialize_boxed_func_02(void); -static void utc_libjson_json_serialize_boxed_func_03(void); -static void utc_libjson_json_serialize_boxed_func_04(void); -static void utc_libjson_json_serialize_boxed_func_05(void); -static void utc_libjson_json_serialize_boxed_func_06(void); - - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_boxed_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_boxed_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_boxed_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_boxed_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_boxed_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_boxed_func_06, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - - -typedef struct _TestBoxed TestBoxed; -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestBoxed -{ - gint foo; - gboolean bar; -}; - -struct _TestObject -{ - GObject parent_instance; - - TestBoxed blah; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - -GType test_object_get_type (void); - - -static const gchar *serialize_data = -"{\n" -" \"blah\" : {\n" -" \"foo\" : 42,\n" -" \"bar\" : true\n" -" }\n" -"}"; - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/*** implementation ***/ - -static gpointer -test_boxed_copy (gpointer src) -{ - return g_slice_dup (TestBoxed, src); -} - -static void -test_boxed_free (gpointer boxed) -{ - if (G_LIKELY (boxed != NULL)) - g_slice_free (TestBoxed, boxed); -} - -static JsonNode * -test_boxed_serialize (gconstpointer boxed) -{ - const TestBoxed *test = boxed; - JsonObject *object; - JsonNode *node; - - if (boxed == NULL) - return json_node_new (JSON_NODE_NULL); - - object = json_object_new (); - node = json_node_new (JSON_NODE_OBJECT); - - json_object_set_int_member (object, "foo", test->foo); - json_object_set_boolean_member (object, "bar", test->bar); - - json_node_take_object (node, object); - - if (g_test_verbose ()) - { - g_print ("Serialize: { foo: %" G_GINT64_FORMAT ", bar: %s }\n", - json_object_get_int_member (object, "foo"), - json_object_get_boolean_member (object, "bar") ? "true" : "false"); - } - - return node; -} - -static gpointer -test_boxed_deserialize (JsonNode *node) -{ - JsonObject *object; - TestBoxed *test; - - if (json_node_get_node_type (node) != JSON_NODE_OBJECT) - return NULL; - - object = json_node_get_object (node); - - test = g_slice_new (TestBoxed); - test->foo = json_object_get_int_member (object, "foo"); - test->bar = json_object_get_boolean_member (object, "bar"); - - if (g_test_verbose ()) - { - g_print ("Deserialize: { foo: %d, bar: %s }\n", - test->foo, - test->bar ? "true" : "false"); - } - - return (gpointer)test; -} - -GType -test_boxed_get_type (void) -{ - static GType b_type = 0; - - if (G_UNLIKELY (b_type == 0)) - { - b_type = g_boxed_type_register_static ("TestBoxed", - test_boxed_copy, - test_boxed_free); - - if (g_test_verbose ()) - g_print ("Registering transform functions\n"); - - json_boxed_register_serialize_func (b_type, JSON_NODE_OBJECT, - test_boxed_serialize); - json_boxed_register_deserialize_func (b_type, JSON_NODE_OBJECT, - test_boxed_deserialize); - } - - return b_type; -} - -enum -{ - PROP_0, - PROP_BLAH -}; - -G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT); - -static void -test_object_finalize (GObject *gobject) -{ - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_BLAH: - { - const TestBoxed *blah = g_value_get_boxed (value); - TEST_OBJECT (gobject)->blah = *blah; - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_BLAH, - g_param_spec_boxed ("blah", "Blah", "Blah", - TEST_TYPE_BOXED, - G_PARAM_READWRITE)); -} - -static void -test_object_init (TestObject *object) -{ - object->blah.foo = 0; - object->blah.bar = FALSE; -} - - -/** - * @brief Positive test case of json_gobject_to_data() - */ -static void utc_libjson_json_serialize_boxed_func_01(void) -{ - TestBoxed boxed = { 42, TRUE }; - GObject *obj = NULL; - gchar *data = NULL; - gsize len = 0; - - obj = g_object_new(TEST_TYPE_OBJECT, "blah", &boxed, NULL); - - data = json_gobject_to_data (obj, &len); - - dts_check_eq("json_serialize_boxed", len, strlen(serialize_data)); - dts_check_str_eq("json_serialize_boxed", data, serialize_data); - - g_free(data); - g_object_unref(obj); -} - -/** - * @brief Negative test case of json_gobject_from_data() - */ -static void utc_libjson_json_serialize_boxed_func_02(void) -{ - GObject *obj = NULL; - - obj = json_gobject_from_data(TEST_TYPE_OBJECT, serialize_data, -1, NULL); - dts_check_eq("json_deserialize_boxed", TEST_IS_OBJECT(obj), TRUE); - dts_check_eq("json_deserialize_boxed", TEST_OBJECT(obj)->blah.foo, 42); - dts_check_eq("json_deserialize_boxed", TEST_OBJECT(obj)->blah.bar, TRUE); - - g_object_unref (obj); -} - -/** -* @brief Negative test case of json_boxed_can_serialize() -*/ -static void utc_libjson_json_serialize_boxed_func_03(void) -{ - gboolean ret = FALSE; - JsonNodeType node_type = JSON_NODE_OBJECT; - ret = json_boxed_can_serialize(TEST_TYPE_BOXED, &node_type); - dts_check_eq("json_boxed_can_serialize", ret, TRUE); -} - -/** -* @brief Negative test case of json_boxed_can_deserialize() -*/ -static void utc_libjson_json_serialize_boxed_func_04(void) -{ - gboolean ret = FALSE; - JsonNodeType node_type = JSON_NODE_OBJECT; - ret = json_boxed_can_deserialize(TEST_TYPE_BOXED, node_type); - dts_check_eq("json_boxed_can_deserialize", ret, TRUE); -} - -/** -* @brief Negative test case of json_boxed_serialize() -*/ -static void utc_libjson_json_serialize_boxed_func_05(void) -{ - TestBoxed boxed = { 42, TRUE }; - GObject *obj = NULL; - JsonNode *node = NULL; - JsonObject *object; - - obj = g_object_new(TEST_TYPE_BOXED, "blah", &boxed, NULL); - node = json_boxed_serialize(TEST_TYPE_BOXED, &boxed); - dts_check_eq("json_boxed_serialize", json_node_get_node_type (node), JSON_NODE_OBJECT); - object = json_node_get_object (node); - dts_check_eq("json_boxed_serialize", json_object_get_int_member(object, "foo"), 42); - dts_check_eq("json_boxed_serialize", json_object_get_boolean_member(object, "bar"), TRUE); - - g_object_unref (obj); - json_node_free (node); -} - -/** -* @brief Negative test case of json_boxed_deserialize() -*/ -static void utc_libjson_json_serialize_boxed_func_06(void) -{ - gpointer *obj = NULL; - JsonObject *object = NULL; - JsonNode *node = NULL; - - object = json_object_new(); - json_object_set_int_member (object, "foo", 42); - json_object_set_boolean_member (object, "bar", TRUE); - node = json_node_new(JSON_NODE_OBJECT); - json_node_take_object (node, object); - - obj = json_boxed_deserialize(TEST_TYPE_BOXED, node); - dts_check_ne("json_boxed_deserialize", obj, NULL); - dts_check_eq("json_boxed_deserialize", ((TestBoxed*)obj)->foo, 42); - dts_check_eq("json_boxed_deserialize", ((TestBoxed*)obj)->bar, TRUE); - - g_object_unref (obj); - json_node_free (node); -} - diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_complex_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_complex_func.c deleted file mode 100755 index 999156e..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_complex_func.c +++ /dev/null @@ -1,314 +0,0 @@ -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_complex_func_01(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_complex_func_01, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - -typedef struct _TestBoxed TestBoxed; -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestBoxed -{ - gint foo; - gboolean bar; -}; - -struct _TestObject -{ - GObject parent_instance; - - gint foo; - gboolean bar; - gchar *baz; - TestBoxed blah; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - -GType test_object_get_type (void); - - -static void startup(void) -{ - g_type_init (); -} - -static void cleanup(void) -{ -} - - -/*** implementation ***/ - -static TestBoxed * -test_boxed_copy (const TestBoxed *src) -{ - TestBoxed *copy = g_slice_new (TestBoxed); - - *copy = *src; - - return copy; -} - -static void -test_boxed_free (TestBoxed *boxed) -{ - if (G_LIKELY (boxed)) - { - g_slice_free (TestBoxed, boxed); - } -} - -GType -test_boxed_get_type (void) -{ - static GType b_type = 0; - - if (G_UNLIKELY (b_type == 0)) - b_type = g_boxed_type_register_static ("TestBoxed", - (GBoxedCopyFunc) test_boxed_copy, - (GBoxedFreeFunc) test_boxed_free); - - return b_type; -} - -enum -{ - PROP_0, - - PROP_FOO, - PROP_BAR, - PROP_BAZ, - PROP_BLAH -}; - -static JsonSerializableIface *serializable_iface = NULL; - -static void json_serializable_iface_init (gpointer g_iface); - -G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, - json_serializable_iface_init)); - -static JsonNode * -test_object_serialize_property (JsonSerializable *serializable, - const gchar *name, - const GValue *value, - GParamSpec *pspec) -{ - JsonNode *retval = NULL; - - if (strcmp (name, "blah") == 0) - { - TestBoxed *boxed; - JsonObject *obj; - JsonNode *val; - - retval = json_node_new (JSON_NODE_OBJECT); - obj = json_object_new (); - - boxed = g_value_get_boxed (value); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_int (val, boxed->foo); - json_object_set_member (obj, "foo", val); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (val, boxed->bar); - json_object_set_member (obj, "bar", val); - - json_node_take_object (retval, obj); - } - else - retval = serializable_iface->serialize_property (serializable, - name, - value, pspec); - - return retval; -} - -static void -json_serializable_iface_init (gpointer g_iface) -{ - JsonSerializableIface *iface = g_iface; - - serializable_iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE); - - iface->serialize_property = test_object_serialize_property; -} - -static void -test_object_finalize (GObject *gobject) -{ - g_free (TEST_OBJECT (gobject)->baz); - - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); - break; - case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); - break; - case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); - break; - case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); - break; - case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); - break; - case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_FOO, - g_param_spec_int ("foo", "Foo", "Foo", - 0, G_MAXINT, 42, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAR, - g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAZ, - g_param_spec_string ("baz", "Baz", "Baz", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BLAH, - g_param_spec_boxed ("blah", "Blah", "Blah", - TEST_TYPE_BOXED, - G_PARAM_READABLE)); -} - -static void -test_object_init (TestObject *object) -{ - object->foo = 42; - object->bar = TRUE; - object->baz = g_strdup ("Test"); - - object->blah.foo = object->foo; - object->blah.bar = object->bar; -} - -/** - * @brief Positive test case of json_serialize_complex() - */ -static void utc_libjson_json_serialize_complex_func_01(void) -{ - TestObject *obj = g_object_new (TEST_TYPE_OBJECT, NULL); - JsonParser *parser = json_parser_new (); - GError *error = NULL; - JsonObject *object = NULL; - JsonNode *node = NULL; - gchar *data = NULL; - gsize len = 0; - - data = json_gobject_to_data (G_OBJECT (obj), &len); - - dts_check_gt("json_serialize_complex", len, 0); - - parser = json_parser_new (); - json_parser_load_from_data (parser, data, -1, &error); - dts_check_eq("json_serialize_complex", error, NULL); - - node = json_parser_get_root (parser); - dts_check_eq("json_serialize_complex", json_node_get_node_type(node), JSON_NODE_OBJECT); - - object = json_node_get_object (node); - dts_check_eq("json_serialize_complex", json_object_get_int_member(object, "foo"), 42); - dts_check_eq("json_serialize_complex", json_object_get_boolean_member(object, "bar"), TRUE); - dts_check_str_eq("json_serialize_complex", json_object_get_string_member(object, "baz"), "Test"); - - node = json_object_get_member (object, "blah"); - dts_check_eq("json_serialize_complex", json_node_get_node_type(node), JSON_NODE_OBJECT); - - object = json_node_get_object (node); - dts_check_eq("json_serialize_complex", json_object_get_int_member(object, "foo"), 42); - dts_check_eq("json_serialize_complex", json_object_get_boolean_member(object, "bar"), TRUE); - - g_free (data); - g_object_unref (parser); - g_object_unref (obj); - -} - - diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_full_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_full_func.c deleted file mode 100755 index 64358ed..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_full_func.c +++ /dev/null @@ -1,312 +0,0 @@ -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_full_func_01(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_full_func_01, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - -typedef struct _TestBoxed TestBoxed; -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestBoxed -{ - gint foo; - gboolean bar; -}; - -struct _TestObject -{ - GObject parent_instance; - - gint foo; - gboolean bar; - gchar *baz; - TestBoxed blah; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - -GType test_object_get_type (void); - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/*** implementation ***/ - -static TestBoxed * -test_boxed_copy (const TestBoxed *src) -{ - TestBoxed *copy = g_slice_new (TestBoxed); - - *copy = *src; - - return copy; -} - -static void -test_boxed_free (TestBoxed *boxed) -{ - if (G_LIKELY (boxed)) - { - g_slice_free (TestBoxed, boxed); - } -} - -GType -test_boxed_get_type (void) -{ - static GType b_type = 0; - - if (G_UNLIKELY (b_type == 0)) - b_type = g_boxed_type_register_static ("TestBoxed", - (GBoxedCopyFunc) test_boxed_copy, - (GBoxedFreeFunc) test_boxed_free); - - return b_type; -} - -enum -{ - PROP_0, - - PROP_FOO, - PROP_BAR, - PROP_BAZ, - PROP_BLAH -}; - -static JsonSerializableIface *serializable_iface = NULL; - -static void json_serializable_iface_init (gpointer g_iface); - -G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, - json_serializable_iface_init)); - -static JsonNode * -test_object_serialize_property (JsonSerializable *serializable, - const gchar *name, - const GValue *value, - GParamSpec *pspec) -{ - JsonNode *retval = NULL; - - if (strcmp (name, "blah") == 0) - { - TestBoxed *boxed; - JsonObject *obj; - JsonNode *val; - - retval = json_node_new (JSON_NODE_OBJECT); - obj = json_object_new (); - - boxed = g_value_get_boxed (value); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_int (val, boxed->foo); - json_object_set_member (obj, "foo", val); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (val, boxed->bar); - json_object_set_member (obj, "bar", val); - - json_node_take_object (retval, obj); - } - else - retval = serializable_iface->serialize_property (serializable, - name, - value, pspec); - - return retval; -} - -static void -json_serializable_iface_init (gpointer g_iface) -{ - JsonSerializableIface *iface = g_iface; - - serializable_iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE); - - iface->serialize_property = test_object_serialize_property; -} - -static void -test_object_finalize (GObject *gobject) -{ - g_free (TEST_OBJECT (gobject)->baz); - - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); - break; - case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); - break; - case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); - break; - case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); - break; - case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); - break; - case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_FOO, - g_param_spec_int ("foo", "Foo", "Foo", - 0, G_MAXINT, 42, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAR, - g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAZ, - g_param_spec_string ("baz", "Baz", "Baz", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BLAH, - g_param_spec_boxed ("blah", "Blah", "Blah", - TEST_TYPE_BOXED, - G_PARAM_READABLE)); -} - -static void -test_object_init (TestObject *object) -{ - object->foo = 42; - object->bar = TRUE; - object->baz = g_strdup ("Test"); - - object->blah.foo = object->foo; - object->blah.bar = object->bar; -} - -/** - * @brief Positive test case of json_serialize_full() - */ -static void utc_libjson_json_serialize_full_func_01(void) -{ - TestObject *obj = g_object_new(TEST_TYPE_OBJECT, NULL); - JsonParser *parser = json_parser_new(); - GError *error = NULL; - JsonObject *object = NULL; - JsonNode *node = NULL; - gchar *data = NULL; - gsize len = 0; - - data = json_gobject_to_data(G_OBJECT(obj), &len); - - dts_check_gt("json_serialize_full", len, 0); - - parser = json_parser_new (); - json_parser_load_from_data (parser, data, -1, &error); - dts_check_eq("json_serialize_full", error, NULL); - - node = json_parser_get_root (parser); - dts_check_eq("json_serialize_full", json_node_get_node_type(node), JSON_NODE_OBJECT); - - object = json_node_get_object (node); - dts_check_eq("json_serialize_full", json_object_get_int_member(object, "foo"), 42); - dts_check_eq("json_serialize_full", json_object_get_boolean_member(object, "bar"), TRUE); - dts_check_str_eq("json_serialize_full", json_object_get_string_member(object, "baz"), "Test"); - - node = json_object_get_member(object, "blah"); - dts_check_eq("json_serialize_full", json_node_get_node_type(node), JSON_NODE_OBJECT); - - object = json_node_get_object(node); - dts_check_eq("json_serialize_full", json_object_get_int_member(object, "foo"), 42); - dts_check_eq("json_serialize_full", json_object_get_boolean_member(object, "bar"), TRUE); - - g_free(data); - g_object_unref(parser); - g_object_unref(obj); - -} - diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_gobject_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_gobject_func.c deleted file mode 100755 index cbc684e..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_gobject_func.c +++ /dev/null @@ -1,410 +0,0 @@ - -#include -#include -#include -#include -#include - -#include -#define JSON_DISABLE_DEPRECATED - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_gobject_func_01(void); -static void utc_libjson_json_serialize_gobject_func_02(void); -static void utc_libjson_json_serialize_gobject_func_03(void); -#ifndef JSON_DISABLE_DEPRECATED -static void utc_libjson_json_serialize_gobject_func_04(void); -static void utc_libjson_json_serialize_gobject_func_05(void); -#endif -static void utc_libjson_json_serialize_gobject_func_06(void); - - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_gobject_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_gobject_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_gobject_func_03, POSITIVE_TC_IDX }, -#ifndef JSON_DISABLE_DEPRECATED - { utc_libjson_json_serialize_gobject_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_gobject_func_05, POSITIVE_TC_IDX }, -#endif - { utc_libjson_json_serialize_gobject_func_06, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - - -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - -typedef struct _TestBoxed TestBoxed; -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestBoxed -{ - gint foo; - gboolean bar; -}; - -struct _TestObject -{ - GObject parent_instance; - - gint foo; - gboolean bar; - gchar *baz; - TestBoxed blah; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - -GType test_object_get_type (void); - -static const gchar *serialize_data = -"{\n" -" \"blah\" : {\n" -" \"foo\" : 42,\n" -" \"bar\" : true\n" -" }\n" -"}"; - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/*** implementation ***/ - -static TestBoxed * -test_boxed_copy (const TestBoxed *src) -{ - TestBoxed *copy = g_slice_new (TestBoxed); - - *copy = *src; - - return copy; -} - -static void -test_boxed_free (TestBoxed *boxed) -{ - if (G_LIKELY (boxed)) - { - g_slice_free (TestBoxed, boxed); - } -} - -GType -test_boxed_get_type (void) -{ - static GType b_type = 0; - - if (G_UNLIKELY (b_type == 0)) - b_type = g_boxed_type_register_static ("TestBoxed", - (GBoxedCopyFunc) test_boxed_copy, - (GBoxedFreeFunc) test_boxed_free); - - return b_type; -} - -enum -{ - PROP_0, - - PROP_FOO, - PROP_BAR, - PROP_BAZ, - PROP_BLAH -}; - -static JsonSerializableIface *serializable_iface = NULL; - -static void json_serializable_iface_init (gpointer g_iface); - -G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, - json_serializable_iface_init)); - -static JsonNode * -test_object_serialize_property (JsonSerializable *serializable, - const gchar *name, - const GValue *value, - GParamSpec *pspec) -{ - JsonNode *retval = NULL; - - if (strcmp (name, "blah") == 0) - { - TestBoxed *boxed; - JsonObject *obj; - JsonNode *val; - - retval = json_node_new (JSON_NODE_OBJECT); - obj = json_object_new (); - - boxed = g_value_get_boxed (value); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_int (val, boxed->foo); - json_object_set_member (obj, "foo", val); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (val, boxed->bar); - json_object_set_member (obj, "bar", val); - - json_node_take_object (retval, obj); - } - else - retval = serializable_iface->serialize_property (serializable, - name, - value, pspec); - - return retval; -} - -static void -json_serializable_iface_init (gpointer g_iface) -{ - JsonSerializableIface *iface = g_iface; - - serializable_iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE); - - iface->serialize_property = test_object_serialize_property; -} - -static void -test_object_finalize (GObject *gobject) -{ - g_free (TEST_OBJECT (gobject)->baz); - - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); - break; - case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); - break; - case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); - break; - case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); - break; - case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); - break; - case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_FOO, - g_param_spec_int ("foo", "Foo", "Foo", - 0, G_MAXINT, 42, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAR, - g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAZ, - g_param_spec_string ("baz", "Baz", "Baz", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BLAH, - g_param_spec_boxed ("blah", "Blah", "Blah", - TEST_TYPE_BOXED, - G_PARAM_READABLE)); -} - -static void -test_object_init (TestObject *object) -{ - object->foo = 42; - object->bar = TRUE; - object->baz = g_strdup ("Test"); - - object->blah.foo = object->foo; - object->blah.bar = object->bar; -} - -/** - * @brief Positive test case of json_gobject_to_data() - */ -static void utc_libjson_json_serialize_gobject_func_01(void) -{ - TestObject *obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - gchar *data; - gsize len; - - data = json_gobject_to_data(G_OBJECT(obj), &len); - - dts_check_ne("json_gobject_to_data", data, NULL); - dts_check_gt("json_gobject_to_data", len, 0); - dts_check_eq("json_gobject_to_data", len, strlen(data)); - - g_free (data); - g_object_unref (obj); -} - - -/** - * @brief Negative test case of json_gobject_from_data() - */ -static void utc_libjson_json_serialize_gobject_func_02(void) -{ - GObject *obj = NULL; - - obj = json_gobject_from_data(TEST_TYPE_OBJECT, serialize_data, -1, NULL); - dts_check_eq("json_gobject_from_data", TEST_IS_OBJECT(obj), TRUE); - dts_check_eq("json_gobject_from_data", TEST_OBJECT(obj)->blah.foo, 42); - dts_check_eq("json_gobject_from_data", TEST_OBJECT(obj)->blah.bar, TRUE); - - g_object_unref (obj); -} - - -/** -* @brief Negative test case of json_gobject_serialize() -*/ -static void utc_libjson_json_serialize_gobject_func_03(void) -{ - JsonNode *node = NULL; - JsonObject *object = NULL; - GObject *obj = NULL; - - obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - node = json_gobject_serialize(obj); - dts_check_eq("json_gobject_serialize", json_node_get_node_type (node), JSON_NODE_OBJECT); - object = json_node_get_object (node); - dts_check_eq("json_gobject_serialize", json_object_get_boolean_member(object, "bar"), TRUE); - - g_object_unref (obj); - json_node_free (node); -} - -#ifndef JSON_DISABLE_DEPRECATED - -/** - * @brief Negative test case of json_construct_gobject() - */ -static void utc_libjson_json_serialize_gobject_func_04(void) -{ - GObject *obj = NULL; - - obj = json_construct_gobject(TEST_TYPE_OBJECT, serialize_data, -1, NULL); - dts_check_eq("json_construct_gobject", TEST_IS_OBJECT(obj), TRUE); - dts_check_eq("json_construct_gobject", TEST_OBJECT(obj)->blah.foo, 42); - dts_check_eq("json_construct_gobject", TEST_OBJECT(obj)->blah.bar, TRUE); - - g_object_unref (obj); -} - - -/** - * @brief Negative test case of json_serialize_gobject() - */ -static void utc_libjson_json_serialize_gobject_func_05(void) -{ - GObject *obj = NULL; - - obj = json_serialize_gobject(TEST_TYPE_OBJECT, serialize_data, -1, NULL); - dts_check_eq("json_serialize_gobject", TEST_IS_OBJECT(obj), TRUE); - dts_check_eq("json_serialize_gobject", TEST_OBJECT(obj)->blah.foo, 42); - dts_check_eq("json_serialize_gobject", TEST_OBJECT(obj)->blah.bar, TRUE); - - g_object_unref (obj); -} -#endif - -/** -* @brief Negative test case of json_gobject_deserialize() -*/ -static void utc_libjson_json_serialize_gobject_func_06(void) -{ - GObject *obj = NULL; - JsonObject *object = NULL; - JsonNode *node = NULL; - - object = json_object_new(); - node = json_node_new(JSON_NODE_OBJECT); - json_object_set_int_member (object, "foo", 42); - json_object_set_boolean_member (object, "bar", TRUE); - json_node_take_object (node, object); - - obj = json_gobject_deserialize(TEST_TYPE_OBJECT, node); - dts_check_eq("json_gobject_deserialize", TEST_IS_OBJECT(obj), TRUE); - dts_check_eq("json_gobject_deserialize", TEST_OBJECT(obj)->foo, 42); - dts_check_eq("json_gobject_deserialize", TEST_OBJECT(obj)->bar, TRUE); - - g_object_unref (obj); - json_object_unref(object); - json_node_free (node); - -} - diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_interface_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_interface_func.c deleted file mode 100755 index f2529ac..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_interface_func.c +++ /dev/null @@ -1,405 +0,0 @@ -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_full_func_01(void); -static void utc_libjson_json_serialize_full_func_02(void); -static void utc_libjson_json_serialize_full_func_03(void); -static void utc_libjson_json_serialize_full_func_04(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_full_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_full_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_full_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_serialize_full_func_04, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - -typedef struct _TestBoxed TestBoxed; -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestBoxed -{ - gint foo; - gboolean bar; -}; - -struct _TestObject -{ - GObject parent_instance; - - gint foo; - gboolean bar; - gchar *baz; - TestBoxed blah; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - - -GType test_object_get_type (void); - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/*** implementation ***/ - -static TestBoxed * -test_boxed_copy (const TestBoxed *src) -{ - TestBoxed *copy = g_slice_new (TestBoxed); - - *copy = *src; - - return copy; -} - -static void -test_boxed_free (TestBoxed *boxed) -{ - if (G_LIKELY (boxed)) - { - g_slice_free (TestBoxed, boxed); - } -} - -GType -test_boxed_get_type (void) -{ - static GType b_type = 0; - - if (G_UNLIKELY (b_type == 0)) - b_type = g_boxed_type_register_static ("TestBoxed", - (GBoxedCopyFunc) test_boxed_copy, - (GBoxedFreeFunc) test_boxed_free); - - return b_type; -} - -enum -{ - PROP_0, - - PROP_FOO, - PROP_BAR, - PROP_BAZ, - PROP_BLAH -}; - -static JsonSerializableIface *serializable_iface = NULL; - -static void json_serializable_iface_init (gpointer g_iface); - -G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, - json_serializable_iface_init)); - -static JsonNode * -test_object_serialize_property (JsonSerializable *serializable, - const gchar *name, - const GValue *value, - GParamSpec *pspec) -{ - JsonNode *retval = NULL; - - if (strcmp (name, "blah") == 0) - { - JsonObject *obj; - - retval = json_node_new (JSON_NODE_OBJECT); - obj = json_object_new (); - - json_object_set_int_member(obj, "foo", g_value_get_int(value)); - json_node_take_object (retval, obj); - } - else - retval = serializable_iface->serialize_property (serializable, - name, - value, pspec); - - return retval; -} - - -static gboolean -test_object_deserialize_property (JsonSerializable *serializable, - const gchar *name, - GValue *value, - GParamSpec *pspec, - JsonNode *node) -{ - gboolean retval = FALSE; - - if (strcmp (name, "blah") == 0) - { - JsonObject *obj; - - obj = json_node_get_object (node); - g_value_set_int (value, json_object_get_int_member(obj, "foo")); - retval = TRUE; - } - else - retval = serializable_iface->deserialize_property (serializable, - name, - value, pspec, node); - return retval; -} - -static void -json_serializable_iface_init (gpointer g_iface) -{ - JsonSerializableIface *iface = g_iface; - - serializable_iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE); - - iface->serialize_property = test_object_serialize_property; - iface->deserialize_property= test_object_deserialize_property; -} - -static void -test_object_finalize (GObject *gobject) -{ - g_free (TEST_OBJECT (gobject)->baz); - - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); - break; - case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); - break; - case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); - break; - case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); - break; - case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); - break; - case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_FOO, - g_param_spec_int ("foo", "Foo", "Foo", - 0, G_MAXINT, 42, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAR, - g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAZ, - g_param_spec_string ("baz", "Baz", "Baz", - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BLAH, - g_param_spec_boxed ("blah", "Blah", "Blah", - TEST_TYPE_BOXED, - G_PARAM_READABLE)); -} - -static void -test_object_init (TestObject *object) -{ - object->foo = 42; - object->bar = TRUE; - object->baz = g_strdup ("Test"); - - object->blah.foo = object->foo; - object->blah.bar = object->bar; -} - - -static void utc_libjson_json_serialize_full_func_01(void) -{ - GObject *obj = NULL; - JsonSerializableIface *iface = NULL; - JsonSerializable *serializable = NULL; - GValue value = {0}; - GParamSpec pspecs; - JsonNode *node = NULL; - JsonObject *ret_object = NULL; - - obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - - serializable = JSON_SERIALIZABLE (obj); - iface = JSON_SERIALIZABLE_GET_IFACE (serializable); - - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 42); - node = json_serializable_serialize_property(serializable, "blah", &value, &pspecs); - - ret_object = json_node_get_object (node); - dts_check_ne("json_serializable_serialize_property", ret_object, NULL); - dts_check_eq("json_serializable_serialize_property", json_object_get_int_member(ret_object, "foo"), 42); - - g_object_unref (obj); - json_node_free (node); -} - - -static void utc_libjson_json_serialize_full_func_02(void) -{ - JsonObject *object = NULL; - JsonNode *node = NULL; - GObject *obj = NULL; - JsonSerializableIface *iface = NULL; - JsonSerializable *serializable = NULL; - GValue value = {0}; - GParamSpec pspecs; - gboolean ret = FALSE; - - object = json_object_new(); - node = json_node_new(JSON_NODE_OBJECT); - json_object_set_int_member (object, "foo", 42); - json_node_take_object (node, object); - - obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - - serializable = JSON_SERIALIZABLE (obj); - iface = JSON_SERIALIZABLE_GET_IFACE (serializable); - - g_value_init (&value, G_TYPE_INT); - ret = json_serializable_deserialize_property(serializable, "blah", &value, &pspecs, node); - dts_check_eq("json_serializable_deserialize_property", ret, TRUE); - dts_check_eq("json_serializable_deserialize_property", g_value_get_int (&value), 42); - - g_object_unref (obj); - json_object_unref(object); - json_node_free (node); - -} - -static void utc_libjson_json_serialize_full_func_03(void) -{ - JsonNode *node = NULL; - GObject *obj = NULL; - JsonSerializableIface *iface = NULL; - JsonSerializable *serializable = NULL; - GValue value = {0}; - GParamSpec pspecs; - - obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - serializable = JSON_SERIALIZABLE (obj); - iface = JSON_SERIALIZABLE_GET_IFACE (serializable); - - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 42); - - node = json_serializable_default_serialize_property(serializable, "blah", &value, &pspecs); - dts_check_ne("json_serializable_default_serialize_property", node, NULL); - dts_check_eq("json_serializable_default_serialize_property", json_node_get_int(node), 42); - - g_object_unref (obj); - json_node_free (node); - -} - -static void utc_libjson_json_serialize_full_func_04(void) -{ - JsonNode *node = NULL; - GObject *obj = NULL; - JsonSerializableIface *iface = NULL; - JsonSerializable *serializable = NULL; - GValue value = {0}; - GParamSpec pspecs; - gboolean ret = FALSE; - - obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - serializable = JSON_SERIALIZABLE (obj); - iface = JSON_SERIALIZABLE_GET_IFACE (serializable); - - node = json_node_new(JSON_NODE_VALUE); - json_node_set_int(node, 42); - - g_value_init (&value, G_TYPE_INT); - ret = json_serializable_default_deserialize_property(serializable, "blah", &value, &pspecs, node); - dts_check_eq("json_serializable_default_deserialize_property", ret, TRUE); - dts_check_eq("json_serializable_default_deserialize_property", g_value_get_int (&value), 42); - - g_object_unref (obj); - json_node_free (node); - -} - diff --git a/TC/unit/TC_Gobject/utc_libjson_json_serialize_simple_func.c b/TC/unit/TC_Gobject/utc_libjson_json_serialize_simple_func.c deleted file mode 100755 index f24d25d..0000000 --- a/TC/unit/TC_Gobject/utc_libjson_json_serialize_simple_func.c +++ /dev/null @@ -1,184 +0,0 @@ -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_serialize_simple_func_01(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_serialize_simple_func_01, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) -#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) -#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) - -typedef struct _TestObject TestObject; -typedef struct _TestObjectClass TestObjectClass; - -struct _TestObject -{ - GObject parent_instance; - - gint foo; - gboolean bar; - gchar *baz; -}; - -struct _TestObjectClass -{ - GObjectClass parent_class; -}; - -GType test_object_get_type (void); - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/*** implementation ***/ - -enum -{ - PROP_0, - - PROP_FOO, - PROP_BAR, - PROP_BAZ -}; - -G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT); - -static void -test_object_finalize (GObject *gobject) -{ - g_free (TEST_OBJECT (gobject)->baz); - - G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); -} - -static void -test_object_set_property (GObject *gobject, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); - break; - case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); - break; - case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_get_property (GObject *gobject, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) - { - case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); - break; - case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); - break; - case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); - } -} - -static void -test_object_class_init (TestObjectClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->set_property = test_object_set_property; - gobject_class->get_property = test_object_get_property; - gobject_class->finalize = test_object_finalize; - - g_object_class_install_property (gobject_class, - PROP_FOO, - g_param_spec_int ("foo", "Foo", "Foo", - 0, G_MAXINT, 42, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAR, - g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, - G_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_BAZ, - g_param_spec_string ("baz", "Baz", "Baz", - NULL, - G_PARAM_READWRITE)); -} - -static void -test_object_init (TestObject *object) -{ - object->foo = 42; - object->bar = FALSE; - object->baz = g_strdup ("Test"); -} - -/** - * @brief Positive test case of json_serialize_simple() - */ -static void utc_libjson_json_serialize_simple_func_01(void) -{ - TestObject *obj = g_object_new(TEST_TYPE_OBJECT, "bar", TRUE, NULL); - gchar *data; - gsize len; - - data = json_gobject_to_data(G_OBJECT(obj), &len); - - dts_check_ne("json_serialize_simple", data, NULL); - dts_check_gt("json_serialize_simple", len, 0); - dts_check_eq("json_serialize_simple", len, strlen(data)); - - g_free (data); - g_object_unref (obj); -} - - diff --git a/TC/unit/TC_Parser/Makefile b/TC/unit/TC_Parser/Makefile deleted file mode 100755 index cbb3917..0000000 --- a/TC/unit/TC_Parser/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -################################################### -# add your TestCase List Here -# -# e.g., -# TC1 = utc_frameworkName_apiName_func -# TC2 = utc_ApplicationLib_recurGetDayOfWeek_func -TARGETS = utc_libjson_json_parser_new_func \ - utc_libjson_json_parser_load_from_file_func \ - utc_libjson_json_parser_load_from_data_func \ - utc_libjson_json_parser_get_root_func \ - utc_libjson_json_parser_get_current_line_func \ - utc_libjson_json_parser_get_current_pos_func \ - utc_libjson_json_parser_has_assignment_func -################################################### -# add your Package Config Info Here -# -# e.g., -# PKGS=calendar -PKGS=json-glib-1.0 - -LIBS = `pkg-config --libs $(PKGS)` -LIBS += `pkg-config --libs glib-2.0` -LIBS +=$(TET_ROOT)/lib/tet3/tcm_s.o -LIBS +=-L$(TET_ROOT)/lib/tet3 -ltcm_s -LIBS +=-L$(TET_ROOT)/lib/tet3 -lapi_s - -INCS = -I. `pkg-config --cflags $(PKGS)` -INCS += -I. `pkg-config --cflags glib-2.0` -INCS += -I$(TET_ROOT)/inc/tet3 - - -CFLAGS = $(INCS) -CFLAGS += -D_TETWARE_MODE -CFLAGS += -Wall -LDFLAGS = $(LIBS) - -################################################### -# Modify here -# depending on the Test Case you want to build -# -# e.g., -# TCLIST = $(TC1) $(TC2) -all : $(TARGETS) - -$(TARGETS) : %: %.c - $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) - -clean : - rm -rf $(TARGETS) - diff --git a/TC/unit/TC_Parser/tslist b/TC/unit/TC_Parser/tslist deleted file mode 100755 index 8b271d3..0000000 --- a/TC/unit/TC_Parser/tslist +++ /dev/null @@ -1,7 +0,0 @@ -/unit/TC_Parser/utc_libjson_json_parser_new_func -/unit/TC_Parser/utc_libjson_json_parser_load_from_file_func -/unit/TC_Parser/utc_libjson_json_parser_load_from_data_func -/unit/TC_Parser/utc_libjson_json_parser_get_root_func -/unit/TC_Parser/utc_libjson_json_parser_get_current_line_func -/unit/TC_Parser/utc_libjson_json_parser_get_current_pos_func -/unit/TC_Parser/utc_libjson_json_parser_has_assignment_func \ No newline at end of file diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_line_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_line_func.c deleted file mode 100755 index 1115c9b..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_line_func.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_get_current_line_func_01(void); -static void utc_libjson_json_parser_get_current_line_func_02(void); -static void utc_libjson_json_parser_get_current_line_func_03(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_get_current_line_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_current_line_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_current_line_func_03, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static const gchar *test_string = "{ \"test\" : 42 }"; - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/** - * @brief Positive test case of json_parser_get_current_line() - */ -static void utc_libjson_json_parser_get_current_line_func_01(void) -{ - int line = 0; - - line = json_parser_get_current_line(NULL); - - dts_check_eq("json_parser_get_current_line", line, 0); - -} - -/** - * @brief Negative test case of ug_init json_parser_get_current_line() - */ -static void utc_libjson_json_parser_get_current_line_func_02(void) -{ - JsonParser *parser = NULL; - int line = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - line = json_parser_get_current_line(parser); - dts_check_eq("json_parser_get_current_line", line, 0); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_get_current_line_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - int line = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_string, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - - line = json_parser_get_current_line(parser); - dts_check_eq("json_parser_get_current_line", line, 0); - g_error_free (error); - g_object_unref (parser); -} - - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_pos_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_pos_func.c deleted file mode 100755 index 65f2c89..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_get_current_pos_func.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_get_current_pos_func_01(void); -static void utc_libjson_json_parser_get_current_pos_func_02(void); -static void utc_libjson_json_parser_get_current_pos_func_03(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_get_current_pos_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_current_pos_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_current_pos_func_03, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static const gchar *test_string = "{ \"test\" : 42 }"; - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - -/** - * @brief Positive test case of json_parser_get_current_pos() - */ -static void utc_libjson_json_parser_get_current_pos_func_01(void) -{ - int pos = 0; - - pos = json_parser_get_current_pos(NULL); - - dts_check_eq("json_parser_get_current_pos", pos, 0); - -} - -static void utc_libjson_json_parser_get_current_pos_func_02(void) -{ - JsonParser *parser = NULL; - int pos = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - pos = json_parser_get_current_pos(parser); - dts_check_eq("json_parser_get_current_pos", pos, 0); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_get_current_pos_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - int pos = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_string, -1, &error); - dts_check_eq("json_parser_get_current_pos", ret, TRUE); - - pos = json_parser_get_current_pos(parser); - dts_check_eq("json_parser_get_current_pos", pos, 0); - g_error_free (error); - g_object_unref (parser); -} - - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_get_root_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_get_root_func.c deleted file mode 100755 index 0057923..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_get_root_func.c +++ /dev/null @@ -1,446 +0,0 @@ -#include -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_get_root_func_01(void); -static void utc_libjson_json_parser_get_root_func_02(void); -static void utc_libjson_json_parser_get_root_func_03(void); -static void utc_libjson_json_parser_get_root_func_04(void); -static void utc_libjson_json_parser_get_root_func_05(void); -static void utc_libjson_json_parser_get_root_func_06(void); -static void utc_libjson_json_parser_get_root_func_07(void); -static void utc_libjson_json_parser_get_root_func_08(void); -static void utc_libjson_json_parser_get_root_func_09(void); -static void utc_libjson_json_parser_get_root_func_10(void); -static void utc_libjson_json_parser_get_root_func_11(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_get_root_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_06, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_07, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_08, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_09, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_10, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_get_root_func_11, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static const gchar *test_empty_string = ""; -static const gchar *test_empty_array_string = "[ ]"; -static const gchar *test_empty_object_string = "{ }"; - -static const struct { - const gchar *str; - JsonNodeType type; - GType gtype; -}test_base_values[] = { - { "null", JSON_NODE_NULL, G_TYPE_INVALID }, - { "42", JSON_NODE_VALUE, G_TYPE_INT64 }, - { "true", JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { "\"string\"", JSON_NODE_VALUE, G_TYPE_STRING }, - { "10.2e3", JSON_NODE_VALUE, G_TYPE_DOUBLE } -}; - -static const struct { - const gchar *str; - gint len; - gint element; - JsonNodeType type; - GType gtype; -}test_simple_arrays[] = { - { "[ true ]", 1, 0, JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { "[ true, false, null ]", 3, 2, JSON_NODE_NULL, G_TYPE_INVALID }, - { "[ 1, 2, 3.14, \"test\" ]", 4, 3, JSON_NODE_VALUE, G_TYPE_STRING } -}; - -static const gchar *test_nested_arrays[] = { - "[ 42, [ ], null ]", - "[ [ ], [ true, [ true ] ] ]", - "[ [ false, true, 42 ], [ true, false, 3.14 ], \"test\" ]", - "[ true, { } ]", - "[ false, { \"test\" : 42 } ]", - "[ { \"test\" : 42 }, null ]", - "[ true, { \"test\" : 42 }, null ]", - "[ { \"channel\" : \"/meta/connect\" } ]" -}; - -static const struct { - const gchar *str; - gint size; - const gchar *member; - JsonNodeType type; - GType gtype; -}test_simple_objects[] = { - { "{ \"test\" : 42 }", 1, "test", JSON_NODE_VALUE, G_TYPE_INT64 }, - { "{ \"name\" : \"\", \"state\" : 1 }", 2, "name", JSON_NODE_VALUE, G_TYPE_STRING }, - { "{ \"foo\" : \"bar\", \"baz\" : null }", 2, "baz", JSON_NODE_NULL, G_TYPE_INVALID }, - { "{ \"channel\" : \"/meta/connect\" }", 1, "channel", JSON_NODE_VALUE, G_TYPE_STRING } -}; - -static const gchar *test_nested_objects[] = { - "{ \"array\" : [ false, \"foo\" ], \"object\" : { \"foo\" : true } }" -}; - -static const struct { - const gchar *str; - const gchar *var; -}test_assignments[] = { - { "var foo = [ false, false, true ]", "foo" }, - { "var bar = [ true, 42 ];", "bar" }, - { "var baz = { \"foo\" : false }", "baz" } -}; - -static const struct -{ - const gchar *str; - const gchar *member; - const gchar *match; -}test_unicode[] = { - { "{ \"test\" : \"foo \\u00e8\" }", "test", "foo è" } -}; - -static const struct -{ - const gchar *str; -}test_invalid[] = { - { "test" }, - { "[ foo, ]" }, - { "[ true, ]" }, - { "{ \"foo\" : true \"bar\" : false }" }, - { "[ true, [ false, ] ]" }, - { "{ \"foo\" : { \"bar\" : false, } }" }, - { "[ { }, { }, { }, ]" } -}; - -static guint n_test_base_values = G_N_ELEMENTS (test_base_values); -static guint n_test_simple_arrays = G_N_ELEMENTS (test_simple_arrays); -static guint n_test_nested_arrays = G_N_ELEMENTS (test_nested_arrays); -static guint n_test_simple_objects = G_N_ELEMENTS (test_simple_objects); -static guint n_test_nested_objects = G_N_ELEMENTS (test_nested_objects); -static guint n_test_assignments = G_N_ELEMENTS (test_assignments); -static guint n_test_unicode = G_N_ELEMENTS (test_unicode); -static guint n_test_invalid = G_N_ELEMENTS (test_invalid); - -static void startup(void) -{ - g_type_init (); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_parser_get_root() - */ -static void utc_libjson_json_parser_get_root_func_01(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_string, -1, &error); - dts_check_eq("json_parser_get_root", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_eq("json_parser_get_root", root, NULL); - - g_error_free (error); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_get_root_func_02(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_base_values; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_base_values[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), test_base_values[i].type); - } - } - dts_pass("json_parser_get_root", "pass"); - g_object_unref (parser); - -} - -static void utc_libjson_json_parser_get_root_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_array_string, -1, &error); - dts_check_eq("json_parser_get_root", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - g_error_free (error); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_get_root_func_04(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_simple_arrays; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_simple_arrays[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - } - } - dts_pass("json_parser_get_root", "pass"); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_get_root_func_05(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_nested_arrays; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_nested_arrays[i], -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - } - } - dts_pass("json_parser_get_root", "pass"); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_get_root_func_06(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_object_string, -1, &error); - dts_check_eq("json_parser_get_root", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - g_error_free (error); - g_object_unref (parser); -} - - - -static void utc_libjson_json_parser_get_root_func_07(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_simple_objects; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_simple_objects[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - } - } - dts_pass("json_parser_get_root", "pass"); - g_object_unref (parser); - -} - -static void utc_libjson_json_parser_get_root_func_08(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_nested_objects; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_nested_objects[i], -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - dts_check_eq("json_parser_get_root", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - } - } - dts_pass("json_parser_get_root", "pass"); - g_object_unref (parser); - -} - - -static void utc_libjson_json_parser_get_root_func_09(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_assignments; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_assignments[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_get_root", root, NULL); - } - } - dts_pass("json_parser_has_assignment", "pass"); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_get_root_func_10(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_unicode; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_unicode[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE (root), JSON_NODE_OBJECT); - } - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); - -} - - -static void utc_libjson_json_parser_get_root_func_11(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_invalid; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_invalid[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, FALSE); - - dts_check_ne("json_parser_load_from_data", error, NULL); - dts_check_eq("json_parser_load_from_data", error->domain, JSON_PARSER_ERROR); - - g_error_free (error); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); - -} - - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_has_assignment_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_has_assignment_func.c deleted file mode 100755 index 044cead..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_has_assignment_func.c +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_has_assignment_func_01(void); -static void utc_libjson_json_parser_has_assignment_func_02(void); -static void utc_libjson_json_parser_has_assignment_func_03(void); -static void utc_libjson_json_parser_has_assignment_func_04(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_has_assignment_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_has_assignment_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_has_assignment_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_has_assignment_func_04, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -static const gchar *test_string = "{ \"test\" : 42 }"; - -static const struct { - const gchar *str; - const gchar *var; -}test_assignments[] = { - { "var foo = [ false, false, true ]", "foo" }, - { "var bar = [ true, 42 ];", "bar" }, - { "var baz = { \"foo\" : false }", "baz" } -}; - -static guint n_test_assignments = G_N_ELEMENTS (test_assignments); - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - - - -/** - * @brief Positive test case of json_parser_has_assignment() - */ -static void utc_libjson_json_parser_has_assignment_func_01(void) -{ - gboolean ret = FALSE; - - ret = json_parser_has_assignment (NULL, NULL); - dts_check_eq("json_parser_has_assignment", ret, FALSE); -} - -/** - * @brief Negative test case of ug_init json_parser_has_assignment() - */ -static void utc_libjson_json_parser_has_assignment_func_02(void) -{ - JsonParser *parser = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_has_assignment(parser, NULL); - dts_check_eq("json_parser_has_assignment", ret, FALSE); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_has_assignment_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - gchar *var = NULL; ; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - if (!json_parser_load_from_data (parser, test_string, -1, &error)) - { - g_error_free (error); - } - else - { - ret = json_parser_has_assignment (parser, &var); - dts_check_eq("json_parser_has_assignment", ret, FALSE); - dts_check_eq("json_parser_has_assignment", var, NULL); - } - g_object_unref (parser); -} - -static void utc_libjson_json_parser_has_assignment_func_04(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - gchar *var = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_assignments; i++) - { - error = NULL; - if (!json_parser_load_from_data (parser, test_assignments[i].str, -1, &error)) - { - g_error_free (error); - } - else - { - ret = json_parser_has_assignment (parser, &var); - dts_check_eq("json_parser_has_assignment", ret, TRUE); - dts_check_ne("json_parser_has_assignment", var, NULL); - dts_check_str_eq ("json_parser_has_assignment", var, test_assignments[i].var); - } - } - dts_pass("json_parser_has_assignment", "pass"); - g_object_unref (parser); -} - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_data_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_data_func.c deleted file mode 100755 index cebfbd7..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_data_func.c +++ /dev/null @@ -1,537 +0,0 @@ -#include -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_load_from_data_func_01(void); -static void utc_libjson_json_parser_load_from_data_func_02(void); -static void utc_libjson_json_parser_load_from_data_func_03(void); -static void utc_libjson_json_parser_load_from_data_func_04(void); -static void utc_libjson_json_parser_load_from_data_func_05(void); -static void utc_libjson_json_parser_load_from_data_func_06(void); -static void utc_libjson_json_parser_load_from_data_func_07(void); -static void utc_libjson_json_parser_load_from_data_func_08(void); -static void utc_libjson_json_parser_load_from_data_func_09(void); -static void utc_libjson_json_parser_load_from_data_func_10(void); -static void utc_libjson_json_parser_load_from_data_func_11(void); -static void utc_libjson_json_parser_load_from_data_func_12(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_load_from_data_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_06, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_07, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_08, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_09, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_10, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_11, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_data_func_12, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static const gchar *test_empty_string = ""; -static const gchar *test_empty_array_string = "[ ]"; -static const gchar *test_empty_object_string = "{ }"; - -static void -verify_int_value (JsonNode *node) -{ - dts_check_eq("json_parser_load_from_data", 42, json_node_get_int (node)); -} - -static void -verify_boolean_value (JsonNode *node) -{ - dts_check_eq("json_parser_load_from_data", TRUE, json_node_get_boolean (node)); -} - -static void -verify_string_value (JsonNode *node) -{ - dts_check_str_eq("json_parser_load_from_data", "string", json_node_get_string (node)); -} - -static void -verify_double_value (JsonNode *node) -{ - dts_check_eq("json_parser_load_from_data", 10.2e3, json_node_get_double (node)); -} - -static const struct { - const gchar *str; - JsonNodeType type; - GType gtype; - void (* verify_value) (JsonNode *node); -}test_base_values[] = { - { "null", JSON_NODE_NULL, G_TYPE_INVALID, NULL, }, - { "42", JSON_NODE_VALUE, G_TYPE_INT64, verify_int_value }, - { "true", JSON_NODE_VALUE, G_TYPE_BOOLEAN, verify_boolean_value }, - { "\"string\"", JSON_NODE_VALUE, G_TYPE_STRING, verify_string_value }, - { "10.2e3", JSON_NODE_VALUE, G_TYPE_DOUBLE, verify_double_value } -}; - -static const struct { - const gchar *str; - gint len; - gint element; - JsonNodeType type; - GType gtype; -}test_simple_arrays[] = { - { "[ true ]", 1, 0, JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { "[ true, false, null ]", 3, 2, JSON_NODE_NULL, G_TYPE_INVALID }, - { "[ 1, 2, 3.14, \"test\" ]", 4, 3, JSON_NODE_VALUE, G_TYPE_STRING } -}; - -static const gchar *test_nested_arrays[] = { - "[ 42, [ ], null ]", - "[ [ ], [ true, [ true ] ] ]", - "[ [ false, true, 42 ], [ true, false, 3.14 ], \"test\" ]", - "[ true, { } ]", - "[ false, { \"test\" : 42 } ]", - "[ { \"test\" : 42 }, null ]", - "[ true, { \"test\" : 42 }, null ]", - "[ { \"channel\" : \"/meta/connect\" } ]" -}; - -static const struct { - const gchar *str; - gint size; - const gchar *member; - JsonNodeType type; - GType gtype; -}test_simple_objects[] = { - { "{ \"test\" : 42 }", 1, "test", JSON_NODE_VALUE, G_TYPE_INT64 }, - { "{ \"name\" : \"\", \"state\" : 1 }", 2, "name", JSON_NODE_VALUE, G_TYPE_STRING }, - { "{ \"foo\" : \"bar\", \"baz\" : null }", 2, "baz", JSON_NODE_NULL, G_TYPE_INVALID }, - { "{ \"channel\" : \"/meta/connect\" }", 1, "channel", JSON_NODE_VALUE, G_TYPE_STRING } -}; - -static const gchar *test_nested_objects[] = { - "{ \"array\" : [ false, \"foo\" ], \"object\" : { \"foo\" : true } }" -}; - -static const struct -{ - const gchar *str; - const gchar *member; - const gchar *match; -}test_unicode[] = { - { "{ \"test\" : \"foo \\u00e8\" }", "test", "foo è" } -}; - -static const struct -{ - const gchar *str; -}test_invalid[] = { - { "test" }, - { "[ foo, ]" }, - { "[ true, ]" }, - { "{ \"foo\" : true \"bar\" : false }" }, - { "[ true, [ false, ] ]" }, - { "{ \"foo\" : { \"bar\" : false, } }" }, - { "[ { }, { }, { }, ]" } -}; - -static guint n_test_base_values = G_N_ELEMENTS (test_base_values); -static guint n_test_simple_arrays = G_N_ELEMENTS (test_simple_arrays); -static guint n_test_nested_arrays = G_N_ELEMENTS (test_nested_arrays); -static guint n_test_simple_objects = G_N_ELEMENTS (test_simple_objects); -static guint n_test_nested_objects = G_N_ELEMENTS (test_nested_objects); -static guint n_test_unicode = G_N_ELEMENTS (test_unicode); -static guint n_test_invalid = G_N_ELEMENTS (test_invalid); - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_parser_load_from_data() - */ -static void utc_libjson_json_parser_load_from_data_func_01(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(NULL, NULL, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, FALSE); - g_error_free (error); - g_object_unref (parser); -} - -/** - * @brief Negative test case of ug_init json_parser_load_from_data() - */ -static void utc_libjson_json_parser_load_from_data_func_02(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, NULL, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, FALSE); - g_error_free (error); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_load_from_data_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_string, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_eq("json_parser_load_from_data", root, NULL); - - g_error_free (error); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_load_from_data_func_04(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_base_values; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_base_values[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE (root), test_base_values[i].type); - dts_check_eq("json_parser_load_from_data", json_node_get_value_type (root), test_base_values[i].gtype); - - if (test_base_values[i].verify_value) - test_base_values[i].verify_value (root); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); - -} - -static void utc_libjson_json_parser_load_from_data_func_05(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonArray *array = NULL; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_array_string, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE (root), JSON_NODE_ARRAY); - dts_check_eq("json_parser_load_from_data", json_node_get_parent (root), NULL); - - array = json_node_get_array (root); - dts_check_ne("json_parser_load_from_data", array, NULL); - - dts_check_eq("json_parser_load_from_data", json_array_get_length (array), 0); - - g_error_free(error); - g_object_unref(parser); -} - - -static void utc_libjson_json_parser_load_from_data_func_06(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonNode *node = NULL; - JsonArray *array = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_simple_arrays; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_simple_arrays[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - array = json_node_get_array (root); - dts_check_ne("json_parser_load_from_data", array, NULL); - - dts_check_eq("json_parser_load_from_data", json_array_get_length(array), test_simple_arrays[i].len); - - node = json_array_get_element (array, test_simple_arrays[i].element); - dts_check_ne("json_parser_load_from_data", node, NULL); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(node), root); - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(node), test_simple_arrays[i].type); - dts_check_eq("json_parser_load_from_data", json_node_get_value_type (node), test_simple_arrays[i].gtype); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_load_from_data_func_07(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonArray *array = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_nested_arrays; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_nested_arrays[i], -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(root), JSON_NODE_ARRAY); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - array = json_node_get_array (root); - dts_check_ne("json_parser_load_from_data", array, NULL); - - dts_check_gt("json_parser_load_from_data", json_array_get_length(array), 0); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); -} - -static void utc_libjson_json_parser_load_from_data_func_08(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonObject *object = NULL; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_data(parser, test_empty_object_string, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - object = json_node_get_object (root); - dts_check_ne("json_parser_load_from_data", object, NULL); - - dts_check_eq("json_parser_load_from_data", json_object_get_size(object), 0); - - g_error_free (error); - g_object_unref (parser); -} - - - -static void utc_libjson_json_parser_load_from_data_func_09(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonNode *node = NULL; - JsonObject *object = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_simple_objects; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_simple_objects[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - object = json_node_get_object (root); - dts_check_ne("json_parser_load_from_data",object, NULL); - dts_check_eq("json_parser_load_from_data", json_object_get_size(object), test_simple_objects[i].size); - - node = json_object_get_member (object, test_simple_objects[i].member); - dts_check_ne("json_parser_load_from_data", node, NULL); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(node), root); - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(node), test_simple_objects[i].type); - dts_check_eq("json_parser_load_from_data", json_node_get_value_type(node), test_simple_objects[i].gtype); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); - -} - -static void utc_libjson_json_parser_load_from_data_func_10(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonObject *object = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_nested_objects; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_nested_objects[i], -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(root), JSON_NODE_OBJECT); - dts_check_eq("json_parser_load_from_data", json_node_get_parent(root), NULL); - - object = json_node_get_object (root); - dts_check_ne("json_parser_load_from_data", object, NULL); - dts_check_gt("json_parser_load_from_data", json_object_get_size(object), 0); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); - -} - - -static void utc_libjson_json_parser_load_from_data_func_11(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - JsonNode *root = NULL; - JsonNode *node = NULL; - JsonObject *object = NULL; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_unicode; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_unicode[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, TRUE); - g_error_free (error); - - root = json_parser_get_root (parser); - dts_check_ne("json_parser_load_from_data", root, NULL); - - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE (root), JSON_NODE_OBJECT); - - object = json_node_get_object (root); - dts_check_ne("json_parser_load_from_data", object, NULL); - dts_check_gt("json_parser_load_from_data", json_object_get_size (object), 0); - - node = json_object_get_member(object, test_unicode[i].member); - dts_check_eq("json_parser_load_from_data", JSON_NODE_TYPE(node), JSON_NODE_VALUE); - dts_check_str_eq("json_parser_load_from_data", json_node_get_string (node), test_unicode[i].match); - dts_check_eq("json_parser_load_from_data", g_utf8_validate(json_node_get_string (node), -1, NULL), TRUE); - - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); -} - - -static void utc_libjson_json_parser_load_from_data_func_12(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - int i = 0; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - for (i = 0; i < n_test_invalid; i++) - { - error = NULL; - ret = json_parser_load_from_data (parser, test_invalid[i].str, -1, &error); - dts_check_eq("json_parser_load_from_data", ret, FALSE); - - dts_check_ne("json_parser_load_from_data", error, NULL); - dts_check_eq("json_parser_load_from_data", error->domain, JSON_PARSER_ERROR); - - g_error_free (error); - } - dts_pass("json_parser_load_from_data", "pass"); - g_object_unref (parser); -} - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_file_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_file_func.c deleted file mode 100755 index 392b312..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_load_from_file_func.c +++ /dev/null @@ -1,94 +0,0 @@ -#include - -#include -#include -#include -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_load_from_file_func_01(void); -static void utc_libjson_json_parser_load_from_file_func_02(void); -static void utc_libjson_json_parser_load_from_file_func_03(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_load_from_file_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_file_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_load_from_file_func_03, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -static void startup(void) -{ - g_type_init (); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_parser_load_from_file() - */ -static void utc_libjson_json_parser_load_from_file_func_01(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_file(NULL, NULL, &error); - dts_check_eq("json_parser_load_from_file", ret, FALSE); - g_error_free (error); - g_object_unref (parser); -} - -/** - * @brief Negative test case of ug_init json_parser_load_from_file() - */ -static void utc_libjson_json_parser_load_from_file_func_02(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_file(parser, NULL, &error); - dts_check_eq("json_parser_load_from_file", ret, FALSE); - g_error_free (error); - g_object_unref (parser); -} - -/** - * @brief Negative test case of ug_init json_parser_load_from_file() - */ -static void utc_libjson_json_parser_load_from_file_func_03(void) -{ - JsonParser *parser = NULL; - GError *error = NULL; - gboolean ret = FALSE; - - parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - - ret = json_parser_load_from_file(parser, "", &error); - dts_check_eq("json_parser_load_from_file", ret, FALSE); - g_error_free (error); - g_object_unref (parser); -} - diff --git a/TC/unit/TC_Parser/utc_libjson_json_parser_new_func.c b/TC/unit/TC_Parser/utc_libjson_json_parser_new_func.c deleted file mode 100755 index 87964a8..0000000 --- a/TC/unit/TC_Parser/utc_libjson_json_parser_new_func.c +++ /dev/null @@ -1,60 +0,0 @@ -#include - -#include -#include -#include -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_parser_new_func_01(void); -static void utc_libjson_json_parser_new_func_02(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_parser_new_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_parser_new_func_02, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static void startup(void) -{ - g_type_init (); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_parser_new() - */ -static void utc_libjson_json_parser_new_func_01(void) -{ - JsonParser *parser = NULL; - - parser = json_parser_new (); - dts_check_ne("json_parser_new", parser, NULL); - g_object_unref (parser); -} - -/** - * @brief Negative test case of ug_init json_parser_new() - */ -static void utc_libjson_json_parser_new_func_02(void) -{ - JsonParser *parser = NULL; - - parser = json_parser_new(); - - dts_check_eq("json_parser_new", JSON_IS_PARSER(parser), TRUE); - g_object_unref (parser); -} diff --git a/TC/unit/TC_Types/Makefile b/TC/unit/TC_Types/Makefile deleted file mode 100755 index 6a7b5df..0000000 --- a/TC/unit/TC_Types/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -################################################### -# add your TestCase List Here -# -# e.g., -# TC1 = utc_frameworkName_apiName_func -# TC2 = utc_ApplicationLib_recurGetDayOfWeek_func -TARGETS = utc_libjson_json_array_func \ - utc_libjson_json_node_func \ - utc_libjson_json_object_func -################################################### -# add your Package Config Info Here -# -# e.g., -# PKGS=calendar -PKGS=json-glib-1.0 - -LIBS = `pkg-config --libs $(PKGS)` -LIBS += `pkg-config --libs glib-2.0` -LIBS +=$(TET_ROOT)/lib/tet3/tcm_s.o -LIBS +=-L$(TET_ROOT)/lib/tet3 -ltcm_s -LIBS +=-L$(TET_ROOT)/lib/tet3 -lapi_s - -INCS = -I. `pkg-config --cflags $(PKGS)` -INCS += -I. `pkg-config --cflags glib-2.0` -INCS += -I$(TET_ROOT)/inc/tet3 - - -CFLAGS = $(INCS) -CFLAGS += -D_TETWARE_MODE -CFLAGS += -Wall -LDFLAGS = $(LIBS) - -################################################### -# Modify here -# depending on the Test Case you want to build -# -# e.g., -# TCLIST = $(TC1) $(TC2) -all : $(TARGETS) - -$(TARGETS) : %: %.c - $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) - -clean : - rm -rf $(TARGETS) - diff --git a/TC/unit/TC_Types/tslist b/TC/unit/TC_Types/tslist deleted file mode 100755 index 6877eac..0000000 --- a/TC/unit/TC_Types/tslist +++ /dev/null @@ -1,3 +0,0 @@ -/unit/TC_Types/utc_libjson_json_array_func -/unit/TC_Types/utc_libjson_json_node_func -/unit/TC_Types/utc_libjson_json_object_func \ No newline at end of file diff --git a/TC/unit/TC_Types/utc_libjson_json_array_func.c b/TC/unit/TC_Types/utc_libjson_json_array_func.c deleted file mode 100755 index b733e80..0000000 --- a/TC/unit/TC_Types/utc_libjson_json_array_func.c +++ /dev/null @@ -1,201 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_array_func_01(void); -static void utc_libjson_json_array_func_02(void); -static void utc_libjson_json_array_func_03(void); -static void utc_libjson_json_array_func_04(void); -static void utc_libjson_json_array_func_05(void); -static void utc_libjson_json_array_func_06(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_array_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_array_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_array_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_array_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_array_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_array_func_06, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - - -typedef struct _TestForeachFixture -{ - gint n_elements; -}TestForeachFixture; - -static const struct { - JsonNodeType element_type; - GType element_gtype; -}type_verify[] = { - { JSON_NODE_VALUE, G_TYPE_INT64 }, - { JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { JSON_NODE_VALUE, G_TYPE_STRING }, - { JSON_NODE_NULL, G_TYPE_INVALID } -}; - - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_array() - */ -static void utc_libjson_json_array_func_01(void) -{ - JsonArray *array = json_array_new (); - - dts_check_eq("json_array_empty", json_array_get_length (array), 0); - dts_check_eq("json_array_empty", json_array_get_elements (array), NULL); - - json_array_unref (array); -} - -/** - * @brief Negative test case of ug_init json_array() - */ -static void utc_libjson_json_array_func_02(void) -{ - JsonArray *array = json_array_new (); - JsonNode *node = json_node_new (JSON_NODE_NULL); - - dts_check_eq("json_array_add", json_array_get_length (array), 0); - - json_array_add_element (array, node); - dts_check_eq("json_array_add", json_array_get_length (array), 1); - - node = json_array_get_element (array, 0); - dts_check_eq("json_array_add", JSON_NODE_TYPE (node), JSON_NODE_NULL); - - json_array_unref (array); -} - -static void utc_libjson_json_array_func_03(void) -{ - JsonArray *array = json_array_new (); - JsonNode *node = json_node_new (JSON_NODE_NULL); - - json_array_add_element (array, node); - json_array_remove_element (array, 0); - dts_check_eq("json_array_remove", json_array_get_length (array), 0); - - json_array_unref (array); -} - -static void -verify_foreach (JsonArray *array, - guint index_, - JsonNode *element_node, - gpointer user_data) -{ - TestForeachFixture *fixture = user_data; - - dts_check_eq("json_array_foreach_element", json_node_get_node_type(element_node), type_verify[index_].element_type); - dts_check_eq("json_array_foreach_element", json_node_get_value_type(element_node), type_verify[index_].element_gtype); - - fixture->n_elements += 1; -} - - -static void utc_libjson_json_array_func_04(void) -{ - JsonArray *array = json_array_new (); - TestForeachFixture fixture = { 0, }; - - json_array_add_int_element (array, 42); - json_array_add_boolean_element (array, TRUE); - json_array_add_string_element (array, "hello"); - json_array_add_null_element (array); - - json_array_foreach_element (array, verify_foreach, &fixture); - - dts_check_eq("json_array_foreach_element", fixture.n_elements, json_array_get_length (array)); - - json_array_unref (array); -} - -static void utc_libjson_json_array_func_05(void) -{ - JsonArray *array = json_array_sized_new (3); - JsonArray *ret_array = NULL; - - ret_array = json_array_ref(array); - dts_check_eq ("json_object_ref", ret_array, array); - - json_array_unref (array); // for ref - json_array_unref (array); // for new -} - - -static void utc_libjson_json_array_func_06(void) -{ - JsonArray* array = NULL; - JsonArray* array_member = NULL; - JsonObject * object_member = NULL; - JsonArray* ret_array = NULL; - JsonObject * ret_object = NULL; - JsonNode * dup_node = NULL; - - array = json_array_new (); - - json_array_add_int_element (array, 42); - json_array_add_double_element(array, 25.6); - json_array_add_boolean_element(array, TRUE); - json_array_add_string_element(array, "foo"); - json_array_add_null_element(array); - - array_member = json_array_new(); - json_array_add_int_element(array_member, 12); - json_array_add_array_element(array, array_member); - - object_member = json_object_new(); - json_object_set_int_member(object_member, "foo", 89); - json_array_add_object_element(array, object_member); - - dts_check_eq ("json_array_int_member_get_set", json_array_get_int_element (array, 0), 42); - dts_check_eq ("json_array_double_member_get_set", json_array_get_double_element (array, 1), 25.6); - dts_check_eq ("json_array_boolean_member_get_set", json_array_get_boolean_element (array, 2), TRUE); - dts_check_str_eq ("json_array_string_member_get_set", json_array_get_string_element (array, 3),"foo"); - dts_check_eq ("json_array_null_member_get_set", json_array_get_null_element (array, 4), TRUE); - - ret_array = json_array_get_array_element (array, 5); - dts_check_eq ("json_array_array_member_get_set", json_array_get_int_element(ret_array, 0), 12); - - ret_object = json_array_get_object_element (array,6); - dts_check_eq ("json_array_object_member_get_set", json_object_get_int_member (ret_object, "foo"), 89); - - dup_node = json_array_dup_element(array, 0); - dts_check_eq ("json_array_dup_element", json_node_get_int(dup_node), 42); - - json_object_unref(object_member); - json_array_unref(array_member); - json_array_unref(array); -} - - - diff --git a/TC/unit/TC_Types/utc_libjson_json_node_func.c b/TC/unit/TC_Types/utc_libjson_json_node_func.c deleted file mode 100755 index 83c8038..0000000 --- a/TC/unit/TC_Types/utc_libjson_json_node_func.c +++ /dev/null @@ -1,276 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_node_func_01(void); -static void utc_libjson_json_node_func_02(void); -static void utc_libjson_json_node_func_03(void); -static void utc_libjson_json_node_func_04(void); -static void utc_libjson_json_node_func_05(void); -static void utc_libjson_json_node_func_06(void); -static void utc_libjson_json_node_func_07(void); -static void utc_libjson_json_node_func_08(void); -static void utc_libjson_json_node_func_09(void); -static void utc_libjson_json_node_func_10(void); -static void utc_libjson_json_node_func_11(void); - - -/* -#define TEST_TYPE_BOXED (test_boxed_get_type ()) -#define TEST_TYPE_OBJECT (test_object_get_type ()) -#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) -#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_OBJECT)) - -*/ -#define JSON_TYPE_NODE (json_node_get_type ()) - -#define TEST_IS_JSONNODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_NODE)) - -GType json_node_get_type (void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_node_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_06, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_07, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_08, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_09, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_10, POSITIVE_TC_IDX }, - { utc_libjson_json_node_func_11, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_node() - */ -static void utc_libjson_json_node_func_01(void) -{ - JsonNode *node = json_node_new (JSON_NODE_NULL); - JsonNode *copy = json_node_copy (node); - - dts_check_eq ("json_node_copy_null", json_node_get_node_type (node), json_node_get_node_type (copy)); - dts_check_eq ("json_node_copy_null", json_node_get_value_type (node), json_node_get_value_type (copy)); - dts_check_eq ("json_node_copy_null", json_node_type_name (node), json_node_type_name (copy)); - - json_node_free (copy); - json_node_free (node); -} - -/** - * @brief Negative test case of ug_init json_node() - */ -static void utc_libjson_json_node_func_02(void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - JsonNode *copy; - - json_node_set_string (node, "hello"); - - copy = json_node_copy (node); - dts_check_eq ("json_node_copy_value", json_node_get_node_type (node), json_node_get_node_type (copy)); - dts_check_str_eq ("json_node_copy_value", json_node_type_name (node), json_node_type_name (copy)); - dts_check_str_eq ("json_node_copy_value", json_node_get_string (node), json_node_get_string (copy)); - - json_node_free (copy); - json_node_free (node); -} - -static void utc_libjson_json_node_func_03(void) -{ - JsonObject *obj = json_object_new (); - JsonNode *node = json_node_new (JSON_NODE_OBJECT); - JsonNode *value = json_node_new (JSON_NODE_VALUE); - JsonNode *copy; - - json_node_set_int (value, 42); - json_object_set_member (obj, "answer", value); - - json_node_take_object (node, obj); - - copy = json_node_copy (node); - - dts_check_eq ("json_node_copy_object", json_node_get_node_type (node), json_node_get_node_type (copy)); - dts_check_eq ("json_node_copy_object", json_node_get_object (node), json_node_get_object (copy)); - - json_node_free (copy); - json_node_free (node); - -} - - -static void utc_libjson_json_node_func_04(void) -{ - JsonNode *node = json_node_new (JSON_NODE_NULL); - - g_assert (JSON_NODE_HOLDS_NULL (node)); - dts_check_eq ("json_node_null", json_node_get_value_type (node), G_TYPE_INVALID); - dts_check_str_eq ("json_node_null", json_node_type_name (node), "NULL"); - - json_node_free (node); -} - -static void utc_libjson_json_node_func_05(void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - GValue value = { 0, }; - GValue check = { 0, }; - - dts_check_eq ("json_node_value", JSON_NODE_TYPE (node), JSON_NODE_VALUE); - - g_value_init (&value, G_TYPE_INT64); - g_value_set_int64 (&value, 42); - - dts_check_eq ("json_node_value", G_VALUE_TYPE (&value), G_TYPE_INT64); - dts_check_eq ("json_node_value", g_value_get_int64 (&value), 42); - - json_node_set_value (node, &value); - json_node_get_value (node, &check); - - dts_check_eq ("json_node_value", G_VALUE_TYPE (&value), G_VALUE_TYPE (&check)); - dts_check_eq ("json_node_value", g_value_get_int64 (&value), g_value_get_int64 (&check)); - dts_check_eq ("json_node_value", G_VALUE_TYPE (&check), G_TYPE_INT64); - dts_check_eq ("json_node_value", g_value_get_int64 (&check), 42); - - g_value_unset (&value); - g_value_unset (&check); - json_node_free (node); - -} - -static void utc_libjson_json_node_func_06(void) -{ - JsonNode *root = json_node_new (JSON_NODE_OBJECT); - JsonNode *node = json_node_new (JSON_NODE_OBJECT); - JsonObject * object = NULL; - JsonObject * ret_object = NULL; - - json_node_set_parent(node, root); - dts_check_eq("json_node_object", json_node_get_parent(node), root); - - object = json_object_new(); - json_object_set_int_member(object, "foo", 12); - - json_node_set_object(node, object); - ret_object = json_node_get_object(node); - dts_check_ne("json_node_object", ret_object, NULL); - dts_check_eq("json_node_object", json_object_get_int_member(ret_object, "foo"), 12); - - json_node_dup_object(node); - dts_check_eq("json_node_object", json_object_get_int_member(ret_object, "foo"), 12); - - json_object_unref(object); //for json_node_set_object - json_object_unref(object); //for json_node_dup_object - - json_node_free(node); - json_node_free(root); -} - -static void utc_libjson_json_node_func_07(void) -{ - JsonNode *node = json_node_new (JSON_NODE_ARRAY); - JsonArray* array = NULL; - JsonArray * ret_array = NULL; - - array = json_array_new(); - json_array_add_int_element(array, 12); - - json_node_set_array(node, array); - ret_array = json_node_get_array(node); - dts_check_ne("json_node_array", ret_array, NULL); - dts_check_eq("json_node_array", json_array_get_int_element(ret_array, 0), 12); - - json_node_take_array(node, array); - ret_array = json_node_get_array(node); - dts_check_eq("json_node_array", json_array_get_int_element(ret_array, 0), 12); - - json_node_dup_array(node); - ret_array = json_node_get_array(node); - dts_check_eq("json_node_array", json_array_get_int_element(ret_array, 0), 12); - - json_array_unref(array); //for json_node_set_array - json_array_unref(array); //for json_node_dup_array - - json_node_free(node); -} - -static void utc_libjson_json_node_func_08(void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - char* value = NULL; - - json_node_set_string(node, "foo"); - dts_check_str_eq("json_node_string", json_node_get_string(node), "foo"); - - value = json_node_dup_string(node); - dts_check_str_eq("json_node_string", json_node_get_string(node), "foo"); - - json_node_free(node); -} - -static void utc_libjson_json_node_func_09(void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - - json_node_set_double(node, 2.3); - dts_check_eq("json_node_double", json_node_get_double(node), 2.3); - - json_node_free(node); -} - -static void utc_libjson_json_node_func_10(void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - - json_node_set_boolean(node, TRUE); - dts_check_eq("json_node_boolean", json_node_get_boolean(node), TRUE); - - json_node_free(node); -} - - -static void utc_libjson_json_node_func_11(void) -{ - JsonNode *node = NULL; - - //GObject *obj = NULL; - //obj = g_object_new(JSON_TYPE_NODE, "bar", TRUE, NULL); - //dts_check_eq("json_node_get_type", TEST_IS_JSONNODE(obj), TRUE); - //g_object_unref (obj); - - dts_check_eq("json_node_is_null", json_node_is_null(node), TRUE); - - node = json_node_new (JSON_NODE_OBJECT); - dts_check_eq("json_node_is_null", json_node_is_null(node), FALSE); - - json_node_free(node); -} - - diff --git a/TC/unit/TC_Types/utc_libjson_json_object_func.c b/TC/unit/TC_Types/utc_libjson_json_object_func.c deleted file mode 100755 index a7dbf57..0000000 --- a/TC/unit/TC_Types/utc_libjson_json_object_func.c +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include - - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_libjson_json_object_func_01(void); -static void utc_libjson_json_object_func_02(void); -static void utc_libjson_json_object_func_03(void); -static void utc_libjson_json_object_func_04(void); -static void utc_libjson_json_object_func_05(void); -static void utc_libjson_json_object_func_06(void); -static void utc_libjson_json_object_func_07(void); - - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_libjson_json_object_func_01, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_02, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_03, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_04, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_05, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_06, POSITIVE_TC_IDX }, - { utc_libjson_json_object_func_07, POSITIVE_TC_IDX }, - { NULL, 0 } -}; - -typedef struct _TestForeachFixture -{ - gint n_members; -}TestForeachFixture; - -static const struct { - const gchar *member_name; - JsonNodeType member_type; - GType member_gtype; -}type_verify[] = { - { "integer", JSON_NODE_VALUE, G_TYPE_INT64 }, - { "boolean", JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { "string", JSON_NODE_VALUE, G_TYPE_STRING }, - { "null", JSON_NODE_NULL, G_TYPE_INVALID } -}; - -static void startup(void) -{ - g_type_init(); -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of json_object() - */ -static void utc_libjson_json_object_func_01(void) -{ - JsonObject *object = json_object_new (); - - dts_check_eq ("json_object_empty", json_object_get_size (object), 0); - dts_check_eq ("json_object_empty", json_object_get_members (object), NULL); - - json_object_unref (object); -} - -/** - * @brief Negative test case of ug_init json_object() - */ -static void utc_libjson_json_object_func_02(void) -{ - JsonObject *object = json_object_new (); - JsonNode *node = json_node_new (JSON_NODE_NULL); - JsonNode *dup_node = NULL; - - dts_check_eq ("json_object_add_member", json_object_get_size (object), 0); - - json_object_set_member (object, "Null", node); - dts_check_eq ("json_object_add_member", json_object_get_size (object), 1); - - dup_node = json_object_dup_member(object, "Null"); - dts_check_eq ("json_object_add_member", JSON_NODE_TYPE (dup_node), JSON_NODE_NULL); - - node = json_object_get_member (object, "Null"); - dts_check_eq ("json_object_add_member", JSON_NODE_TYPE (node), JSON_NODE_NULL); - - json_object_unref (object); -} - -static void utc_libjson_json_object_func_03(void) -{ - JsonObject *object = json_object_new (); - JsonNode *node = json_node_new (JSON_NODE_NULL); - - json_object_set_member (object, "Null", node); - - json_object_remove_member (object, "Null"); - dts_check_eq ("json_object_remove_member", json_object_get_size (object), 0); - - json_object_unref (object); -} - -static void -verify_foreach (JsonObject *object, - const gchar *member_name, - JsonNode *member_node, - gpointer user_data) -{ - TestForeachFixture *fixture = user_data; - gint i = 0; - - for (i = 0; i < G_N_ELEMENTS (type_verify); i++) - { - if (strcmp (member_name, type_verify[i].member_name) == 0) - { - dts_check_eq ("json_object_foreach_member", json_node_get_node_type (member_node), type_verify[i].member_type); - dts_check_eq ("json_object_foreach_member", json_node_get_value_type (member_node), type_verify[i].member_gtype); - break; - } - } - - fixture->n_members += 1; -} - -static void utc_libjson_json_object_func_04(void) -{ - JsonObject *object = json_object_new (); - TestForeachFixture fixture = { 0, }; - - json_object_set_int_member (object, "integer", 42); - json_object_set_boolean_member (object, "boolean", TRUE); - json_object_set_string_member (object, "string", "hello"); - json_object_set_null_member (object, "null"); - - json_object_foreach_member (object, verify_foreach, &fixture); - - dts_check_eq ("json_object_foreach_member", fixture.n_members, json_object_get_size (object)); - - json_object_unref (object); - -} - -static void utc_libjson_json_object_func_05(void) -{ - JsonObject *object = json_object_new (); - - json_object_set_string_member (object, "string", ""); - dts_check_eq ("json_object_empty_member", json_object_has_member (object, "string"), TRUE); - dts_check_str_eq ("json_object_empty_member", json_object_get_string_member (object, "string"), ""); - - json_object_unref (object); -} - -static void utc_libjson_json_object_func_06(void) -{ - JsonObject *object = json_object_new (); - JsonObject *ret_object = NULL; - - ret_object = json_object_ref(object); - - json_object_unref (object); // for ref - json_object_unref (object); // for new - - dts_check_eq ("json_object_ref", ret_object, object); -} - -static void utc_libjson_json_object_func_07(void) -{ - JsonObject *object = NULL; - JsonArray* array = NULL; - JsonObject * object_member = NULL; - JsonArray* ret_array = NULL; - JsonObject * ret_object_member = NULL; - - object = json_object_new (); - - dts_check_eq ("json_object_int_member_get_set", json_object_get_values(object), NULL); - - json_object_set_int_member (object, "Int", 42); - json_object_set_double_member(object, "Double", 25.6); - json_object_set_boolean_member (object, "Bool1", TRUE); - json_object_set_string_member (object, "String", "foo"); - json_object_set_null_member (object, "Null"); - - array = json_array_new(); - json_array_add_int_element(array, 12); - json_object_set_array_member(object, "Array", array); - - object_member = json_object_new(); - json_object_set_int_member(object_member, "foo", 89); - json_object_set_object_member(object, "Object", object_member); - - dts_check_eq ("json_object_int_member_get_set", json_object_get_int_member (object, "Int"), 42); - dts_check_eq ("json_object_double_member_get_set", json_object_get_double_member (object, "Double"), 25.6); - dts_check_eq ("json_object_boolean_member_get_set", json_object_get_boolean_member (object, "Bool1"), TRUE); - dts_check_str_eq ("json_object_string_member_get_set", json_object_get_string_member (object, "String"),"foo"); - dts_check_eq ("json_object_null_member_get_set", json_object_get_null_member (object, "Null"), TRUE); - - ret_array = json_object_get_array_member (object, "Array"); - dts_check_eq ("json_object_null_member_get_set", json_array_get_int_element(ret_array, 0), 12); - - ret_object_member = json_object_get_object_member (object, "Object"); - dts_check_eq ("json_object_null_member_get_set", json_object_get_int_member (ret_object_member, "foo"), 89); - - dts_check_ne ("json_object_int_member_get_set", json_object_get_values(object), NULL); - - json_object_unref(object_member); - json_array_unref(array); - json_object_unref(object); -} - - - diff --git a/TC/unit/tc_gen.sh b/TC/unit/tc_gen.sh deleted file mode 100755 index 54f482d..0000000 --- a/TC/unit/tc_gen.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -TMPSTR=$0 -SCRIPT=${TMPSTR##*/} - -if [ $# -lt 2 ]; then - echo "Usage) $SCRIPT module_name api_name" - exit 1 -fi - -MODULE=$1 -API=$2 -TEMPLATE=utc_MODULE_API_func.c.in -TESTCASE=utc_${MODULE}_${API}_func - -sed -e ' - s^@API@^'"$API"'^g - s^@MODULE@^'"$MODULE"'^g - ' $TEMPLATE > $TESTCASE.c - -if [ ! -e "$TESTCASE.c" ]; then - echo "Failed" - exit 1 -fi -echo "Testcase file is $TESTCASE.c" -echo "Done" -echo "please put \"$TESTCASE\" as Target in Makefile" -echo "please put \"/unit/$TESTCASE\" in tslist" diff --git a/TC/unit/utc_MODULE_API_func.c.in b/TC/unit/utc_MODULE_API_func.c.in deleted file mode 100755 index 5edf1b7..0000000 --- a/TC/unit/utc_MODULE_API_func.c.in +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include "pkgname.h" - -static void startup(void); -static void cleanup(void); - -void (*tet_startup)(void) = startup; -void (*tet_cleanup)(void) = cleanup; - -static void utc_@MODULE@_@API@_func_01(void); -static void utc_@MODULE@_@API@_func_02(void); - -enum { - POSITIVE_TC_IDX = 0x01, - NEGATIVE_TC_IDX, -}; - -struct tet_testlist tet_testlist[] = { - { utc_@MODULE@_@API@_func_01, POSITIVE_TC_IDX }, - { utc_@MODULE@_@API@_func_02, NEGATIVE_TC_IDX }, -}; - -static int pid; - -static void startup(void) -{ -} - -static void cleanup(void) -{ -} - -/** - * @brief Positive test case of @API@() - */ -static void utc_@MODULE@_@API@_func_01(void) -{ - int r = 0; - char buf[MAX_LOCAL_BUFSZ]; - - r = @API@(...); - - if (r<0) { - tet_infoline("@API@() failed in positive test case"); - tet_result(TET_FAIL); - return; - } - tet_result(TET_PASS); -} - -/** - * @brief Negative test case of ug_init @API@() - */ -static void utc_@MODULE@_@API@_func_02(void) -{ - int r = 0; - char buf[MAX_LOCAL_BUFSZ]; - - r = @API@(...); - - if (r>=0) { - tet_infoline("@API@() failed in negative test case"); - tet_result(TET_FAIL); - return; - } - tet_result(TET_PASS); -} diff --git a/autogen.sh b/autogen.sh index 829befb..97ec628 100755 --- a/autogen.sh +++ b/autogen.sh @@ -8,14 +8,15 @@ test -z "$srcdir" && srcdir=. PKG_NAME="libjson-glib" (test -f $srcdir/configure.ac \ - && test -d $srcdir/json-glib) || { - echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" - echo " top-level $PKG_NAME directory" - exit 1 + && test -d $srcdir/json-glib) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level $PKG_NAME directory" + exit 1 } which gnome-autogen.sh || { - echo "You need to install gnome-common from the GNOME CVS" - exit 1 + echo "You need to install gnome-common from the GNOME CVS" + exit 1 } USE_GNOME2_MACROS=1 . gnome-autogen.sh --prefix=/usr --libdir=/usr/lib --bindir=/usr/bin + diff --git a/build/Makefile.am b/build/Makefile.am index 5dce928..2950238 100644 --- a/build/Makefile.am +++ b/build/Makefile.am @@ -1,11 +1 @@ -SUBDIRS = autotools - -test-report: - @true - -test: - @true - -check-local: test - -.PHONY: test-report test check-local +SUBDIRS = autotools win32 diff --git a/build/autotools/Makefile.am b/build/autotools/Makefile.am index 31d36d7..663f44d 100644 --- a/build/autotools/Makefile.am +++ b/build/autotools/Makefile.am @@ -1,23 +1,12 @@ EXTRA_DIST = \ - shave-libtool.in \ - shave.in \ - shave.m4 \ as-compiler-flag.m4 \ + as-linguas.m4 \ + glib-tap.mk \ + glibtests.m4 \ introspection.m4 \ - Makefile.am.silent \ + jh-catalog.m4 \ Makefile.am.enums \ Makefile.am.marshal \ - Makefile.am.gtest - -DISTCLEANFILES = shave-libtool shave - -# needed to avoid including Makefile.am.gtest -test-report: - @true - -test: - @true - -check-local: test - -.PHONY: test test-report check-local + Makefile.am.gitignore \ + tap-driver.sh \ + tap-test diff --git a/build/autotools/Makefile.am.enums b/build/autotools/Makefile.am.enums index 0f34732..7e2e8a4 100644 --- a/build/autotools/Makefile.am.enums +++ b/build/autotools/Makefile.am.enums @@ -24,7 +24,7 @@ BUILT_SOURCES += $(glib_enum_h) $(glib_enum_c) EXTRA_DIST += $(srcdir)/$(enum_tmpl_h) $(srcdir)/$(enum_tmpl_c) stamp-enum-types: $(glib_enum_headers) $(srcdir)/$(enum_tmpl_h) - $(QUIET_GEN)$(GLIB_MKENUMS) \ + $(AM_V_GEN)$(GLIB_MKENUMS) \ --template $(srcdir)/$(enum_tmpl_h) \ $(glib_enum_headers) > xgen-eh \ && (cmp -s xgen-eh $(glib_enum_h) || cp -f xgen-eh $(glib_enum_h)) \ @@ -35,7 +35,7 @@ $(glib_enum_h): stamp-enum-types @true $(glib_enum_c): $(glib_enum_h) $(srcdir)/$(enum_tmpl_c) - $(QUIET_GEN)$(GLIB_MKENUMS) \ + $(AM_V_GEN)$(GLIB_MKENUMS) \ --template $(srcdir)/$(enum_tmpl_c) \ $(glib_enum_headers) > xgen-ec \ && cp -f xgen-ec $(glib_enum_c) \ diff --git a/build/autotools/Makefile.am.gitignore b/build/autotools/Makefile.am.gitignore new file mode 100644 index 0000000..01611a8 --- /dev/null +++ b/build/autotools/Makefile.am.gitignore @@ -0,0 +1,30 @@ +# this file should only be used in directories that generate test +# or example binaries through noinst_PROGRAMS; it is *not* a full +# generator of Git ignore files, and it's not meant to be used as +# the top-level Git ignore file generator. + +$(srcdir)/.gitignore: Makefile.am + $(AM_V_GEN)( \ + echo "*.o" ; \ + echo ".gitignore" ; \ + echo "*.trs" ; \ + echo "*.log" ; \ + ) > $(srcdir)/.gitignore ; \ + for p in $(noinst_PROGRAMS); do \ + echo "/$$p" >> $(srcdir)/.gitignore ; \ + done ; \ + for p in $(check_PROGRAMS); do \ + echo "/$$p" >> $(srcdir)/.gitignore ; \ + done + + +gitignore: $(srcdir)/.gitignore + +gitignore-clean: + @rm -f $(srcdir)/.gitignore + +.PHONY: gitignore gitignore-clean + +all: gitignore + +maintainer-clean: gitignore-clean diff --git a/build/autotools/Makefile.am.gtest b/build/autotools/Makefile.am.gtest deleted file mode 100644 index a01d1b0..0000000 --- a/build/autotools/Makefile.am.gtest +++ /dev/null @@ -1,61 +0,0 @@ -# JSON-GLib - JSON reader and writer library - -GTESTER = gtester -GTESTER_REPORT = gtester-report - -# initialize variables for unconditional += appending -EXTRA_DIST = -TEST_PROGS = - -### testing rules - -# test: run all tests in cwd and subdirs -test: ${TEST_PROGS} - @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} - @ for subdir in $(SUBDIRS) . ; do \ - test "$$subdir" = "." -o "$$subdir" = "po" || \ - ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ - done -# test-report: run tests in subdirs and generate report -# perf-report: run tests in subdirs with -m perf and generate report -# full-report: like test-report: with -m perf and -m slow -test-report perf-report full-report: ${TEST_PROGS} - @test -z "${TEST_PROGS}" || { \ - case $@ in \ - test-report) test_options="-k";; \ - perf-report) test_options="-k -m=perf";; \ - full-report) test_options="-k -m=perf -m=slow";; \ - esac ; \ - if test -z "$$GTESTER_LOGDIR" ; then \ - ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ - elif test -n "${TEST_PROGS}" ; then \ - ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ - fi ; \ - } - @ ignore_logdir=true ; \ - if test -z "$$GTESTER_LOGDIR" ; then \ - GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ - ignore_logdir=false ; \ - fi ; \ - for subdir in $(SUBDIRS) . ; do \ - test "$$subdir" = "." -o "$$subdir" = "po" || \ - ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ - done ; \ - $$ignore_logdir || { \ - echo '' > $@.xml ; \ - echo '' >> $@.xml ; \ - echo '' >> $@.xml ; \ - echo ' $(PACKAGE)' >> $@.xml ; \ - echo ' $(VERSION)' >> $@.xml ; \ - echo '' >> $@.xml ; \ - for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ - sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ - done ; \ - echo >> $@.xml ; \ - echo '' >> $@.xml ; \ - rm -rf "$$GTESTER_LOGDIR"/ ; \ - ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ - } -.PHONY: test test-report perf-report full-report -# run make test as part of make check -check-local: test diff --git a/build/autotools/Makefile.am.marshal b/build/autotools/Makefile.am.marshal index cab117d..f2b4996 100644 --- a/build/autotools/Makefile.am.marshal +++ b/build/autotools/Makefile.am.marshal @@ -23,7 +23,7 @@ BUILT_SOURCES += $(marshal_h) $(marshal_c) EXTRA_DIST += $(srcdir)/$(glib_marshal_list) stamp-marshal: $(glib_marshal_list) - $(QUIET_GEN)$(GLIB_GENMARSHAL) \ + $(AM_V_GEN)$(GLIB_GENMARSHAL) \ --prefix=$(glib_marshal_prefix) \ --header \ $(srcdir)/$(glib_marshal_list) > xgen-mh \ @@ -35,7 +35,7 @@ $(marshal_h): stamp-marshal @true $(marshal_c): $(marshal_h) - $(QUIET_GEN)(echo "#include \"$(marshal_h)\"" ; \ + $(AM_V_GEN)(echo "#include \"$(marshal_h)\"" ; \ $(GLIB_GENMARSHAL) \ --prefix=$(glib_marshal_prefix) \ --body \ diff --git a/build/autotools/Makefile.am.silent b/build/autotools/Makefile.am.silent deleted file mode 100644 index 249f6af..0000000 --- a/build/autotools/Makefile.am.silent +++ /dev/null @@ -1,17 +0,0 @@ -# custom rules for quiet builds - -if USE_SHAVE -QUIET_GEN = $(Q:@=@echo ' GEN '$@;) -QUIET_LN = $(Q:@=@echo ' LN '$@;) -QUIET_RM = $(Q:@=@echo ' RM '$@;) -else -QUIET_GEN = $(AM_V_GEN) - -QUIET_LN = $(QUIET_LN_$(V)) -QUIET_LN_ = $(QUIET_LN_$(AM_DEFAULT_VERBOSITY)) -QUIET_LN_0 = @echo ' LN '$@; - -QUIET_RM = $(QUIET_RM_$(V)) -QUIET_RM_ = $(QUIET_RM_$(AM_DEFAULT_VERBOSITY)) -QUIET_RM_0 = @echo ' RM '$@; -endif # USE_SHAVE diff --git a/build/autotools/as-linguas.m4 b/build/autotools/as-linguas.m4 new file mode 100644 index 0000000..92b28f7 --- /dev/null +++ b/build/autotools/as-linguas.m4 @@ -0,0 +1,24 @@ +# Set ALL_ALL_LINGUAS based on the .po files present. Optional argument is the +# name of the po directory. $podir/LINGUAS.ignore can be used to ignore a +# subset of the po files. + +AC_DEFUN([AS_ALL_LINGUAS], +[ + AC_MSG_CHECKING([for linguas]) + podir="m4_default([$1],[$srcdir/po])" + linguas=`cd $podir && ls *.po 2>/dev/null | awk 'BEGIN { FS="."; ORS=" " } { print $[]1 }'` + if test -f "$podir/LINGUAS.ignore"; then + ALL_LINGUAS=""; + ignore_linguas=`sed -n -e 's/^\s\+\|\s\+$//g' -e '/^#/b' -e '/\S/!b' \ + -e 's/\s\+/\n/g' -e p "$podir/LINGUAS.ignore"`; + for lang in $linguas; do + if ! echo "$ignore_linguas" | grep -q "^${lang}$"; then + ALL_LINGUAS="$ALL_LINGUAS $lang"; + fi; + done; + else + ALL_LINGUAS="$linguas"; + fi; + AC_SUBST([ALL_LINGUAS]) + AC_MSG_RESULT($ALL_LINGUAS) +]) diff --git a/build/autotools/glib-tap.mk b/build/autotools/glib-tap.mk new file mode 100644 index 0000000..7a634cd --- /dev/null +++ b/build/autotools/glib-tap.mk @@ -0,0 +1,134 @@ +# GLIB - Library of useful C routines + +TESTS_ENVIRONMENT= \ + G_TEST_SRCDIR="$(abs_srcdir)" \ + G_TEST_BUILDDIR="$(abs_builddir)" \ + G_DEBUG=gc-friendly \ + MALLOC_CHECK_=2 \ + MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) +LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/build/autotools/tap-driver.sh +LOG_COMPILER = $(top_srcdir)/build/autotools/tap-test + +NULL = + +# initialize variables for unconditional += appending +BUILT_SOURCES = +BUILT_EXTRA_DIST = +CLEANFILES = *.log *.trs +DISTCLEANFILES = +MAINTAINERCLEANFILES = +EXTRA_DIST = +TESTS = + +installed_test_LTLIBRARIES = +installed_test_PROGRAMS = +installed_test_SCRIPTS = +nobase_installed_test_DATA = + +noinst_LTLIBRARIES = +noinst_PROGRAMS = +noinst_SCRIPTS = +noinst_DATA = + +check_LTLIBRARIES = +check_PROGRAMS = +check_SCRIPTS = +check_DATA = + +# We support a fairly large range of possible variables. It is expected that all types of files in a test suite +# will belong in exactly one of the following variables. +# +# First, we support the usual automake suffixes, but in lowercase, with the customary meaning: +# +# test_programs, test_scripts, test_data, test_ltlibraries +# +# The above are used to list files that are involved in both uninstalled and installed testing. The +# test_programs and test_scripts are taken to be actual testcases and will be run as part of the test suite. +# Note that _data is always used with the nobase_ automake variable name to ensure that installed test data is +# installed in the same way as it appears in the package layout. +# +# In order to mark a particular file as being only for one type of testing, use 'installed' or 'uninstalled', +# like so: +# +# installed_test_programs, uninstalled_test_programs +# installed_test_scripts, uninstalled_test_scripts +# installed_test_data, uninstalled_test_data +# installed_test_ltlibraries, uninstalled_test_ltlibraries +# +# Additionally, we support 'extra' infixes for programs and scripts. This is used for support programs/scripts +# that should not themselves be run as testcases (but exist to be used from other testcases): +# +# test_extra_programs, installed_test_extra_programs, uninstalled_test_extra_programs +# test_extra_scripts, installed_test_extra_scripts, uninstalled_test_extra_scripts +# +# Additionally, for _scripts and _data, we support the customary dist_ prefix so that the named script or data +# file automatically end up in the tarball. +# +# dist_test_scripts, dist_test_data, dist_test_extra_scripts +# dist_installed_test_scripts, dist_installed_test_data, dist_installed_test_extra_scripts +# dist_uninstalled_test_scripts, dist_uninstalled_test_data, dist_uninstalled_test_extra_scripts +# +# Note that no file is automatically disted unless it appears in one of the dist_ variables. This follows the +# standard automake convention of not disting programs scripts or data by default. +# +# test_programs, test_scripts, uninstalled_test_programs and uninstalled_test_scripts (as well as their disted +# variants) will be run as part of the in-tree 'make check'. These are all assumed to be runnable under +# gtester. That's a bit strange for scripts, but it's possible. + +TESTS += $(test_programs) $(test_scripts) $(uninstalled_test_programs) $(uninstalled_test_scripts) \ + $(dist_test_scripts) $(dist_uninstalled_test_scripts) + +# Note: build even the installed-only targets during 'make check' to ensure that they still work. +# We need to do a bit of trickery here and manage disting via EXTRA_DIST instead of using dist_ prefixes to +# prevent automake from mistreating gmake functions like $(wildcard ...) and $(addprefix ...) as if they were +# filenames, including removing duplicate instances of the opening part before the space, eg. '$(addprefix'. +all_test_programs = $(test_programs) $(uninstalled_test_programs) $(installed_test_programs) \ + $(test_extra_programs) $(uninstalled_test_extra_programs) $(installed_test_extra_programs) +all_test_scripts = $(test_scripts) $(uninstalled_test_scripts) $(installed_test_scripts) \ + $(test_extra_scripts) $(uninstalled_test_extra_scripts) $(installed_test_extra_scripts) +all_dist_test_scripts = $(dist_test_scripts) $(dist_uninstalled_test_scripts) $(dist_installed_test_scripts) \ + $(dist_test_extra_scripts) $(dist_uninstalled_test_extra_scripts) $(dist_installed_test_extra_scripts) +all_test_scripts += $(all_dist_test_scripts) +EXTRA_DIST += $(all_dist_test_scripts) +all_test_data = $(test_data) $(uninstalled_test_data) $(installed_test_data) +all_dist_test_data = $(dist_test_data) $(dist_uninstalled_test_data) $(dist_installed_test_data) +all_test_data += $(all_dist_test_data) +EXTRA_DIST += $(all_dist_test_data) +all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installed_test_ltlibraries) + +if ENABLE_ALWAYS_BUILD_TESTS +noinst_LTLIBRARIES += $(all_test_ltlibs) +noinst_PROGRAMS += $(all_test_programs) +noinst_SCRIPTS += $(all_test_scripts) +noinst_DATA += $(all_test_data) +else +check_LTLIBRARIES += $(all_test_ltlibs) +check_PROGRAMS += $(all_test_programs) +check_SCRIPTS += $(all_test_scripts) +check_DATA += $(all_test_data) +endif + +if ENABLE_INSTALLED_TESTS +installed_test_PROGRAMS += $(test_programs) $(installed_test_programs) \ + $(test_extra_programs) $(installed_test_extra_programs) +installed_test_SCRIPTS += $(test_scripts) $(installed_test_scripts) \ + $(test_extra_scripts) $(test_installed_extra_scripts) +installed_test_SCRIPTS += $(dist_test_scripts) $(dist_test_extra_scripts) \ + $(dist_installed_test_scripts) $(dist_installed_test_extra_scripts) +nobase_installed_test_DATA += $(test_data) $(installed_test_data) +nobase_installed_test_DATA += $(dist_test_data) $(dist_installed_test_data) +installed_test_LTLIBRARIES += $(test_ltlibraries) $(installed_test_ltlibraries) +installed_testcases = $(test_programs) $(installed_test_programs) \ + $(test_scripts) $(installed_test_scripts) \ + $(dist_test_scripts) $(dist_installed_test_scripts) + +installed_test_meta_DATA = $(installed_testcases:=.test) + +%.test: %$(EXEEXT) Makefile + $(AM_V_GEN) (echo '[Test]' > $@.tmp; \ + echo 'Type=session' >> $@.tmp; \ + echo 'Exec=$(installed_testdir)/$<' >> $@.tmp; \ + mv $@.tmp $@) + +CLEANFILES += $(installed_test_meta_DATA) +endif diff --git a/build/autotools/glibtests.m4 b/build/autotools/glibtests.m4 new file mode 100644 index 0000000..27e9024 --- /dev/null +++ b/build/autotools/glibtests.m4 @@ -0,0 +1,28 @@ +dnl GLIB_TESTS +dnl + +AC_DEFUN([GLIB_TESTS], +[ + AC_ARG_ENABLE(installed-tests, + AS_HELP_STRING([--enable-installed-tests], + [Enable installation of some test cases]), + [case ${enableval} in + yes) ENABLE_INSTALLED_TESTS="1" ;; + no) ENABLE_INSTALLED_TESTS="" ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-installed-tests]) ;; + esac]) + AM_CONDITIONAL([ENABLE_INSTALLED_TESTS], test "$ENABLE_INSTALLED_TESTS" = "1") + AC_ARG_ENABLE(always-build-tests, + AS_HELP_STRING([--enable-always-build-tests], + [Enable always building tests during 'make all']), + [case ${enableval} in + yes) ENABLE_ALWAYS_BUILD_TESTS="1" ;; + no) ENABLE_ALWAYS_BUILD_TESTS="" ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-always-build-tests]) ;; + esac]) + AM_CONDITIONAL([ENABLE_ALWAYS_BUILD_TESTS], test "$ENABLE_ALWAYS_BUILD_TESTS" = "1") + if test "$ENABLE_INSTALLED_TESTS" == "1"; then + AC_SUBST(installed_test_metadir, [${datadir}/installed-tests/]AC_PACKAGE_NAME) + AC_SUBST(installed_testdir, [${libexecdir}/installed-tests/]AC_PACKAGE_NAME) + fi +]) diff --git a/build/autotools/gtk-doc.m4 b/build/autotools/gtk-doc.m4 deleted file mode 100644 index 2cfa1e7..0000000 --- a/build/autotools/gtk-doc.m4 +++ /dev/null @@ -1,61 +0,0 @@ -dnl -*- mode: autoconf -*- - -# serial 1 - -dnl Usage: -dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) -AC_DEFUN([GTK_DOC_CHECK], -[ - AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first - AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first - - dnl check for tools we added during development - AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) - AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) - AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) - - dnl for overriding the documentation installation directory - AC_ARG_WITH([html-dir], - AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, - [with_html_dir='${datadir}/gtk-doc/html']) - HTML_DIR="$with_html_dir" - AC_SUBST([HTML_DIR]) - - dnl enable/disable documentation building - AC_ARG_ENABLE([gtk-doc], - AS_HELP_STRING([--enable-gtk-doc], - [use gtk-doc to build documentation [[default=no]]]),, - [enable_gtk_doc=no]) - - if test x$enable_gtk_doc = xyes; then - ifelse([$1],[], - [PKG_CHECK_EXISTS([gtk-doc],, - AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], - [PKG_CHECK_EXISTS([gtk-doc >= $1],, - AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) - fi - - AC_MSG_CHECKING([whether to build gtk-doc documentation]) - AC_MSG_RESULT($enable_gtk_doc) - - dnl enable/disable output formats - AC_ARG_ENABLE([gtk-doc-html], - AS_HELP_STRING([--enable-gtk-doc-html], - [build documentation in html format [[default=yes]]]),, - [enable_gtk_doc_html=yes]) - AC_ARG_ENABLE([gtk-doc-pdf], - AS_HELP_STRING([--enable-gtk-doc-pdf], - [build documentation in pdf format [[default=no]]]),, - [enable_gtk_doc_pdf=no]) - - if test -z "$GTKDOC_MKPDF"; then - enable_gtk_doc_pdf=no - fi - - - AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) - AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) - AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) - AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) - AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) -]) diff --git a/build/autotools/introspection.m4 b/build/autotools/introspection.m4 index f9ce49c..d89c3d9 100644 --- a/build/autotools/introspection.m4 +++ b/build/autotools/introspection.m4 @@ -41,6 +41,8 @@ m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], ],dnl [auto],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) + dnl Canonicalize enable_introspection + enable_introspection=$found_introspection ],dnl [dnl AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) @@ -59,12 +61,18 @@ m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" + INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` + INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` + INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection fi AC_SUBST(INTROSPECTION_SCANNER) AC_SUBST(INTROSPECTION_COMPILER) AC_SUBST(INTROSPECTION_GENERATE) AC_SUBST(INTROSPECTION_GIRDIR) AC_SUBST(INTROSPECTION_TYPELIBDIR) + AC_SUBST(INTROSPECTION_CFLAGS) + AC_SUBST(INTROSPECTION_LIBS) + AC_SUBST(INTROSPECTION_MAKEFILE) AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") ]) diff --git a/build/autotools/jh-catalog.m4 b/build/autotools/jh-catalog.m4 new file mode 100644 index 0000000..dd01f16 --- /dev/null +++ b/build/autotools/jh-catalog.m4 @@ -0,0 +1,54 @@ +# Checks the location of the XML Catalog +# Usage: +# JH_PATH_XML_CATALOG([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# Defines XMLCATALOG and XML_CATALOG_FILE substitutions +AC_DEFUN([JH_PATH_XML_CATALOG], +[ + # check for the presence of the XML catalog + AC_ARG_WITH([xml-catalog], + AC_HELP_STRING([--with-xml-catalog=CATALOG], + [path to xml catalog to use]),, + [with_xml_catalog=/etc/xml/catalog]) + jh_found_xmlcatalog=true + XML_CATALOG_FILE="$with_xml_catalog" + AC_SUBST([XML_CATALOG_FILE]) + AC_MSG_CHECKING([for XML catalog ($XML_CATALOG_FILE)]) + if test -f "$XML_CATALOG_FILE"; then + AC_MSG_RESULT([found]) + else + jh_found_xmlcatalog=false + AC_MSG_RESULT([not found]) + fi + + # check for the xmlcatalog program + AC_PATH_PROG(XMLCATALOG, xmlcatalog, no) + if test "x$XMLCATALOG" = xno; then + jh_found_xmlcatalog=false + fi + + if $jh_found_xmlcatalog; then + ifelse([$1],,[:],[$1]) + else + ifelse([$2],,[AC_MSG_ERROR([could not find XML catalog])],[$2]) + fi +]) + +# Checks if a particular URI appears in the XML catalog +# Usage: +# JH_CHECK_XML_CATALOG(URI, [FRIENDLY-NAME], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +AC_DEFUN([JH_CHECK_XML_CATALOG], +[ + AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl + AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog]) + if $jh_found_xmlcatalog && \ + AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then + AC_MSG_RESULT([found]) + ifelse([$3],,,[$3 +])dnl + else + AC_MSG_RESULT([not found]) + ifelse([$4],, + [AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])], + [$4]) + fi +]) diff --git a/build/autotools/ltoptions.m4 b/build/autotools/ltoptions.m4 deleted file mode 100644 index 34151a3..0000000 --- a/build/autotools/ltoptions.m4 +++ /dev/null @@ -1,368 +0,0 @@ -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - -## --------------------------------- ## -## Macros to handle LT_INIT options. ## -## --------------------------------- ## - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [0], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [pic_mode="$withval"], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - -## ----------------- ## -## LTDL_INIT Options ## -## ----------------- ## - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/build/autotools/ltsugar.m4 b/build/autotools/ltsugar.m4 deleted file mode 100644 index 9000a05..0000000 --- a/build/autotools/ltsugar.m4 +++ /dev/null @@ -1,123 +0,0 @@ -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) diff --git a/build/autotools/ltversion.m4 b/build/autotools/ltversion.m4 deleted file mode 100644 index f3c5309..0000000 --- a/build/autotools/ltversion.m4 +++ /dev/null @@ -1,23 +0,0 @@ -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# Generated from ltversion.in. - -# serial 3017 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.2.6b]) -m4_define([LT_PACKAGE_REVISION], [1.3017]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.2.6b' -macro_revision='1.3017' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) diff --git a/build/autotools/lt~obsolete.m4 b/build/autotools/lt~obsolete.m4 deleted file mode 100644 index 637bb20..0000000 --- a/build/autotools/lt~obsolete.m4 +++ /dev/null @@ -1,92 +0,0 @@ -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 4 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) diff --git a/build/autotools/shave-libtool.in b/build/autotools/shave-libtool.in deleted file mode 100644 index 1f3a720..0000000 --- a/build/autotools/shave-libtool.in +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -# we need sed -SED=@SED@ -if test -z "$SED" ; then -SED=sed -fi - -lt_unmangle () -{ - last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'` -} - -# the real libtool to use -LIBTOOL="$1" -shift - -# if 1, don't print anything, the underlaying wrapper will do it -pass_though=0 - -# scan the arguments, keep the right ones for libtool, and discover the mode -preserved_args= -while test "$#" -gt 0; do - opt="$1" - shift - - case $opt in - --mode=*) - mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'` - preserved_args="$preserved_args $opt" - ;; - -o) - lt_output="$1" - preserved_args="$preserved_args $opt" - ;; - *) - preserved_args="$preserved_args $opt" - ;; - esac -done - -case "$mode" in -compile) - # shave will be called and print the actual CC/CXX/LINK line - preserved_args="$preserved_args --shave-mode=$mode" - pass_though=1 - ;; -link) - preserved_args="$preserved_args --shave-mode=$mode" - Q=" LINK " - ;; -*) - # let's u - # echo "*** libtool: Unimplemented mode: $mode, fill a bug report" - ;; -esac - -lt_unmangle "$lt_output" -output=$last_result - -if test -z $V; then - if test $pass_though -eq 0; then - echo "$Q$output" - fi - $LIBTOOL --silent $preserved_args -else - echo $LIBTOOL $preserved_args - $LIBTOOL $preserved_args -fi diff --git a/build/autotools/shave.in b/build/autotools/shave.in deleted file mode 100644 index 5c16f27..0000000 --- a/build/autotools/shave.in +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/sh - -# we need sed -SED=@SED@ -if test -z "$SED" ; then -SED=sed -fi - -lt_unmangle () -{ - last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'` -} - -# the tool to wrap (cc, cxx, ar, ranlib, ..) -tool="$1" -shift - -# the reel tool (to call) -REEL_TOOL="$1" -shift - -pass_through=0 -preserved_args= -while test "$#" -gt 0; do - opt="$1" - shift - - case $opt in - --shave-mode=*) - mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'` - ;; - -o) - lt_output="$1" - preserved_args="$preserved_args $opt" - ;; - *) - preserved_args="$preserved_args $opt" - ;; - esac -done - -# mode=link is handled in the libtool wrapper -case "$mode,$tool" in -link,*) - pass_through=1 - ;; -*,cxx) - Q=" CXX " - ;; -*,cc) - Q=" CC " - ;; -*,fc) - Q=" FC " - ;; -*,f77) - Q=" F77 " - ;; -*,objc) - Q=" OBJC " - ;; -*,*) - # should not happen - Q=" CC " - ;; -esac - -lt_unmangle "$lt_output" -output=$last_result - -if test -z $V; then - if test $pass_through -eq 0; then - echo "$Q$output" - fi - $REEL_TOOL $preserved_args -else - echo $REEL_TOOL $preserved_args - $REEL_TOOL $preserved_args -fi diff --git a/build/autotools/shave.m4 b/build/autotools/shave.m4 deleted file mode 100644 index 0a3509e..0000000 --- a/build/autotools/shave.m4 +++ /dev/null @@ -1,77 +0,0 @@ -dnl Make automake/libtool output more friendly to humans -dnl Damien Lespiau -dnl -dnl SHAVE_INIT([shavedir],[default_mode]) -dnl -dnl shavedir: the directory where the shave scripts are, it defaults to -dnl $(top_builddir) -dnl default_mode: (enable|disable) default shave mode. This parameter -dnl controls shave's behaviour when no option has been -dnl given to configure. It defaults to disable. -dnl -dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just -dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrites CC and -dnl LIBTOOL, you don't want the configure tests to have these variables -dnl re-defined. -dnl * This macro requires GNU make's -s option. - -AC_DEFUN([_SHAVE_ARG_ENABLE], -[ - AC_ARG_ENABLE([shave], - AS_HELP_STRING( - [--enable-shave], - [use shave to make the build pretty [[default=$1]]]),, - [enable_shave=$1] - ) -]) - -AC_DEFUN([SHAVE_INIT], -[ - dnl you can tweak the default value of enable_shave - m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)]) - - if test x"$enable_shave" = xyes; then - dnl where can we find the shave scripts? - m4_if([$1],, - [shavedir="$ac_pwd"], - [shavedir="$ac_pwd/$1"]) - AC_SUBST(shavedir) - - dnl make is now quiet - AC_SUBST([MAKEFLAGS], [-s]) - AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`']) - - dnl we need sed - AC_CHECK_PROG(SED,sed,sed,false) - - dnl substitute libtool - SHAVE_SAVED_LIBTOOL=$LIBTOOL - LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'" - AC_SUBST(LIBTOOL) - - dnl substitute cc/cxx - SHAVE_SAVED_CC=$CC - SHAVE_SAVED_CXX=$CXX - SHAVE_SAVED_FC=$FC - SHAVE_SAVED_F77=$F77 - SHAVE_SAVED_OBJC=$OBJC - CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}" - CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}" - FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}" - F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}" - OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}" - AC_SUBST(CC) - AC_SUBST(CXX) - AC_SUBST(FC) - AC_SUBST(F77) - AC_SUBST(OBJC) - - V=@ - else - V=1 - fi - Q='$(V:1=)' - AC_SUBST(V) - AC_SUBST(Q) -]) - diff --git a/build/autotools/tap-driver.sh b/build/autotools/tap-driver.sh new file mode 100755 index 0000000..19aa531 --- /dev/null +++ b/build/autotools/tap-driver.sh @@ -0,0 +1,652 @@ +#! /bin/sh +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# 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 2, 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 . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +scriptversion=2011-12-27.17; # UTC + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +me=tap-driver.sh + +fatal () +{ + echo "$me: fatal: $*" >&2 + exit 1 +} + +usage_error () +{ + echo "$me: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat < + # + trap : 1 3 2 13 15 + if test $merge -gt 0; then + exec 2>&1 + else + exec 2>&3 + fi + "$@" + echo $? + ) | LC_ALL=C ${AM_TAP_AWK-awk} \ + -v me="$me" \ + -v test_script_name="$test_name" \ + -v log_file="$log_file" \ + -v trs_file="$trs_file" \ + -v expect_failure="$expect_failure" \ + -v merge="$merge" \ + -v ignore_exit="$ignore_exit" \ + -v comments="$comments" \ + -v diag_string="$diag_string" \ +' +# FIXME: the usages of "cat >&3" below could be optimized when using +# FIXME: GNU awk, and/on on systems that supports /dev/fd/. + +# Implementation note: in what follows, `result_obj` will be an +# associative array that (partly) simulates a TAP result object +# from the `TAP::Parser` perl module. + +## ----------- ## +## FUNCTIONS ## +## ----------- ## + +function fatal(msg) +{ + print me ": " msg | "cat >&2" + exit 1 +} + +function abort(where) +{ + fatal("internal error " where) +} + +# Convert a boolean to a "yes"/"no" string. +function yn(bool) +{ + return bool ? "yes" : "no"; +} + +function add_test_result(result) +{ + if (!test_results_index) + test_results_index = 0 + test_results_list[test_results_index] = result + test_results_index += 1 + test_results_seen[result] = 1; +} + +# Whether the test script should be re-run by "make recheck". +function must_recheck() +{ + for (k in test_results_seen) + if (k != "XFAIL" && k != "PASS" && k != "SKIP") + return 1 + return 0 +} + +# Whether the content of the log file associated to this test should +# be copied into the "global" test-suite.log. +function copy_in_global_log() +{ + for (k in test_results_seen) + if (k != "PASS") + return 1 + return 0 +} + +# FIXME: this can certainly be improved ... +function get_global_test_result() +{ + if ("ERROR" in test_results_seen) + return "ERROR" + if ("FAIL" in test_results_seen || "XPASS" in test_results_seen) + return "FAIL" + all_skipped = 1 + for (k in test_results_seen) + if (k != "SKIP") + all_skipped = 0 + if (all_skipped) + return "SKIP" + return "PASS"; +} + +function stringify_result_obj(result_obj) +{ + if (result_obj["is_unplanned"] || result_obj["number"] != testno) + return "ERROR" + + if (plan_seen == LATE_PLAN) + return "ERROR" + + if (result_obj["directive"] == "TODO") + return result_obj["is_ok"] ? "XPASS" : "XFAIL" + + if (result_obj["directive"] == "SKIP") + return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL; + + if (length(result_obj["directive"])) + abort("in function stringify_result_obj()") + + return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL +} + +function decorate_result(result) +{ + color_name = color_for_result[result] + if (color_name) + return color_map[color_name] "" result "" color_map["std"] + # If we are not using colorized output, or if we do not know how + # to colorize the given result, we should return it unchanged. + return result +} + +function report(result, details) +{ + if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/) + { + msg = ": " test_script_name + add_test_result(result) + } + else if (result == "#") + { + msg = " " test_script_name ":" + } + else + { + abort("in function report()") + } + if (length(details)) + msg = msg " " details + # Output on console might be colorized. + print decorate_result(result) msg + # Log the result in the log file too, to help debugging (this is + # especially true when said result is a TAP error or "Bail out!"). + print result msg | "cat >&3"; +} + +function testsuite_error(error_message) +{ + report("ERROR", "- " error_message) +} + +function handle_tap_result() +{ + details = result_obj["number"]; + if (length(result_obj["description"])) + details = details " " result_obj["description"] + + if (plan_seen == LATE_PLAN) + { + details = details " # AFTER LATE PLAN"; + } + else if (result_obj["is_unplanned"]) + { + details = details " # UNPLANNED"; + } + else if (result_obj["number"] != testno) + { + details = sprintf("%s # OUT-OF-ORDER (expecting %d)", + details, testno); + } + else if (result_obj["directive"]) + { + details = details " # " result_obj["directive"]; + if (length(result_obj["explanation"])) + details = details " " result_obj["explanation"] + } + + report(stringify_result_obj(result_obj), details) +} + +# `skip_reason` should be empty whenever planned > 0. +function handle_tap_plan(planned, skip_reason) +{ + planned += 0 # Avoid getting confused if, say, `planned` is "00" + if (length(skip_reason) && planned > 0) + abort("in function handle_tap_plan()") + if (plan_seen) + { + # Error, only one plan per stream is acceptable. + testsuite_error("multiple test plans") + return; + } + planned_tests = planned + # The TAP plan can come before or after *all* the TAP results; we speak + # respectively of an "early" or a "late" plan. If we see the plan line + # after at least one TAP result has been seen, assume we have a late + # plan; in this case, any further test result seen after the plan will + # be flagged as an error. + plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN) + # If testno > 0, we have an error ("too many tests run") that will be + # automatically dealt with later, so do not worry about it here. If + # $plan_seen is true, we have an error due to a repeated plan, and that + # has already been dealt with above. Otherwise, we have a valid "plan + # with SKIP" specification, and should report it as a particular kind + # of SKIP result. + if (planned == 0 && testno == 0) + { + if (length(skip_reason)) + skip_reason = "- " skip_reason; + report("SKIP", skip_reason); + } +} + +function extract_tap_comment(line) +{ + if (index(line, diag_string) == 1) + { + # Strip leading `diag_string` from `line`. + line = substr(line, length(diag_string) + 1) + # And strip any leading and trailing whitespace left. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + # Return what is left (if any). + return line; + } + return ""; +} + +# When this function is called, we know that line is a TAP result line, +# so that it matches the (perl) RE "^(not )?ok\b". +function setup_result_obj(line) +{ + # Get the result, and remove it from the line. + result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0) + sub("^(not )?ok[ \t]*", "", line) + + # If the result has an explicit number, get it and strip it; otherwise, + # automatically assing the next progresive number to it. + if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/) + { + match(line, "^[0-9]+") + # The final `+ 0` is to normalize numbers with leading zeros. + result_obj["number"] = substr(line, 1, RLENGTH) + 0 + line = substr(line, RLENGTH + 1) + } + else + { + result_obj["number"] = testno + } + + if (plan_seen == LATE_PLAN) + # No further test results are acceptable after a "late" TAP plan + # has been seen. + result_obj["is_unplanned"] = 1 + else if (plan_seen && testno > planned_tests) + result_obj["is_unplanned"] = 1 + else + result_obj["is_unplanned"] = 0 + + # Strip trailing and leading whitespace. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + + # This will have to be corrected if we have a "TODO"/"SKIP" directive. + result_obj["description"] = line + result_obj["directive"] = "" + result_obj["explanation"] = "" + + if (index(line, "#") == 0) + return # No possible directive, nothing more to do. + + # Directives are case-insensitive. + rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*" + + # See whether we have the directive, and if yes, where. + pos = match(line, rx "$") + if (!pos) + pos = match(line, rx "[^a-zA-Z0-9_]") + + # If there was no TAP directive, we have nothing more to do. + if (!pos) + return + + # Let`s now see if the TAP directive has been escaped. For example: + # escaped: ok \# SKIP + # not escaped: ok \\# SKIP + # escaped: ok \\\\\# SKIP + # not escaped: ok \ # SKIP + if (substr(line, pos, 1) == "#") + { + bslash_count = 0 + for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--) + bslash_count += 1 + if (bslash_count % 2) + return # Directive was escaped. + } + + # Strip the directive and its explanation (if any) from the test + # description. + result_obj["description"] = substr(line, 1, pos - 1) + # Now remove the test description from the line, that has been dealt + # with already. + line = substr(line, pos) + # Strip the directive, and save its value (normalized to upper case). + sub("^[ \t]*#[ \t]*", "", line) + result_obj["directive"] = toupper(substr(line, 1, 4)) + line = substr(line, 5) + # Now get the explanation for the directive (if any), with leading + # and trailing whitespace removed. + sub("^[ \t]*", "", line) + sub("[ \t]*$", "", line) + result_obj["explanation"] = line +} + +function get_test_exit_message(status) +{ + if (status == 0) + return "" + if (status !~ /^[1-9][0-9]*$/) + abort("getting exit status") + if (status < 127) + exit_details = "" + else if (status == 127) + exit_details = " (command not found?)" + else if (status >= 128 && status <= 255) + exit_details = sprintf(" (terminated by signal %d?)", status - 128) + else if (status > 256 && status <= 384) + # We used to report an "abnormal termination" here, but some Korn + # shells, when a child process die due to signal number n, can leave + # in $? an exit status of 256+n instead of the more standard 128+n. + # Apparently, both behaviours are allowed by POSIX (2008), so be + # prepared to handle them both. See also Austing Group report ID + # 0000051 + exit_details = sprintf(" (terminated by signal %d?)", status - 256) + else + # Never seen in practice. + exit_details = " (abnormal termination)" + return sprintf("exited with status %d%s", status, exit_details) +} + +function write_test_results() +{ + print ":global-test-result: " get_global_test_result() > trs_file + print ":recheck: " yn(must_recheck()) > trs_file + print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file + for (i = 0; i < test_results_index; i += 1) + print ":test-result: " test_results_list[i] > trs_file + close(trs_file); +} + +BEGIN { + +## ------- ## +## SETUP ## +## ------- ## + +'"$init_colors"' + +# Properly initialized once the TAP plan is seen. +planned_tests = 0 + +COOKED_PASS = expect_failure ? "XPASS": "PASS"; +COOKED_FAIL = expect_failure ? "XFAIL": "FAIL"; + +# Enumeration-like constants to remember which kind of plan (if any) +# has been seen. It is important that NO_PLAN evaluates "false" as +# a boolean. +NO_PLAN = 0 +EARLY_PLAN = 1 +LATE_PLAN = 2 + +testno = 0 # Number of test results seen so far. +bailed_out = 0 # Whether a "Bail out!" directive has been seen. + +# Whether the TAP plan has been seen or not, and if yes, which kind +# it is ("early" is seen before any test result, "late" otherwise). +plan_seen = NO_PLAN + +## --------- ## +## PARSING ## +## --------- ## + +is_first_read = 1 + +while (1) + { + # Involutions required so that we are able to read the exit status + # from the last input line. + st = getline + if (st < 0) # I/O error. + fatal("I/O error while reading from input stream") + else if (st == 0) # End-of-input + { + if (is_first_read) + abort("in input loop: only one input line") + break + } + if (is_first_read) + { + is_first_read = 0 + nextline = $0 + continue + } + else + { + curline = nextline + nextline = $0 + $0 = curline + } + # Copy any input line verbatim into the log file. + print | "cat >&3" + # Parsing of TAP input should stop after a "Bail out!" directive. + if (bailed_out) + continue + + # TAP test result. + if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/) + { + testno += 1 + setup_result_obj($0) + handle_tap_result() + } + # TAP plan (normal or "SKIP" without explanation). + else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/) + { + # The next two lines will put the number of planned tests in $0. + sub("^1\\.\\.", "") + sub("[^0-9]*$", "") + handle_tap_plan($0, "") + continue + } + # TAP "SKIP" plan, with an explanation. + else if ($0 ~ /^1\.\.0+[ \t]*#/) + { + # The next lines will put the skip explanation in $0, stripping + # any leading and trailing whitespace. This is a little more + # tricky in truth, since we want to also strip a potential leading + # "SKIP" string from the message. + sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "") + sub("[ \t]*$", ""); + handle_tap_plan(0, $0) + } + # "Bail out!" magic. + # Older versions of prove and TAP::Harness (e.g., 3.17) did not + # recognize a "Bail out!" directive when preceded by leading + # whitespace, but more modern versions (e.g., 3.23) do. So we + # emulate the latter, "more modern" behaviour. + else if ($0 ~ /^[ \t]*Bail out!/) + { + bailed_out = 1 + # Get the bailout message (if any), with leading and trailing + # whitespace stripped. The message remains stored in `$0`. + sub("^[ \t]*Bail out![ \t]*", ""); + sub("[ \t]*$", ""); + # Format the error message for the + bailout_message = "Bail out!" + if (length($0)) + bailout_message = bailout_message " " $0 + testsuite_error(bailout_message) + } + # Maybe we have too look for dianogtic comments too. + else if (comments != 0) + { + comment = extract_tap_comment($0); + if (length(comment)) + report("#", comment); + } + } + +## -------- ## +## FINISH ## +## -------- ## + +# A "Bail out!" directive should cause us to ignore any following TAP +# error, as well as a non-zero exit status from the TAP producer. +if (!bailed_out) + { + if (!plan_seen) + { + testsuite_error("missing test plan") + } + else if (planned_tests != testno) + { + bad_amount = testno > planned_tests ? "many" : "few" + testsuite_error(sprintf("too %s tests run (expected %d, got %d)", + bad_amount, planned_tests, testno)) + } + if (!ignore_exit) + { + # Fetch exit status from the last line. + exit_message = get_test_exit_message(nextline) + if (exit_message) + testsuite_error(exit_message) + } + } + +write_test_results() + +exit 0 + +} # End of "BEGIN" block. +' + +# TODO: document that we consume the file descriptor 3 :-( +} 3>"$log_file" + +test $? -eq 0 || fatal "I/O or internal error" + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/autotools/tap-test b/build/autotools/tap-test new file mode 100755 index 0000000..481e333 --- /dev/null +++ b/build/autotools/tap-test @@ -0,0 +1,5 @@ +#! /bin/sh + +# run a GTest in tap mode. The test binary is passed as $1 + +$1 -k --tap diff --git a/build/win32/.gitignore b/build/win32/.gitignore new file mode 100644 index 0000000..33005d2 --- /dev/null +++ b/build/win32/.gitignore @@ -0,0 +1,4 @@ +/config.h.win32 +/vs10/json-glib.vcxproj +/vs10/json-glib.vcxproj.filters +/vs9/json-glib.vcproj diff --git a/build/win32/Makefile.am b/build/win32/Makefile.am new file mode 100644 index 0000000..eea13ac --- /dev/null +++ b/build/win32/Makefile.am @@ -0,0 +1,9 @@ +SUBDIRS = vs9 vs10 + +EXTRA_DIST = \ + config.h.win32.in \ + config.h.win32 \ + gen-file-list-jsonglib.py \ + detectenv_msvc.mak \ + introspection-msvc.mak \ + json-glib-introspection-msvc.mak diff --git a/build/win32/config.h.win32.in b/build/win32/config.h.win32.in new file mode 100644 index 0000000..f150ce1 --- /dev/null +++ b/build/win32/config.h.win32.in @@ -0,0 +1,100 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#define ENABLE_NLS 1 + +/* The prefix for our gettext translation domains. */ +#define GETTEXT_PACKAGE "json-glib-1.0" + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Whether you have gcov */ +/* #undef HAVE_GCOV */ + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define if you have the iconv() function and it works. */ +#define HAVE_ICONV 1 + +/* Define to 1 if you have the header file. */ +#if !defined (_MSC_VER) || (_MSC_VER >= 1800) +#define HAVE_INTTYPES_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#if !defined (_MSC_VER) || (_MSC_VER >= 1600) +#define HAVE_STDINT_H 1 +#endif + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +/*#undef HAVE_STRINGS_H*/ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_UNISTD_H 1 +#endif + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "json-glib" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "json-glib @JSON_MAJOR_VERSION@.@JSON_MINOR_VERSION@.@JSON_MICRO_VERSION@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "json-glib" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@JSON_MAJOR_VERSION@.@JSON_MINOR_VERSION@.@JSON_MICRO_VERSION@" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* defines how to decorate public symbols while building */ +#ifdef _MSC_VER +#define _JSON_EXTERN __declspec(dllexport) extern +#else +#define _JSON_EXTERN __attribute__((visibility("default"))) __declspec(dllexport) extern +#endif diff --git a/build/win32/detectenv_msvc.mak b/build/win32/detectenv_msvc.mak new file mode 100644 index 0000000..020548a --- /dev/null +++ b/build/win32/detectenv_msvc.mak @@ -0,0 +1,65 @@ +# Check to see we are configured to build with MSVC (MSDEVDIR, MSVCDIR or +# VCINSTALLDIR) or with the MS Platform SDK (MSSDK or WindowsSDKDir) +!if !defined(VCINSTALLDIR) && !defined(WINDOWSSDKDIR) +MSG = ^ +This Makefile is only for Visual Studio 2008 and later.^ +You need to ensure that the Visual Studio Environment is properly set up^ +before running this Makefile. +!error $(MSG) +!endif + +ERRNUL = 2>NUL +_HASH=^# + +!if ![echo VCVERSION=_MSC_VER > vercl.x] \ + && ![echo $(_HASH)if defined(_M_IX86) >> vercl.x] \ + && ![echo PLAT=Win32 >> vercl.x] \ + && ![echo $(_HASH)elif defined(_M_AMD64) >> vercl.x] \ + && ![echo PLAT=x64 >> vercl.x] \ + && ![echo $(_HASH)endif >> vercl.x] \ + && ![cl -nologo -TC -P vercl.x $(ERRNUL)] +!include vercl.i +!if ![echo VCVER= ^\> vercl.vc] \ + && ![set /a $(VCVERSION) / 100 - 6 >> vercl.vc] +!include vercl.vc +!endif +!endif +!if ![del $(ERRNUL) /q/f vercl.x vercl.i vercl.vc] +!endif + +!if $(VCVERSION) > 1499 && $(VCVERSION) < 1600 +VSVER = 9 +!elseif $(VCVERSION) > 1599 && $(VCVERSION) < 1700 +VSVER = 10 +!elseif $(VCVERSION) > 1699 && $(VCVERSION) < 1800 +VSVER = 11 +!elseif $(VCVERSION) > 1799 && $(VCVERSION) < 1900 +VSVER = 12 +!else +VSVER = 0 +!endif + +!if "$(VSVER)" == "0" +MSG = ^ +This NMake Makefile set supports Visual Studio^ +9 (2008) through 12 (2013). Your Visual Studio^ +version is not supported. +!error $(MSG) +!endif + +VALID_CFGSET = FALSE +!if "$(CFG)" == "release" || "$(CFG)" == "debug" +VALID_CFGSET = TRUE +!endif + +!if "$(CFG)" == "release" +CFLAGS_ADD = /MD /O2 +!else +CFLAGS_ADD = /MDd /Od /Zi +!endif + +!if "$(PLAT)" == "x64" +LDFLAGS_ARCH = /machine:x64 +!else +LDFLAGS_ARCH = /machine:x86 +!endif diff --git a/build/win32/gen-file-list-jsonglib.py b/build/win32/gen-file-list-jsonglib.py new file mode 100644 index 0000000..9e1c43f --- /dev/null +++ b/build/win32/gen-file-list-jsonglib.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# vim: encoding=utf-8 +# Generate the file lists for processing with g-ir-scanner +import os +import sys +import re +import string +import subprocess +import optparse + +def gen_jsonglib_filelist(srcroot, subdir, dest): + vars = read_vars_from_AM(os.path.join(srcroot, subdir, 'Makefile.am'), + vars = {'srcdir':'../json-glib', + 'top_srcdir':'..', + 'top_builddir':'..'}, + conds = {'HAVE_INTROSPECTION':True}, + filters = ['Json_1_0_gir_FILES']) + + files = vars['Json_1_0_gir_FILES'].split() + if (srcroot == '..\\..'): + relative_srcdir = '..' + else: + relative_srcdir = 'srcroot' + + with open(dest, 'w') as d: + for i in files: + d.write(relative_srcdir + '\\' + i.replace('/', '\\') + '\n') + +def read_vars_from_AM(path, vars = {}, conds = {}, filters = None): + ''' + path: path to the Makefile.am + vars: predefined variables + conds: condition variables for Makefile + filters: if None, all variables defined are returned, + otherwise, it is a list contains that variables should be returned + ''' + cur_vars = vars.copy() + RE_AM_VAR_REF = re.compile(r'\$\((\w+?)\)') + RE_AM_VAR = re.compile(r'^\s*(\w+)\s*=(.*)$') + RE_AM_INCLUDE = re.compile(r'^\s*include\s+(\w+)') + RE_AM_CONTINUING = re.compile(r'\\\s*$') + RE_AM_IF = re.compile(r'^\s*if\s+(\w+)') + RE_AM_ELSE = re.compile(r'^\s*else') + RE_AM_ENDIF = re.compile(r'^\s*endif') + def am_eval(cont): + return RE_AM_VAR_REF.sub(lambda x: cur_vars.get(x.group(1), ''), cont) + with open(path, 'r') as f: + contents = f.readlines() + #combine continuing lines + i = 0 + ncont = [] + while i < len(contents): + line = contents[i] + if RE_AM_CONTINUING.search(line): + line = RE_AM_CONTINUING.sub('', line) + j = i + 1 + while j < len(contents) and RE_AM_CONTINUING.search(contents[j]): + line += RE_AM_CONTINUING.sub('', contents[j]) + j += 1 + else: + if j < len(contents): + line += contents[j] + i = j + else: + i += 1 + ncont.append(line) + + #include, var define, var evaluation + i = -1 + skip = False + oldskip = [] + while i < len(ncont) - 1: + i += 1 + line = ncont[i] + mo = RE_AM_IF.search(line) + if mo: + oldskip.append(skip) + skip = False if mo.group(1) in conds and conds[mo.group(1)] \ + else True + continue + mo = RE_AM_ELSE.search(line) + if mo: + skip = not skip + continue + mo = RE_AM_ENDIF.search(line) + if mo: + skip = oldskip.pop() + continue + if not skip: + mo = RE_AM_INCLUDE.search(line) + if mo: + cur_vars.update(read_vars_from_AM(am_eval(mo.group(1)), cur_vars, conds, None)) + continue + mo = RE_AM_VAR.search(line) + if mo: + cur_vars[mo.group(1)] = am_eval(mo.group(2).strip()) + continue + + #filter: + if filters != None: + ret = {} + for i in filters: + ret[i] = cur_vars.get(i, '') + return ret + else: + return cur_vars + +def main(argv): + srcroot = '..\\..' + subdir = 'json-glib' + gen_jsonglib_filelist(srcroot, subdir, 'json_list') + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/build/win32/introspection-msvc.mak b/build/win32/introspection-msvc.mak new file mode 100644 index 0000000..d637cc7 --- /dev/null +++ b/build/win32/introspection-msvc.mak @@ -0,0 +1,79 @@ +# Common Utility NMake Makefile Template +# Used to Generate Introspection files for various Projects + +# Can Override with env vars as needed +# You will need to have built gobject-introspection for this to work. +# Change or pass in or set the following to suit your environment + +BASEDIR = ..\..\..\vs$(VSVER)\$(PLAT) +GIR_SUBDIR = share\gir-1.0 +GIR_TYPELIBDIR = lib\girepository-1.0 +G_IR_SCANNER = $(BASEDIR)\bin\g-ir-scanner +G_IR_COMPILER = $(BASEDIR)\bin\g-ir-compiler.exe +G_IR_INCLUDEDIR = $(BASEDIR)\$(GIR_SUBDIR) +G_IR_TYPELIBDIR = $(BASEDIR)\$(GIR_TYPELIBDIR) + +# Note: The PYTHON2 must be a Python 2.6.x or 2.7.x Interpretor! +# Either having python.exe from Python 2.6.x/2.7.x in your PATH will work +# or passing in PYTHON2= will do + +# This is required, and gobject-introspection needs to be built +# before this can be successfully run. +PYTHON2=python + +# Don't change anything following this line! +VALID_PKG_CONFIG_PATH = FALSE +VALID_GCC_INSTPATH = FALSE + +MSG_INVALID_PKGCONFIG = You must set or specifiy a valid PKG_CONFIG_PATH +MSG_INVALID_MINGWDIR = You must set or specifiy a valid MINGWDIR, where gcc.exe can be found in %MINGWDIR%\bin +MSG_INVALID_CFG = You need to specify or set CFG to be release or debug to use this Makefile to build the Introspection Files + +ERROR_MSG = + +BUILD_INTROSPECTION = TRUE + +!if ![pkg-config --print-errors --errors-to-stdout $(CHECK_PACKAGE) > pkgconfig.x] \ + && ![setlocal] \ + && ![set file="pkgconfig.x"] \ + && ![FOR %A IN (%file%) DO @echo PKG_CHECK_SIZE=%~zA > pkgconfig.chksize] \ + && ![del $(ERRNUL) /q/f pkgconfig.x] +!endif + +!include pkgconfig.chksize +!if "$(PKG_CHECK_SIZE)" == "0" +VALID_PKG_CONFIG_PATH = TRUE +!else +VALID_PKG_CONFIG_PATH = FALSE +!endif + +!if ![IF EXIST %MINGWDIR%\bin\gcc.exe @echo VALID_GCC_INSTPATH=TRUE > gcccheck.x] +!endif + +!if ![IF NOT EXIST %MINGWDIR%\bin\gcc.exe @echo VALID_GCC_INSTPATH=FALSE > gcccheck.x] +!endif + +!include gcccheck.x + +!if ![del $(ERRNUL) /q/f pkgconfig.chksize gcccheck.x] +!endif + +VALID_CFGSET = FALSE +!if "$(CFG)" == "release" || "$(CFG)" == "debug" +VALID_CFGSET = TRUE +!endif + +!if "$(VALID_GCC_INSTPATH)" != "TRUE" +BUILD_INTROSPECTION = FALSE +ERROR_MSG = $(MSG_INVALID_MINGWDIR) +!endif + +!if "$(VALID_PKG_CONFIG_PATH)" != "TRUE" +BUILD_INTROSPECTION = FALSE +ERROR_MSG = $(MSG_INVALID_PKGCONFIG) +!endif + +!if "$(VALID_CFGSET)" != "TRUE" +BUILD_INTROSPECTION = FALSE +ERROR_MSG = $(MSG_INVALID_CFG) +!endif diff --git a/build/win32/json-glib-introspection-msvc.mak b/build/win32/json-glib-introspection-msvc.mak new file mode 100644 index 0000000..9089e28 --- /dev/null +++ b/build/win32/json-glib-introspection-msvc.mak @@ -0,0 +1,59 @@ +# NMake Makefile to build Introspection Files for JSON-GLib + +!include detectenv_msvc.mak + +APIVERSION = 1.0 + +CHECK_PACKAGE = gio-2.0 + +!include introspection-msvc.mak + +!if "$(BUILD_INTROSPECTION)" == "TRUE" +all: setgirbuildnev Json-$(APIVERSION).gir Json-$(APIVERSION).typelib + +json_list: + @-echo Generating Filelist to Introspect for JSON-GLib... + $(PYTHON2) gen-file-list-jsonglib.py + +vs$(VSVER)\$(CFG)\$(PLAT)\bin\Json-$(APIVERSION).lib: + @-echo Copying Json-1.0.lib from json-glib-1.0.lib + @-copy /b vs$(VSVER)\$(CFG)\$(PLAT)\bin\json-glib-$(APIVERSION).lib vs$(VSVER)\$(CFG)\$(PLAT)\bin\Json-$(APIVERSION).lib + +setgirbuildnev: + @set CC=$(CC) + @set PYTHONPATH=$(BASEDIR)\lib\gobject-introspection + @set PATH=vs$(VSVER)\$(CFG)\$(PLAT)\bin;$(BASEDIR)\bin;$(PATH);$(MINGWDIR)\bin + @set PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) + @set LIB=vs$(VSVER)\$(CFG)\$(PLAT)\bin;$(LIB) + +Json-$(APIVERSION).gir: json_list vs$(VSVER)\$(CFG)\$(PLAT)\bin\Json-$(APIVERSION).lib + @-echo Generating Json-$(APIVERSION).gir... + $(PYTHON2) $(G_IR_SCANNER) --verbose -I..\.. \ + -I$(BASEDIR)\include\glib-2.0 -I$(BASEDIR)\lib\glib-2.0\include \ + --namespace=Json --nsversion=$(APIVERSION) \ + --include=GObject-2.0 --include=Gio-2.0 \ + --no-libtool --library=json-glib-1.0 \ + --reparse-validate --add-include-path=$(BASEDIR)\share\gir-1.0 --add-include-path=. \ + --warn-all --pkg-export json-glib-$(APIVERSION) --c-include "json-glib/json-glib.h" \ + -DJSON_COMPILATION=1 -DG_LOG_DOMAIN=\"Json\" \ + --filelist=json_list -o $@ + +Json-$(APIVERSION).typelib: Json-$(APIVERSION).gir + @-echo Compiling Json-$(APIVERSION).typelib... + $(G_IR_COMPILER) --includedir=. --debug --verbose Json-$(APIVERSION).gir -o Json-$(APIVERSION).typelib + +install-introspection: setgirbuildnev Json-$(APIVERSION).gir Json-$(APIVERSION).typelib + @-copy Json-$(APIVERSION).gir $(G_IR_INCLUDEDIR) + @-copy /b Json-$(APIVERSION).typelib $(G_IR_TYPELIBDIR) + +!else +all: + @-echo $(ERROR_MSG) +!endif + +clean: + @-del /f/q Json-$(APIVERSION).typelib + @-del /f/q Json-$(APIVERSION).gir + @-del /f/q vs$(VSVER)\$(CFG)\$(PLAT)\bin\Json-$(APIVERSION).lib + @-del /f/q json_list + @-del /f/q *.pyc diff --git a/build/win32/vs10/Makefile.am b/build/win32/vs10/Makefile.am new file mode 100644 index 0000000..de03edc --- /dev/null +++ b/build/win32/vs10/Makefile.am @@ -0,0 +1,47 @@ +NULL = + +EXTRA_DIST = \ + json-glib.sln \ + json-glib-version-paths.props \ + json-glib-build-defines.props \ + json-glib-gen-srcs.props \ + json-glib-install.props \ + json-glib.vcxproj \ + json-glib.vcxprojin \ + json-glib.vcxproj.filters \ + json-glib.vcxproj.filtersin \ + json-glib-format.vcxproj \ + json-glib-format.vcxproj.filters \ + json-glib-validate.vcxproj \ + json-glib-validate.vcxproj.filters \ + array.vcxproj \ + array.vcxproj.filters \ + boxed.vcxproj \ + boxed.vcxproj.filters \ + builder.vcxproj \ + builder.vcxproj.filters \ + generator.vcxproj \ + generator.vcxproj.filters \ + gvariant.vcxproj \ + gvariant.vcxproj.filters \ + install.vcxproj \ + node.vcxproj \ + node.vcxproj.filters \ + object.vcxproj \ + object.vcxproj.filters \ + parser.vcxproj \ + parser.vcxproj.filters \ + path.vcxproj \ + path.vcxproj.filters \ + reader.vcxproj \ + reader.vcxproj.filters \ + serialize-complex.vcxproj \ + serialize-complex.vcxproj.filters \ + serialize-full.vcxproj \ + serialize-full.vcxproj.filters \ + serialize-simple.vcxproj \ + serialize-simple.vcxproj.filters \ + README.txt \ + invalid.vcxproj \ + invalid.vcxproj.filters \ + $(NULL) diff --git a/build/win32/vs10/README.txt b/build/win32/vs10/README.txt new file mode 100644 index 0000000..cfedc82 --- /dev/null +++ b/build/win32/vs10/README.txt @@ -0,0 +1,92 @@ +Please refer to the following GNOME Live! page for more detailed +instructions on building JSON-GLib and its dependencies with Visual C++: + +https://live.gnome.org/GTK%2B/Win32/MSVCCompilationOfGTKStack + +This VS10 solution and the projects it includes are intended to be used +in a JSON-GLib source tree unpacked from a tarball. In a git checkout you +first need to use some Unix-like environment or manual work to expand +the .in files needed, mainly config.h.win32.in into config.h.win32. +You will also need to expand json-glib.vcxprojin and json-glib.vcxproj.filtersin +here into json-glib.vcxproj and json-glib.vcxproj.filters repectively. + +The dependencies for this package are gettext-runtime (libintl), GLib*, +ZLib at the minimum. + +For the Dependencies, you may either: + +a) look for all of the dependencies (except GLib*) under + + http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/ (32-bit) -OR- + http://ftp.gnome.org/pub/GNOME/binaries/win64/dependencies/ (64-bit) + + Please use the latest versions of these libraries that are available there, + these are packaged by Tor Lillqvist, which are built with MinGW/GCC. + Please see b) below regarding the build of GLib* + +-OR- + +b) Build them yourself with VS10 (but you may most probably wish to get + gettext-runtime from the URL(s) mentioned in a)). Use the latest + stable versions for them (you may need to get the latest unstable version of + GLib if you are using an unstable version of JSON-GLib): + + GLib*: Grab the latest sources from http://www.gtk.org under "Download" + (stable only-please make a search for the latest unstable versions) + ZLib: http://www.zlib.net + + The above 2 packages all have supported mechanisms (Makefiles and/or Project + Files) for building under VS10 (upgrade the Project Files from earlier VS + versions will do for these, when applicable). It is recommended that ZLib + is built using the win32/Makefile.msc makefile with VS10 with the ASM routines + to avoid linking problems (copy zdll.lib to zlib1.lib[Release] or to zlib1d.lib + [Debug] after completion of compilation)-see win32/Makefile.msc in ZLib for + more details. + +* This GLib refers to a build that is built by VS10 + +Set up the source tree as follows under some arbitrary top +folder : + +\json-glib\ +\vs10\ + +*this* file you are now reading is thus located at +\json-glib\\build\win32\vs10\README. + + is either Win32 or x64, as in the VS10 project files. + +You should unpack the -dev and (runtime) +into \vs10\, if you download any of the packages from + +http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/ (32-bit) -OR- +http://ftp.gnome.org/pub/GNOME/binaries/win64/dependencies/ (64-bit) + +so that for instance libintl.h end up at +\vs10\\include\libintl.h. + +If you build any of the dependencies yourselves, copy the: +-DLLs and EXEs into \vs10\\bin +-headers into \vs10\\include\ +-LIBs into \vs10\\lib + +If you have not built GLib with VS10 and placed the LIBs and headers in a +place where VS10 can find them automatically, you should also uncompress +your GLib sources in \ and build it from there, following the +instructions in \glib<-version>\build\win32\vs10, so that the required +headers, EXEs, DLLs and LIBs will end up in +\vs10\\include\glib-2.0 (headers) +\vs10\\lib (LIBs, also glib-2.0/include/glibconfig.h) +\vs10\\bin (EXEs/DLLs) +respectively. + +After the build of JSON-GLib, the "install" project will copy build results +and headers into their appropriate location under \vs10\. +For instance, built DLLs go into \vs10\\bin, built LIBs into +\vs10\\lib and JSON-GLib headers into +\vs10\\include\json-glib-1.0. This is then from where +project files higher in the stack are supposed to look for them, not +from a specific JSON-GLib source tree. + +--Chun-wei Fan +--(adapted from the GLib VS9 README.txt file originally written by Tor Lillqvist) diff --git a/build/win32/vs10/array.vcxproj b/build/win32/vs10/array.vcxproj new file mode 100644 index 0000000..7ec8e00 --- /dev/null +++ b/build/win32/vs10/array.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9B2921C9-577F-418D-8341-6D79771DDCEC} + array + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/array.vcxproj.filters b/build/win32/vs10/array.vcxproj.filters new file mode 100644 index 0000000..f14dfb1 --- /dev/null +++ b/build/win32/vs10/array.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/boxed.vcxproj b/build/win32/vs10/boxed.vcxproj new file mode 100644 index 0000000..1397634 --- /dev/null +++ b/build/win32/vs10/boxed.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {5016D295-CC2F-4149-80C2-71D7A33791B2} + boxed + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/boxed.vcxproj.filters b/build/win32/vs10/boxed.vcxproj.filters new file mode 100644 index 0000000..30f52f1 --- /dev/null +++ b/build/win32/vs10/boxed.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/builder.vcxproj b/build/win32/vs10/builder.vcxproj new file mode 100644 index 0000000..34e1106 --- /dev/null +++ b/build/win32/vs10/builder.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B7D32B02-3481-4A6E-8E0F-B43887F348A8} + builder + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/builder.vcxproj.filters b/build/win32/vs10/builder.vcxproj.filters new file mode 100644 index 0000000..5a863c1 --- /dev/null +++ b/build/win32/vs10/builder.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/generator.vcxproj b/build/win32/vs10/generator.vcxproj new file mode 100644 index 0000000..ec71341 --- /dev/null +++ b/build/win32/vs10/generator.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D} + generator + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/generator.vcxproj.filters b/build/win32/vs10/generator.vcxproj.filters new file mode 100644 index 0000000..554c572 --- /dev/null +++ b/build/win32/vs10/generator.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/gvariant.vcxproj b/build/win32/vs10/gvariant.vcxproj new file mode 100644 index 0000000..382908c --- /dev/null +++ b/build/win32/vs10/gvariant.vcxproj @@ -0,0 +1,162 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {AA52A332-735D-4177-8CA6-842018E60DED} + gvariant + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + MaxSpeed + true + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/gvariant.vcxproj.filters b/build/win32/vs10/gvariant.vcxproj.filters new file mode 100644 index 0000000..f273c99 --- /dev/null +++ b/build/win32/vs10/gvariant.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/install.vcxproj b/build/win32/vs10/install.vcxproj new file mode 100644 index 0000000..b7875f5 --- /dev/null +++ b/build/win32/vs10/install.vcxproj @@ -0,0 +1,106 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173} + install + Win32Proj + + + + Utility + MultiByte + true + v100 + + + Utility + MultiByte + v100 + + + Utility + MultiByte + true + v100 + + + Utility + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + + $(JsonGlibDoInstall) + + + + + $(JsonGlibDoInstall) + + + + + $(JsonGlibDoInstall) + + + + + $(JsonGlibDoInstall) + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + {ff640d73-9bcd-4b75-b63f-75175a3c9f68} + false + + + {ff640d73-9bcd-4b75-b63f-75175a3c9f69} + false + + + + + + diff --git a/build/win32/vs10/invalid.vcxproj b/build/win32/vs10/invalid.vcxproj new file mode 100644 index 0000000..5107991 --- /dev/null +++ b/build/win32/vs10/invalid.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {04658465-64F9-4F06-B7A7-D40F6EDF26E4} + invalid + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/invalid.vcxproj.filters b/build/win32/vs10/invalid.vcxproj.filters new file mode 100644 index 0000000..322c279 --- /dev/null +++ b/build/win32/vs10/invalid.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/json-glib-build-defines.props b/build/win32/vs10/json-glib-build-defines.props new file mode 100644 index 0000000..fc92a8b --- /dev/null +++ b/build/win32/vs10/json-glib-build-defines.props @@ -0,0 +1,30 @@ + + + + + + + JSON_COMPILATION;G_LOG_DOMAIN="Json";JSON_LOCALEDIR="/dummy" + + + <_PropertySheetDisplayName>jsonglibbuilddefinesprops + $(SolutionDir)$(Configuration)\$(PlatformName)\bin\ + $(SolutionDir)$(Configuration)\$(PlatformName)\obj\$(ProjectName)\ + + + + ..\..\..;..\..\..\json-glib;$(GlibEtcInstallRoot)\include;$(GlibEtcInstallRoot)\include\glib-2.0;$(GlibEtcInstallRoot)\lib\glib-2.0\include;%(AdditionalIncludeDirectories) + HAVE_CONFIG_H;%(PreprocessorDefinitions) + msvc_recommended_pragmas.h;%(ForcedIncludeFiles) + + + glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;%(AdditionalDependencies) + $(GlibEtcInstallRoot)\lib;%(AdditionalLibraryDirectories) + + + + + $(JsonGlibDefines) + + + diff --git a/build/win32/vs10/json-glib-format.vcxproj b/build/win32/vs10/json-glib-format.vcxproj new file mode 100644 index 0000000..8af5074 --- /dev/null +++ b/build/win32/vs10/json-glib-format.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {FF640D73-9BCD-4B75-B63F-75175A3C9F69} + jsonglibformat + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + intl.lib;%(AdditionalDependencies) + Console + MachineX86 + + + + + Disabled + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + intl.lib;%(AdditionalDependencies) + Console + MachineX64 + + + + + MaxSpeed + true + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + intl.lib;%(AdditionalDependencies) + Console + true + true + MachineX86 + + + + + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + intl.lib;%(AdditionalDependencies) + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/json-glib-format.vcxproj.filters b/build/win32/vs10/json-glib-format.vcxproj.filters new file mode 100644 index 0000000..3911577 --- /dev/null +++ b/build/win32/vs10/json-glib-format.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/json-glib-gen-srcs.props b/build/win32/vs10/json-glib-gen-srcs.props new file mode 100644 index 0000000..f5629eb --- /dev/null +++ b/build/win32/vs10/json-glib-gen-srcs.props @@ -0,0 +1,17 @@ + + + + + + + copy ..\config.h.win32 ..\..\..\config.h + + + <_PropertySheetDisplayName>jsonglibgensrcsprops + + + + $(CopyConfigH) + + + diff --git a/build/win32/vs10/json-glib-install.props b/build/win32/vs10/json-glib-install.props new file mode 100644 index 0000000..996b24c --- /dev/null +++ b/build/win32/vs10/json-glib-install.props @@ -0,0 +1,62 @@ + + + + + + + +mkdir $(CopyDir) + +mkdir $(CopyDir)\bin + +mkdir $(CopyDir)\lib + + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\json-glib-$(ApiVersion).lib $(CopyDir)\lib + + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\$(JsonGlibDllPrefix)json-glib$(JsonGlibDllSuffix).dll $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\json-glib-format.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\json-glib-validate.exe $(CopyDir)\bin + + +mkdir $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + + +copy ..\..\..\json-glib\json-enum-types.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-version.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-glib.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + + +copy ..\..\..\json-glib\json-builder.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-generator.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-gvariant.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-gobject.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-path.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-parser.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-reader.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-types.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + +copy ..\..\..\json-glib\json-version-macros.h $(CopyDir)\include\json-glib-$(ApiVersion)\json-glib + + + + <_PropertySheetDisplayName>jsonglibinstallprops + + + + $(JsonGlibDoInstall) + + + diff --git a/build/win32/vs10/json-glib-validate.vcxproj b/build/win32/vs10/json-glib-validate.vcxproj new file mode 100644 index 0000000..f847fc3 --- /dev/null +++ b/build/win32/vs10/json-glib-validate.vcxproj @@ -0,0 +1,166 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {FF640D73-9BCD-4B75-B63F-75175A3C9F68} + jsonglibvalidate + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + intl.lib;%(AdditionalDependencies) + Console + MachineX86 + + + + + Disabled + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + intl.lib;%(AdditionalDependencies) + Console + MachineX64 + + + + + MaxSpeed + true + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + intl.lib;%(AdditionalDependencies) + Console + true + true + MachineX86 + + + + + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + intl.lib;%(AdditionalDependencies) + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/json-glib-validate.vcxproj.filters b/build/win32/vs10/json-glib-validate.vcxproj.filters new file mode 100644 index 0000000..6f9b5c3 --- /dev/null +++ b/build/win32/vs10/json-glib-validate.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/json-glib-version-paths.props b/build/win32/vs10/json-glib-version-paths.props new file mode 100644 index 0000000..0e0eca5 --- /dev/null +++ b/build/win32/vs10/json-glib-version-paths.props @@ -0,0 +1,54 @@ + + + + 10 + $(SolutionDir)\..\..\..\..\vs$(VSVer)\$(Platform) + $(GlibEtcInstallRoot) + $(SolutionDir)$(Configuration)\$(PlatformName)\obj\$(ProjectName)\ + 1.0 + lib + -1.0-0 + + -1-vs$(VSVer) + $(JsonGlibSeparateVSDllPrefix) + $(JsonGlibSeparateVSDllSuffix) + + + <_PropertySheetDisplayName>jsonglibversionpathsprops + + + + $(VSVer) + + + $(GlibEtcInstallRoot) + + + $(CopyDir) + + + $(ApiVersion) + + + $(JsonGlibLibtoolCompatibleDllPrefix) + + + $(JsonGlibLibtoolCompatibleDllSuffix) + + + $(JsonGlibSeparateVSDllPrefix) + + + $(JsonGlibSeparateVSDllSuffix) + + + $(JsonGlibDllPrefix) + + + $(JsonGlibDllSuffix) + + + $(DefDir) + + + diff --git a/build/win32/vs10/json-glib.sln b/build/win32/vs10/json-glib.sln new file mode 100644 index 0000000..b9cf48c --- /dev/null +++ b/build/win32/vs10/json-glib.sln @@ -0,0 +1,196 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib", "json-glib.vcxproj", "{469DB0A8-E33E-4112-A38C-52A168ECDC03}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib-validate", "json-glib-validate.vcxproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F68}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib-format", "json-glib-format.vcxproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F69}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "install", "install.vcxproj", "{41ABBEB6-693A-4E63-9DD7-EAAC437BC173}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "array", "array.vcxproj", "{9B2921C9-577F-418D-8341-6D79771DDCEC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "builder", "builder.vcxproj", "{B7D32B02-3481-4A6E-8E0F-B43887F348A8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generator", "generator.vcxproj", "{E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gvariant", "gvariant.vcxproj", "{AA52A332-735D-4177-8CA6-842018E60DED}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node", "node.vcxproj", "{04658465-64F9-4F06-B7A7-D40F6EDF26E3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "object", "object.vcxproj", "{83A444A0-D80E-40E0-90CF-5876E1AA97DB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "path", "path.vcxproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F67}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parser", "parser.vcxproj", "{BDF81D39-F7E1-4B34-80E5-4B979E10629F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reader", "reader.vcxproj", "{99FC597F-539A-49BB-9B9A-6C1EF802A17B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-complex", "serialize-complex.vcxproj", "{C3FCC23B-54CC-4447-B9A7-CE095EA60B16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-full", "serialize-full.vcxproj", "{980282CA-EAEA-4F33-8982-39DAF018978A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-simple", "serialize-simple.vcxproj", "{27AFA4CD-917A-4155-9F61-025094A97933}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boxed", "boxed.vcxproj", "{5016D295-CC2F-4149-80C2-71D7A33791B2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "invalid", "invalid.vcxproj", "{04658465-64F9-4F06-B7A7-D40F6EDF26E4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|Win32.ActiveCfg = Debug|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|Win32.Build.0 = Debug|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|x64.ActiveCfg = Debug|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|x64.Build.0 = Debug|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|Win32.ActiveCfg = Release|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|Win32.Build.0 = Release|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|x64.ActiveCfg = Release|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|x64.Build.0 = Release|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|Win32.Build.0 = Debug|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|x64.ActiveCfg = Debug|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|x64.Build.0 = Debug|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|Win32.ActiveCfg = Release|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|Win32.Build.0 = Release|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|x64.ActiveCfg = Release|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|x64.Build.0 = Release|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|Win32.Build.0 = Debug|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|x64.ActiveCfg = Debug|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|x64.Build.0 = Debug|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|Win32.ActiveCfg = Release|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|Win32.Build.0 = Release|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|x64.ActiveCfg = Release|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|x64.Build.0 = Release|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|Win32.Build.0 = Debug|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|x64.ActiveCfg = Debug|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|x64.Build.0 = Debug|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|Win32.ActiveCfg = Release|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|Win32.Build.0 = Release|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|x64.ActiveCfg = Release|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|x64.Build.0 = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|Win32.Build.0 = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|x64.ActiveCfg = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|x64.Build.0 = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|Win32.ActiveCfg = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|Win32.Build.0 = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|x64.ActiveCfg = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|x64.Build.0 = Release|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|Win32.ActiveCfg = Debug|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|Win32.Build.0 = Debug|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|x64.ActiveCfg = Debug|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|x64.Build.0 = Debug|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|Win32.ActiveCfg = Release|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|Win32.Build.0 = Release|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|x64.ActiveCfg = Release|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|x64.Build.0 = Release|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|Win32.ActiveCfg = Debug|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|Win32.Build.0 = Debug|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|x64.ActiveCfg = Debug|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|x64.Build.0 = Debug|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|Win32.ActiveCfg = Release|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|Win32.Build.0 = Release|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|x64.ActiveCfg = Release|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|x64.Build.0 = Release|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|Win32.ActiveCfg = Debug|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|Win32.Build.0 = Debug|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|x64.ActiveCfg = Debug|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|x64.Build.0 = Debug|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|Win32.ActiveCfg = Release|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|Win32.Build.0 = Release|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|x64.ActiveCfg = Release|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|x64.Build.0 = Release|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|Win32.ActiveCfg = Debug|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|Win32.Build.0 = Debug|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|x64.ActiveCfg = Debug|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|x64.Build.0 = Debug|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|Win32.ActiveCfg = Release|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|Win32.Build.0 = Release|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|x64.ActiveCfg = Release|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|x64.Build.0 = Release|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|Win32.ActiveCfg = Debug|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|Win32.Build.0 = Debug|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|x64.ActiveCfg = Debug|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|x64.Build.0 = Debug|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|Win32.ActiveCfg = Release|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|Win32.Build.0 = Release|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|x64.ActiveCfg = Release|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|x64.Build.0 = Release|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|Win32.ActiveCfg = Debug|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|Win32.Build.0 = Debug|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|x64.ActiveCfg = Debug|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|x64.Build.0 = Debug|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|Win32.ActiveCfg = Release|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|Win32.Build.0 = Release|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|x64.ActiveCfg = Release|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|x64.Build.0 = Release|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|Win32.ActiveCfg = Debug|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|Win32.Build.0 = Debug|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|x64.ActiveCfg = Debug|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|x64.Build.0 = Debug|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|Win32.ActiveCfg = Release|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|Win32.Build.0 = Release|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|x64.ActiveCfg = Release|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|x64.Build.0 = Release|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|Win32.Build.0 = Debug|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|x64.ActiveCfg = Debug|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|x64.Build.0 = Debug|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|Win32.ActiveCfg = Release|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|Win32.Build.0 = Release|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|x64.ActiveCfg = Release|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|x64.Build.0 = Release|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|Win32.ActiveCfg = Debug|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|Win32.Build.0 = Debug|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|x64.ActiveCfg = Debug|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|x64.Build.0 = Debug|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|Win32.ActiveCfg = Release|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|Win32.Build.0 = Release|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|x64.ActiveCfg = Release|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|x64.Build.0 = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|Win32.Build.0 = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|x64.ActiveCfg = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|x64.Build.0 = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|Win32.ActiveCfg = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|Win32.Build.0 = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|x64.ActiveCfg = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs10/json-glib.vcxproj.filtersin b/build/win32/vs10/json-glib.vcxproj.filtersin new file mode 100644 index 0000000..30ea641 --- /dev/null +++ b/build/win32/vs10/json-glib.vcxproj.filtersin @@ -0,0 +1,23 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + +#include "jsonglib.vs10.sourcefiles.filters" + + + Resource Files + + diff --git a/build/win32/vs10/json-glib.vcxprojin b/build/win32/vs10/json-glib.vcxprojin new file mode 100644 index 0000000..b41c6c4 --- /dev/null +++ b/build/win32/vs10/json-glib.vcxprojin @@ -0,0 +1,191 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {469DB0A8-E33E-4112-A38C-52A168ECDC03} + jsonglib + Win32Proj + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + true + + + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + $(OutDir)$(JsonGlibDllPrefix)$(ProjectName)$(JsonGlibDllSuffix).dll + true + Windows + $(TargetDir)$(ProjectName)-$(ApiVersion).lib + MachineX86 + + + + + + + Disabled + _DEBUG;$(JsonGlibDefines);%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)$(JsonGlibDllPrefix)$(ProjectName)$(JsonGlibDllSuffix).dll + true + Windows + $(TargetDir)$(ProjectName)-$(ApiVersion).lib + MachineX64 + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + $(OutDir)$(JsonGlibDllPrefix)$(ProjectName)$(JsonGlibDllSuffix).dll + true + Windows + true + true + $(TargetDir)$(ProjectName)-$(ApiVersion).lib + MachineX86 + + + + + + + $(JsonGlibDefines);%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)$(JsonGlibDllPrefix)$(ProjectName)$(JsonGlibDllSuffix).dll + true + Windows + true + true + $(TargetDir)$(ProjectName)-$(ApiVersion).lib + MachineX64 + + + +#include "jsonglib.vs10.sourcefiles" + + + + Copying config.h from config.h.win32... + $(CopyConfigH) + ..\..\..\config.h;%(Outputs) + Copying config.h from config.h.win32... + $(CopyConfigH) + ..\..\..\config.h;%(Outputs) + Copying config.h from config.h.win32... + $(CopyConfigH) + ..\..\..\config.h;%(Outputs) + Copying config.h from config.h.win32... + $(CopyConfigH) + ..\..\..\config.h;%(Outputs) + + + + + + diff --git a/build/win32/vs10/node.vcxproj b/build/win32/vs10/node.vcxproj new file mode 100644 index 0000000..9c34843 --- /dev/null +++ b/build/win32/vs10/node.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {04658465-64F9-4F06-B7A7-D40F6EDF26E3} + node + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/node.vcxproj.filters b/build/win32/vs10/node.vcxproj.filters new file mode 100644 index 0000000..32c66c2 --- /dev/null +++ b/build/win32/vs10/node.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/object.vcxproj b/build/win32/vs10/object.vcxproj new file mode 100644 index 0000000..03682f3 --- /dev/null +++ b/build/win32/vs10/object.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {83A444A0-D80E-40E0-90CF-5876E1AA97DB} + object + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/object.vcxproj.filters b/build/win32/vs10/object.vcxproj.filters new file mode 100644 index 0000000..d6e9a5b --- /dev/null +++ b/build/win32/vs10/object.vcxproj.filters @@ -0,0 +1,13 @@ + + + + + {48deb3fb-fef6-49a6-82dc-c39cb01b4098} + + + + + Sources + + + diff --git a/build/win32/vs10/parser.vcxproj b/build/win32/vs10/parser.vcxproj new file mode 100644 index 0000000..3d99594 --- /dev/null +++ b/build/win32/vs10/parser.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BDF81D39-F7E1-4B34-80E5-4B979E10629F} + parser + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/parser.vcxproj.filters b/build/win32/vs10/parser.vcxproj.filters new file mode 100644 index 0000000..c164d40 --- /dev/null +++ b/build/win32/vs10/parser.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/path.vcxproj b/build/win32/vs10/path.vcxproj new file mode 100644 index 0000000..04e8139 --- /dev/null +++ b/build/win32/vs10/path.vcxproj @@ -0,0 +1,162 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {FF640D73-9BCD-4B75-B63F-75175A3C9F67} + path + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + MaxSpeed + true + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/path.vcxproj.filters b/build/win32/vs10/path.vcxproj.filters new file mode 100644 index 0000000..80ca3d1 --- /dev/null +++ b/build/win32/vs10/path.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/reader.vcxproj b/build/win32/vs10/reader.vcxproj new file mode 100644 index 0000000..61b5418 --- /dev/null +++ b/build/win32/vs10/reader.vcxproj @@ -0,0 +1,172 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {99FC597F-539A-49BB-9B9A-6C1EF802A17B} + reader + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/reader.vcxproj.filters b/build/win32/vs10/reader.vcxproj.filters new file mode 100644 index 0000000..1049043 --- /dev/null +++ b/build/win32/vs10/reader.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/serialize-complex.vcxproj b/build/win32/vs10/serialize-complex.vcxproj new file mode 100644 index 0000000..428ed79 --- /dev/null +++ b/build/win32/vs10/serialize-complex.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16} + serializecomplex + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/serialize-complex.vcxproj.filters b/build/win32/vs10/serialize-complex.vcxproj.filters new file mode 100644 index 0000000..5a2d8b5 --- /dev/null +++ b/build/win32/vs10/serialize-complex.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/serialize-full.vcxproj b/build/win32/vs10/serialize-full.vcxproj new file mode 100644 index 0000000..7e7e94d --- /dev/null +++ b/build/win32/vs10/serialize-full.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {980282CA-EAEA-4F33-8982-39DAF018978A} + serializefull + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/serialize-full.vcxproj.filters b/build/win32/vs10/serialize-full.vcxproj.filters new file mode 100644 index 0000000..b7c69b9 --- /dev/null +++ b/build/win32/vs10/serialize-full.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs10/serialize-simple.vcxproj b/build/win32/vs10/serialize-simple.vcxproj new file mode 100644 index 0000000..596d57f --- /dev/null +++ b/build/win32/vs10/serialize-simple.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {27AFA4CD-917A-4155-9F61-025094A97933} + serializesimple + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + %(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + %(ForcedIncludeFiles) + + + true + Console + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + MachineX64 + + + + + + + + + MaxSpeed + true + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + %(ForcedIncludeFiles) + + + true + Console + true + true + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + MachineX64 + + + + + + + + {469db0a8-e33e-4112-a38c-52a168ecdc03} + false + + + + + + diff --git a/build/win32/vs10/serialize-simple.vcxproj.filters b/build/win32/vs10/serialize-simple.vcxproj.filters new file mode 100644 index 0000000..3fc20bd --- /dev/null +++ b/build/win32/vs10/serialize-simple.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Sources + + + diff --git a/build/win32/vs9/Makefile.am b/build/win32/vs9/Makefile.am new file mode 100644 index 0000000..8e24fc0 --- /dev/null +++ b/build/win32/vs9/Makefile.am @@ -0,0 +1,29 @@ +NULL = + +EXTRA_DIST = \ + json-glib.sln \ + json-glib-version-paths.vsprops \ + json-glib-build-defines.vsprops \ + json-glib-gen-srcs.vsprops \ + json-glib-install.vsprops \ + json-glib.vcproj \ + json-glib.vcprojin \ + json-glib-validate.vcproj \ + json-glib-format.vcproj \ + install.vcproj \ + README.txt \ + array.vcproj \ + boxed.vcproj \ + builder.vcproj \ + generator.vcproj \ + gvariant.vcproj \ + invalid.vcproj \ + node.vcproj \ + object.vcproj \ + parser.vcproj \ + path.vcproj \ + reader.vcproj \ + serialize-complex.vcproj \ + serialize-full.vcproj \ + serialize-simple.vcproj \ + $(NULL) diff --git a/build/win32/vs9/README.txt b/build/win32/vs9/README.txt new file mode 100644 index 0000000..734e7df --- /dev/null +++ b/build/win32/vs9/README.txt @@ -0,0 +1,91 @@ +Please refer to the following GNOME Live! page for more detailed +instructions on building JSON-GLib and its dependencies with Visual C++: + +https://live.gnome.org/GTK%2B/Win32/MSVCCompilationOfGTKStack + +This VS9 solution and the projects it includes are intended to be used +in a JSON-GLib source tree unpacked from a tarball. In a git checkout you +first need to use some Unix-like environment or manual work to expand +the .in files needed, mainly config.h.win32.in into config.h.win32. +You will also need to expand json-glib.vcprojin here into json-glib.vcproj. + +The dependencies for this package are gettext-runtime (libintl), GLib*, +ZLib at the minimum. + +For the Dependencies, you may either: + +a) look for all of the dependencies (except GLib*) under + + http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/ (32-bit) -OR- + http://ftp.gnome.org/pub/GNOME/binaries/win64/dependencies/ (64-bit) + + Please use the latest versions of these libraries that are available there, + these are packaged by Tor Lillqvist, which are built with MinGW/GCC. + Please see b) below regarding the build of GLib* + +-OR- + +b) Build them yourself with VS9 (but you may most probably wish to get + gettext-runtime from the URL(s) mentioned in a)). Use the latest + stable versions for them (you may need to get the latest unstable version of + GLib if you are using an unstable version of JSON-GLib): + + GLib*: Grab the latest sources from http://www.gtk.org under "Download" + (stable only-please make a search for the latest unstable versions) + ZLib: http://www.zlib.net + + The above 2 packages all have supported mechanisms (Makefiles and/or Project + Files) for building under VS9 (upgrade the Project Files from earlier VS + versions will do for these, when applicable). It is recommended that ZLib + is built using the win32/Makefile.msc makefile with VS9 with the ASM routines + to avoid linking problems (copy zdll.lib to zlib1.lib[Release] or to zlib1d.lib + [Debug] after completion of compilation)-see win32/Makefile.msc in ZLib for + more details. + +* This GLib refers to a build that is built by VS9 + +Set up the source tree as follows under some arbitrary top +folder : + +\json-glib\ +\vs9\ + +*this* file you are now reading is thus located at +\json-glib\\build\win32\vs9\README. + + is either Win32 or x64, as in the VS9 project files. + +You should unpack the -dev and (runtime) +into \vs9\, if you download any of the packages from + +http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/ (32-bit) -OR- +http://ftp.gnome.org/pub/GNOME/binaries/win64/dependencies/ (64-bit) + +so that for instance libintl.h end up at +\vs9\\include\libintl.h. + +If you build any of the dependencies yourselves, copy the: +-DLLs and EXEs into \vs9\\bin +-headers into \vs9\\include\ +-LIBs into \vs9\\lib + +If you have not built GLib with VS9 and placed the LIBs and headers in a +place where VS9 can find them automatically, you should also uncompress +your GLib sources in \ and build it from there, following the +instructions in \glib<-version>\build\win32\vs9, so that the required +headers, EXEs, DLLs and LIBs will end up in +\vs9\\include\glib-2.0 (headers) +\vs9\\lib (LIBs, also glib-2.0/include/glibconfig.h) +\vs9\\bin (EXEs/DLLs) +respectively. + +After the build of JSON-GLib, the "install" project will copy build results +and headers into their appropriate location under \vs9\. +For instance, built DLLs go into \vs9\\bin, built LIBs into +\vs9\\lib and JSON-GLib headers into +\vs9\\include\json-glib-1.0. This is then from where +project files higher in the stack are supposed to look for them, not +from a specific JSON-GLib source tree. + +--Chun-wei Fan +--(adapted from the GLib VS9 README.txt file originally written by Tor Lillqvist) diff --git a/build/win32/vs9/array.vcproj b/build/win32/vs9/array.vcproj new file mode 100644 index 0000000..77c6f03 --- /dev/null +++ b/build/win32/vs9/array.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/boxed.vcproj b/build/win32/vs9/boxed.vcproj new file mode 100644 index 0000000..61f3891 --- /dev/null +++ b/build/win32/vs9/boxed.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/builder.vcproj b/build/win32/vs9/builder.vcproj new file mode 100644 index 0000000..cc00f7a --- /dev/null +++ b/build/win32/vs9/builder.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/generator.vcproj b/build/win32/vs9/generator.vcproj new file mode 100644 index 0000000..bd369bc --- /dev/null +++ b/build/win32/vs9/generator.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gvariant.vcproj b/build/win32/vs9/gvariant.vcproj new file mode 100644 index 0000000..4164a65 --- /dev/null +++ b/build/win32/vs9/gvariant.vcproj @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/install.vcproj b/build/win32/vs9/install.vcproj new file mode 100644 index 0000000..7edd513 --- /dev/null +++ b/build/win32/vs9/install.vcproj @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/invalid.vcproj b/build/win32/vs9/invalid.vcproj new file mode 100644 index 0000000..7065cbe --- /dev/null +++ b/build/win32/vs9/invalid.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/json-glib-build-defines.vsprops b/build/win32/vs9/json-glib-build-defines.vsprops new file mode 100644 index 0000000..3d2dbc0 --- /dev/null +++ b/build/win32/vs9/json-glib-build-defines.vsprops @@ -0,0 +1,25 @@ + + + + + + diff --git a/build/win32/vs9/json-glib-format.vcproj b/build/win32/vs9/json-glib-format.vcproj new file mode 100644 index 0000000..c2640ba --- /dev/null +++ b/build/win32/vs9/json-glib-format.vcproj @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/json-glib-gen-srcs.vsprops b/build/win32/vs9/json-glib-gen-srcs.vsprops new file mode 100644 index 0000000..aa4fee6 --- /dev/null +++ b/build/win32/vs9/json-glib-gen-srcs.vsprops @@ -0,0 +1,12 @@ + + + + diff --git a/build/win32/vs9/json-glib-install.vsprops b/build/win32/vs9/json-glib-install.vsprops new file mode 100644 index 0000000..eef10c1 --- /dev/null +++ b/build/win32/vs9/json-glib-install.vsprops @@ -0,0 +1,38 @@ + + + + diff --git a/build/win32/vs9/json-glib-validate.vcproj b/build/win32/vs9/json-glib-validate.vcproj new file mode 100644 index 0000000..1550deb --- /dev/null +++ b/build/win32/vs9/json-glib-validate.vcproj @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/json-glib-version-paths.vsprops b/build/win32/vs9/json-glib-version-paths.vsprops new file mode 100644 index 0000000..cade5f9 --- /dev/null +++ b/build/win32/vs9/json-glib-version-paths.vsprops @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/json-glib.sln b/build/win32/vs9/json-glib.sln new file mode 100644 index 0000000..b12848f --- /dev/null +++ b/build/win32/vs9/json-glib.sln @@ -0,0 +1,249 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib", "json-glib.vcproj", "{469DB0A8-E33E-4112-A38C-52A168ECDC03}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib-validate", "json-glib-validate.vcproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F68}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-glib-format", "json-glib-format.vcproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F69}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "array", "array.vcproj", "{9B2921C9-577F-418D-8341-6D79771DDCEC}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "builder", "builder.vcproj", "{B7D32B02-3481-4A6E-8E0F-B43887F348A8}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generator", "generator.vcproj", "{E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node", "node.vcproj", "{04658465-64F9-4F06-B7A7-D40F6EDF26E3}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "object", "object.vcproj", "{83A444A0-D80E-40E0-90CF-5876E1AA97DB}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "parser", "parser.vcproj", "{BDF81D39-F7E1-4B34-80E5-4B979E10629F}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reader", "reader.vcproj", "{99FC597F-539A-49BB-9B9A-6C1EF802A17B}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-complex", "serialize-complex.vcproj", "{C3FCC23B-54CC-4447-B9A7-CE095EA60B16}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-full", "serialize-full.vcproj", "{980282CA-EAEA-4F33-8982-39DAF018978A}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serialize-simple", "serialize-simple.vcproj", "{27AFA4CD-917A-4155-9F61-025094A97933}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boxed", "boxed.vcproj", "{5016D295-CC2F-4149-80C2-71D7A33791B2}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gvariant", "gvariant.vcproj", "{AA52A332-735D-4177-8CA6-842018E60DED}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "path", "path.vcproj", "{FF640D73-9BCD-4B75-B63F-75175A3C9F67}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "invalid", "invalid.vcproj", "{04658465-64F9-4F06-B7A7-D40F6EDF26E4}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "install", "install.vcproj", "{41ABBEB6-693A-4E63-9DD7-EAAC437BC173}" + ProjectSection(ProjectDependencies) = postProject + {469DB0A8-E33E-4112-A38C-52A168ECDC03} = {469DB0A8-E33E-4112-A38C-52A168ECDC03} + {FF640D73-9BCD-4B75-B63F-75175A3C9F68} = {FF640D73-9BCD-4B75-B63F-75175A3C9F68} + {FF640D73-9BCD-4B75-B63F-75175A3C9F69} = {FF640D73-9BCD-4B75-B63F-75175A3C9F69} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|Win32.ActiveCfg = Debug|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|Win32.Build.0 = Debug|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|x64.ActiveCfg = Debug|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Debug|x64.Build.0 = Debug|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|Win32.ActiveCfg = Release|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|Win32.Build.0 = Release|Win32 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|x64.ActiveCfg = Release|x64 + {469DB0A8-E33E-4112-A38C-52A168ECDC03}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F68}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F69}.Release|x64.Build.0 = Release|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|Win32.Build.0 = Debug|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|x64.ActiveCfg = Debug|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Debug|x64.Build.0 = Debug|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|Win32.ActiveCfg = Release|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|Win32.Build.0 = Release|Win32 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|x64.ActiveCfg = Release|x64 + {9B2921C9-577F-418D-8341-6D79771DDCEC}.Release|x64.Build.0 = Release|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|Win32.Build.0 = Debug|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|x64.ActiveCfg = Debug|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Debug|x64.Build.0 = Debug|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|Win32.ActiveCfg = Release|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|Win32.Build.0 = Release|Win32 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|x64.ActiveCfg = Release|x64 + {B7D32B02-3481-4A6E-8E0F-B43887F348A8}.Release|x64.Build.0 = Release|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|Win32.Build.0 = Debug|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|x64.ActiveCfg = Debug|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Debug|x64.Build.0 = Debug|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|Win32.ActiveCfg = Release|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|Win32.Build.0 = Release|Win32 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|x64.ActiveCfg = Release|x64 + {E84F9D53-C9F7-4D7D-B8D0-AFE8BE3E7B7D}.Release|x64.Build.0 = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|Win32.Build.0 = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|x64.ActiveCfg = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Debug|x64.Build.0 = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|Win32.ActiveCfg = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|Win32.Build.0 = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|x64.ActiveCfg = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E3}.Release|x64.Build.0 = Release|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|Win32.ActiveCfg = Debug|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|Win32.Build.0 = Debug|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|x64.ActiveCfg = Debug|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Debug|x64.Build.0 = Debug|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|Win32.ActiveCfg = Release|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|Win32.Build.0 = Release|Win32 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|x64.ActiveCfg = Release|x64 + {83A444A0-D80E-40E0-90CF-5876E1AA97DB}.Release|x64.Build.0 = Release|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|Win32.ActiveCfg = Debug|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|Win32.Build.0 = Debug|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|x64.ActiveCfg = Debug|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Debug|x64.Build.0 = Debug|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|Win32.ActiveCfg = Release|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|Win32.Build.0 = Release|Win32 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|x64.ActiveCfg = Release|x64 + {BDF81D39-F7E1-4B34-80E5-4B979E10629F}.Release|x64.Build.0 = Release|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|Win32.ActiveCfg = Debug|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|Win32.Build.0 = Debug|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|x64.ActiveCfg = Debug|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Debug|x64.Build.0 = Debug|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|Win32.ActiveCfg = Release|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|Win32.Build.0 = Release|Win32 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|x64.ActiveCfg = Release|x64 + {99FC597F-539A-49BB-9B9A-6C1EF802A17B}.Release|x64.Build.0 = Release|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|Win32.ActiveCfg = Debug|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|Win32.Build.0 = Debug|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|x64.ActiveCfg = Debug|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Debug|x64.Build.0 = Debug|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|Win32.ActiveCfg = Release|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|Win32.Build.0 = Release|Win32 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|x64.ActiveCfg = Release|x64 + {C3FCC23B-54CC-4447-B9A7-CE095EA60B16}.Release|x64.Build.0 = Release|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|Win32.ActiveCfg = Debug|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|Win32.Build.0 = Debug|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|x64.ActiveCfg = Debug|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Debug|x64.Build.0 = Debug|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|Win32.ActiveCfg = Release|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|Win32.Build.0 = Release|Win32 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|x64.ActiveCfg = Release|x64 + {980282CA-EAEA-4F33-8982-39DAF018978A}.Release|x64.Build.0 = Release|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|Win32.ActiveCfg = Debug|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|Win32.Build.0 = Debug|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|x64.ActiveCfg = Debug|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Debug|x64.Build.0 = Debug|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|Win32.ActiveCfg = Release|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|Win32.Build.0 = Release|Win32 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|x64.ActiveCfg = Release|x64 + {27AFA4CD-917A-4155-9F61-025094A97933}.Release|x64.Build.0 = Release|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|Win32.ActiveCfg = Debug|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|Win32.Build.0 = Debug|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|x64.ActiveCfg = Debug|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Debug|x64.Build.0 = Debug|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|Win32.ActiveCfg = Release|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|Win32.Build.0 = Release|Win32 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|x64.ActiveCfg = Release|x64 + {5016D295-CC2F-4149-80C2-71D7A33791B2}.Release|x64.Build.0 = Release|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|Win32.Build.0 = Debug|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|x64.ActiveCfg = Debug|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Debug|x64.Build.0 = Debug|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|Win32.ActiveCfg = Release|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|Win32.Build.0 = Release|Win32 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|x64.ActiveCfg = Release|x64 + {AA52A332-735D-4177-8CA6-842018E60DED}.Release|x64.Build.0 = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|Win32.Build.0 = Debug|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|x64.ActiveCfg = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Debug|x64.Build.0 = Debug|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|Win32.ActiveCfg = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|Win32.Build.0 = Release|Win32 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|x64.ActiveCfg = Release|x64 + {FF640D73-9BCD-4B75-B63F-75175A3C9F67}.Release|x64.Build.0 = Release|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|Win32.ActiveCfg = Debug|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|Win32.Build.0 = Debug|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|x64.ActiveCfg = Debug|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Debug|x64.Build.0 = Debug|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|Win32.ActiveCfg = Release|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|Win32.Build.0 = Release|Win32 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|x64.ActiveCfg = Release|x64 + {41ABBEB6-693A-4E63-9DD7-EAAC437BC173}.Release|x64.Build.0 = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|Win32.Build.0 = Debug|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|x64.ActiveCfg = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Debug|x64.Build.0 = Debug|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|Win32.ActiveCfg = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|Win32.Build.0 = Release|Win32 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|x64.ActiveCfg = Release|x64 + {04658465-64F9-4F06-B7A7-D40F6EDF26E4}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs9/json-glib.vcprojin b/build/win32/vs9/json-glib.vcprojin new file mode 100644 index 0000000..4f13c72 --- /dev/null +++ b/build/win32/vs9/json-glib.vcprojin @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "jsonglib.sourcefiles" + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/node.vcproj b/build/win32/vs9/node.vcproj new file mode 100644 index 0000000..2e9b538 --- /dev/null +++ b/build/win32/vs9/node.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/object.vcproj b/build/win32/vs9/object.vcproj new file mode 100644 index 0000000..7115902 --- /dev/null +++ b/build/win32/vs9/object.vcproj @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/parser.vcproj b/build/win32/vs9/parser.vcproj new file mode 100644 index 0000000..067b29c --- /dev/null +++ b/build/win32/vs9/parser.vcproj @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/path.vcproj b/build/win32/vs9/path.vcproj new file mode 100644 index 0000000..36e45b0 --- /dev/null +++ b/build/win32/vs9/path.vcproj @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/reader.vcproj b/build/win32/vs9/reader.vcproj new file mode 100644 index 0000000..5af2133 --- /dev/null +++ b/build/win32/vs9/reader.vcproj @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/serialize-complex.vcproj b/build/win32/vs9/serialize-complex.vcproj new file mode 100644 index 0000000..76c60d6 --- /dev/null +++ b/build/win32/vs9/serialize-complex.vcproj @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/serialize-full.vcproj b/build/win32/vs9/serialize-full.vcproj new file mode 100644 index 0000000..4f29fda --- /dev/null +++ b/build/win32/vs9/serialize-full.vcproj @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/serialize-simple.vcproj b/build/win32/vs9/serialize-simple.vcproj new file mode 100644 index 0000000..0098c8e --- /dev/null +++ b/build/win32/vs9/serialize-simple.vcproj @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compile b/compile deleted file mode 100755 index c0096a7..0000000 --- a/compile +++ /dev/null @@ -1,143 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand `-c -o'. - -scriptversion=2009-10-06.20; # UTC - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software -# Foundation, Inc. -# Written by Tom Tromey . -# -# 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 2, 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 . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; -esac - -ofile= -cfile= -eat= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` - -# Create the lock directory. -# Note: use `[/\\:.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - test "$cofile" = "$ofile" || mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/config.h.in b/config.h.in deleted file mode 100644 index 20ffed8..0000000 --- a/config.h.in +++ /dev/null @@ -1,84 +0,0 @@ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the `getpagesize' function. */ -#undef HAVE_GETPAGESIZE - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if your system has a GNU libc compatible `malloc' function, and - to 0 otherwise. */ -#undef HAVE_MALLOC - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Version number of package */ -#undef VERSION - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to rpl_malloc if the replacement function should be used. */ -#undef malloc diff --git a/configure.ac b/configure.ac index 6e43f28..9be283f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,8 @@ # bump micro_version to the next even number for each point release # bump micro_version to the next odd number after each release -m4_define([json_major_version], [0]) -m4_define([json_minor_version], [10]) -m4_define([json_micro_version], [4]) +m4_define([json_major_version], [1]) +m4_define([json_minor_version], [0]) +m4_define([json_micro_version], [2]) m4_define([json_version], [json_major_version.json_minor_version.json_micro_version]) @@ -13,36 +13,42 @@ m4_define([json_release_status], # bump up by 1 for every micro release with no API changes, otherwise # set to 0. after release, bump up by 1 -m4_define([json_interface_age], [3]) +m4_define([json_interface_age], [2]) m4_define([json_binary_age], [m4_eval(100 * json_minor_version + json_micro_version)]) m4_define([lt_current], [m4_eval(100 * json_minor_version + json_micro_version - json_interface_age)]) m4_define([lt_revision], [json_interface_age]) m4_define([lt_age], [m4_eval(json_binary_age - json_interface_age)]) -m4_define([glib_req_version], [2.15]) +m4_define([glib_req_version], [2.37.6]) -AC_PREREQ([2.61]) +AC_PREREQ([2.63]) AC_INIT([json-glib], [json_version], [http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib], - [json-glib]) + [json-glib], + [http://live.gnome.org/JsonGlib]) +AC_CONFIG_HEADER([config.h]) AC_CONFIG_SRCDIR([json-glib/json-glib.h]) +AC_CONFIG_AUX_DIR([build]) AC_CONFIG_MACRO_DIR([build/autotools]) -AM_INIT_AUTOMAKE([1.9]) -AM_CONFIG_HEADER([config.h]) +AM_INIT_AUTOMAKE([1.11 no-define foreign -Wno-portability dist-xz no-dist-gzip tar-ustar]) -AM_DISABLE_STATIC +AM_SILENT_RULES([yes]) AM_PATH_GLIB_2_0 AM_PROG_CC_C_O -AM_PROG_LIBTOOL + +LT_PREREQ([2.2.6]) +LT_INIT([disable-static]) # Honor aclocal flags ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS" +dnl === Versioning ============================================================ + JSON_MAJOR_VERSION=json_major_version JSON_MINOR_VERSION=json_minor_version JSON_MICRO_VERSION=json_micro_version @@ -59,30 +65,105 @@ JSON_LT_REVISION=lt_revision JSON_LT_AGE=lt_age JSON_LT_VERSION="$JSON_LT_CURRENT:$JSON_LT_REVISION:$JSON_LT_AGE" JSON_LT_LDFLAGS="-version-info $JSON_LT_VERSION" + +dnl === Platform checks ======================================================= + +platform_linux=no +platform_win32=no + +AC_CANONICAL_HOST +AC_MSG_CHECKING([if building for some Win32 platform]) +AS_CASE([$host], + + [*-*-mingw*|*-*-cygwin*], + [ + JSON_LT_LDFLAGS="$JSON_LT_LDFLAGS -no-undefined" + platform_win32=yes + ], + + [*-*-linux*], + [ + platform_linux=yes + ], + + [] +) +AC_MSG_RESULT([$platform_win32]) + +AM_CONDITIONAL(OS_LINUX, [test "$platform_linux" = "yes"]) +AM_CONDITIONAL(OS_WIN32, [test "$platform_win32" = "yes"]) + +# Check for -Bsymbolic-functions to avoid intra-library PLT jumps +AC_ARG_ENABLE([Bsymbolic], + [AS_HELP_STRING([--disable-Bsymbolic], + [Avoid linking with -Bsymbolic])], + [], + [ + saved_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([for -Bsymbolic-functions linker flag]) + LDFLAGS=-Wl,-Bsymbolic-functions + AC_TRY_LINK([], [int main (void) { return 0; }], + [ + AC_MSG_RESULT([yes]) + enable_Bsymbolic=yes + ], + [ + AC_MSG_RESULT([no]) + enable_Bsymbolic=no + ]) + LDFLAGS="${saved_LDFLAGS}" + ]) + +AS_IF([test "x$enable_Bsymbolic" = "xyes"], [JSON_LINK_FLAGS=-Wl[,]-Bsymbolic-functions]) +JSON_LT_LDFLAGS="$JSON_LT_LDFLAGS $JSON_LINK_FLAGS" + AC_SUBST(JSON_LT_LDFLAGS) -AC_HEADER_STDC -AC_CHECK_HEADERS([unistd.h]) -AC_C_CONST -AC_FUNC_MALLOC -AC_FUNC_MMAP +dnl === Visibility ============================================================ + +JSON_HIDDEN_VISIBILITY_CFLAGS="" +case "$host" in + *-*-mingw*) + dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport) + AC_DEFINE([_JSON_EXTERN], [__attribute__((visibility("default"))) __declspec(dllexport) extern], + [defines how to decorate public symbols while building]) + CFLAGS="${CFLAGS} -fvisibility=hidden" + ;; + *) + dnl on other compilers, check if we can do -fvisibility=hidden + SAVED_CFLAGS="${CFLAGS}" + CFLAGS="-fvisibility=hidden" + AC_MSG_CHECKING([for -fvisibility=hidden compiler flag]) + AC_TRY_COMPILE([], [int main (void) { return 0; }], + AC_MSG_RESULT(yes) + enable_fvisibility_hidden=yes, + AC_MSG_RESULT(no) + enable_fvisibility_hidden=no) + CFLAGS="${SAVED_CFLAGS}" + + AS_IF([test "${enable_fvisibility_hidden}" = "yes"], [ + AC_DEFINE([_JSON_EXTERN], [__attribute__((visibility("default"))) extern], + [defines how to decorate public symbols while building]) + JSON_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden" + ]) + ;; +esac +AC_SUBST(JSON_HIDDEN_VISIBILITY_CFLAGS) + +dnl === Dependencies ========================================================== GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" AC_SUBST(GLIB_PREFIX) -PKG_CHECK_MODULES(JSON, [gobject-2.0 >= glib_req_version]) -AC_SUBST(JSON_CFLAGS) -AC_SUBST(JSON_LIBS) - -AM_CONDITIONAL(ENABLE_GLIB_TEST, [test "x$enable_glibtest" = "xyes"]) +PKG_CHECK_MODULES(JSON, [gobject-2.0 >= glib_req_version gio-2.0]) -dnl = Enable debug level =================================================== +dnl === Enable debug level ==================================================== m4_define([debug_default], [m4_if(m4_eval(json_minor_version % 2), [1], [yes], [minimum])]) AC_ARG_ENABLE([debug], - [AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@], - [turn on debugging @<:@default=debug_default@:>@])], + [AS_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@], + [turn on debugging @<:@default=]debug_default[@:>@])], [], [enable_debug=debug_default]) @@ -109,60 +190,198 @@ AS_CASE([$enable_debug], AC_SUBST(JSON_DEBUG_CFLAGS) -dnl = Enable strict compiler flags ========================================= +dnl === Enable strict compiler flags ========================================== # use strict compiler flags only on development releases m4_define([maintainer_flags_default], [m4_if(m4_eval(json_minor_version % 2), [1], [yes], [no])]) AC_ARG_ENABLE([maintainer-flags], - [AC_HELP_STRING([--enable-maintainer-flags=@<:@no/yes@:>@], - [Use strict compiler flags @<:@default=maintainer_flags_default@:>@])], + [AS_HELP_STRING([--enable-maintainer-flags=@<:@no/yes@:>@], + [Use strict compiler flags @<:@default=]maintainer_flags_default[@:>@])], [], [enable_maintainer_flags=maintainer_flags_default]) AS_IF([test "x$enable_maintainer_flags" = "xyes" && test "x$GCC" = "xyes"], [ AS_COMPILER_FLAGS([MAINTAINER_CFLAGS], - ["-Werror -Wall -Wshadow -Wcast-align - -Wno-uninitialized -Wformat-security + ["-Wall -Wshadow -Wcast-align + -Wno-uninitialized -Wformat -Wformat-security -Wno-strict-aliasing -Winit-self -Wempty-body -Wdeclaration-after-statement - -Wno-strict-aliasing -Wno-strict-aliasing"]) + -Wno-strict-aliasing"]) ] ) +MAINTAINER_CFLAGS="${MAINTAINER_CFLAGS#* }" AC_SUBST([MAINTAINER_CFLAGS]) -GTK_DOC_CHECK([1.11]) +dnl === Test suite ============================================================ -GOBJECT_INTROSPECTION_CHECK([0.6.4]) +GLIB_TESTS -m4_ifdef([AM_SILENT_RULES], - [ - AM_SILENT_RULES([yes]) - use_shave=no - ], - [ - SHAVE_INIT([build/autotools], [enable]) - AC_CONFIG_FILES([ - build/autotools/shave-libtool - build/autotools/shave - ]) - use_shave=yes - ]) +dnl === Test coverage ========================================================= -AM_CONDITIONAL([USE_SHAVE], [test "x$use_shave" = "xyes"]) +AC_ARG_ENABLE([gcov], + [AS_HELP_STRING([--enable-gcov], [Enable gcov])], + [use_gcov=$enableval], + [use_gcov=no]) + +AS_IF([test "x$use_gcov" = "xyes"], + [ + dnl we need gcc: + AS_IF([test "$GCC" != "yes"], [AC_MSG_ERROR([GCC is required for --enable-gcov])]) + + dnl Check if ccache is being used + AC_CHECK_PROG(SHTOOL, shtool, shtool) + AS_CASE([`$SHTOOL path $CC`], + [*ccache*], [gcc_ccache=yes], + [gcc_ccache=no]) + + if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then + AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.]) + fi + + ltp_version_list="1.6 1.7 1.8 1.9 1.10" + AC_CHECK_PROG(LTP, lcov, lcov) + AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) + + if test "$LTP"; then + AC_CACHE_CHECK([for ltp version], json_cv_ltp_version, + [ + json_cv_ltp_version=invalid + ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` + for ltp_check_version in $ltp_version_list; do + if test "$ltp_version" = "$ltp_check_version"; then + json_cv_ltp_version="$ltp_check_version (ok)" + fi + done + ]) + else + ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list" + AC_MSG_ERROR([$ltp_msg]) + fi + + case $json_cv_ltp_version in + ""|invalid[)] + ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)." + AC_MSG_ERROR([$ltp_msg]) + LTP="exit 0;" + ;; + esac + + if test -z "$LTP_GENHTML"; then + AC_MSG_ERROR([Could not find genhtml from the LTP package]) + fi + + AC_DEFINE(HAVE_GCOV, 1, [Whether you have gcov]) + + dnl Remove all optimization flags from CFLAGS + changequote({,}) + CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` + JSON_CFLAGS=`echo "$JSON_CFLAGS" | $SED -e 's/-O[0-9]*//g'` + changequote([,]) + + dnl Define the special gcc flags + JSON_GCOV_CFLAGS="-O0 -fprofile-arcs -ftest-coverage" + JSON_GCOV_LDADD="-lgcov" + + AC_SUBST(JSON_GCOV_CFLAGS) + AC_SUBST(JSON_GCOV_LDADD) + + JSON_CFLAGS="$JSON_CFLAGS $CLUTTER_GCOV_CFLAGS" + JSON_LIBS="$JSON_LIBS $CLUTTER_GCOV_LDADD" + ]) + +AM_CONDITIONAL(ENABLE_GCOV, test "x$use_gcov" = "xyes") + +dnl === Documentation ========================================================= + +# GTK_DOC_CHECK([1.20], [--flavour no-tmpl]) + +AC_ARG_ENABLE([man,], + [AS_HELP_STRING([--enable-man], [generate man pages @<:@default=auto@:>@])], + [], + [enable_man=maybe]) + +AS_IF([test "$enable_man" != no], [ + AC_PATH_PROG([XSLTPROC], [xsltproc]) + AS_IF([test -z "$XSLTPROC"], [ + AS_IF([test "$enable_man" = yes], [ + AC_MSG_ERROR([xsltproc is required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AS_IF([ test "$enable_man" != no ], [ + dnl check for DocBook DTD in the local catalog + JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.1.2//EN], + [DocBook XML DTD V4.1.2], [have_docbook_dtd=yes], [have_docbook_dtd=no]) + AS_IF([test "$have_docbook_dtd" != yes], [ + AS_IF([test "$enable_man" = yes ], [ + AC_MSG_ERROR([DocBook DTD is required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AS_IF([test "$enable_man" != no], [ + dnl check for DocBook XSL stylesheets in the local catalog + JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl], + [DocBook XSL Stylesheets], [have_docbook_style=yes],[have_docbook_style=no]) + AS_IF([ test "$have_docbook_dtd" != yes ], [ + AS_IF([ test "$enable_man" = yes ], [ + AC_MSG_ERROR([DocBook XSL Stylesheets are required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) + +AC_MSG_CHECKING([whether to generate man pages]) +AS_IF([ test "$enable_man" != no ], [ + enable_man=yes + AC_MSG_RESULT([yes]) +], [ + AC_MSG_RESULT([no]) +]) + +dnl === Introspection ========================================================= + +GOBJECT_INTROSPECTION_CHECK([0.9.5]) + +dnl === Localization ========================================================== + +AM_GNU_GETTEXT_VERSION([0.18]) +AM_GNU_GETTEXT([external]) + +GETTEXT_PACKAGE="json-glib-1.0" +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], + ["$GETTEXT_PACKAGE"], + [The prefix for our gettext translation domains.]) +AS_ALL_LINGUAS + +dnl === Output ================================================================ + +AC_SUBST(JSON_CFLAGS) +AC_SUBST(JSON_LIBS) AC_CONFIG_FILES([ Makefile + build/Makefile build/autotools/Makefile + build/win32/Makefile + build/win32/config.h.win32 + build/win32/vs9/Makefile + build/win32/vs10/Makefile + json-glib/Makefile + json-glib/json-glib.pc json-glib/json-version.h json-glib/tests/Makefile - tests/Makefile - doc/Makefile - doc/reference/Makefile - doc/reference/version.xml - json-glib.pc + + po/Makefile.in ]) AC_OUTPUT @@ -175,11 +394,12 @@ echo "" echo " • Prefix: ${prefix}" echo "" echo " • Debug level: ${enable_debug}" -echo " • Compiler flags: ${MAINTAINER_CFLAGS}" -echo " • Use shave: ${use_shave}" +echo " • Compiler flags: ${CFLAGS} ${MAINTAINER_CFLAGS}" echo "" echo " • API reference: ${enable_gtk_doc}" +echo " • Manual pages: ${enable_man}" echo "" -echo " • Enable test suite: ${enable_glibtest}" +echo " • Install tests: ${ENABLE_INSTALLED_TESTS}" echo " • Build introspection data: ${enable_introspection}" +echo " • Enable test coverage: ${use_gcov}" echo "" diff --git a/debian/compat b/debian/compat deleted file mode 100644 index 7ed6ff8..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/debian/control b/debian/control deleted file mode 100644 index 619300a..0000000 --- a/debian/control +++ /dev/null @@ -1,19 +0,0 @@ -Source: libjson-glib -Section: libs -Priority: extra -Maintainer: Moung June Park -Uploaders: Mike McCormack -Build-Depends: debhelper (>= 5), autotools-dev, libglib2.0-dev (>= 2.21.3), libgnutls-dev -Standards-Version: 0.10.4 - -Package: libjson-glib -Section: libs -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: an json-glib api library implementation in C (shared libs) - -Package: libjson-glib-dev -Section: libdevel -Architecture: any -Depends: libjson-glib (= ${Source-Version}), libglib2.0-dev (>= 2.21.3), libgnutls-dev -Description: an json-glib api library implementation in C (development files) diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index 95371f4..0000000 --- a/debian/copyright +++ /dev/null @@ -1,29 +0,0 @@ -AUTHOR, COPYRIGHT AND LICENSING -------------------------------------------------------------------------------- -JSON-GLib has been written by Emmanuele Bassi - -JSON-GLib is released under the terms of the GNU Lesser General Public License, -either version 2.1 or (at your option) any later version. - -See the file COPYING for details. - -Copyright (C) 2007 OpenedHand Ltd -Copyright (C) 2009 Intel Corp. - -License: LGPL-2.1 - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU Lesser General Public License, - version 2.1, as published by the Free Software Foundation. - - This program is distributed in the hope 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 program; if not, write to the Free Software Foundation, - Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - On Debian systems the full text of the GNU Lesser General Public Licnse, - version 2.1, can be found in the /usr/share/common-licenses/LGPL-2.1 file. - diff --git a/debian/docs b/debian/docs deleted file mode 100644 index 6f12db5..0000000 --- a/debian/docs +++ /dev/null @@ -1,2 +0,0 @@ -AUTHORS -README diff --git a/debian/libjson-glib-dev.install.in b/debian/libjson-glib-dev.install.in deleted file mode 100644 index 149ed9a..0000000 --- a/debian/libjson-glib-dev.install.in +++ /dev/null @@ -1,2 +0,0 @@ -@PREFIX@/include/json-glib-1.0/json-glib/*.h -@PREFIX@/lib/pkgconfig/*.pc diff --git a/debian/libjson-glib.install.in b/debian/libjson-glib.install.in deleted file mode 100644 index bf766f0..0000000 --- a/debian/libjson-glib.install.in +++ /dev/null @@ -1 +0,0 @@ -@PREFIX@/lib/*.so* diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 61232ca..0000000 --- a/debian/rules +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -export DH_VERBOSE=1 - - -# These are used for cross-compiling and for saving the configure script -# from having to guess our platform (since we know it already) -DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) -DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) - -CFLAGS ?= -Wall -g -LDFLAGS ?= -PREFIX ?= /usr -DATADIR ?= /opt - -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) - CFLAGS += -O0 -else - CFLAGS += -O2 -endif - -LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed - -config.status: - dh_testdir - # Add here commands to configure the package. - CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./autogen.sh --prefix=$(PREFIX) --without-gnome --enable-sqllite=yes - -build: build-stamp - -build-stamp: config.status - dh_testdir - - # Add here commands to compile the package. - $(MAKE) - #docbook-to-man debian/ncurses.sgml > ncurses.1 - - for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ - cat $$f > $${f%.in}; \ - sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ - sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ - done - - touch $@ - -clean: - dh_testdir - dh_testroot - rm -f build-stamp - - # Add here commands to clean up after the build process. - -$(MAKE) distclean -ifneq "$(wildcard /usr/share/misc/config.sub)" "" - cp -f /usr/share/misc/config.sub config.sub -endif -ifneq "$(wildcard /usr/share/misc/config.guess)" "" - cp -f /usr/share/misc/config.guess config.guess -endif - - for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ - rm -f $${f%.in}; \ - done - - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - - # Add here commands to install the package into debian/ncurses. - $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install - - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - dh_install --sourcedir=debian/tmp -# dh_installmenu -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_python -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman - dh_link - dh_strip - dh_compress - dh_fixperms -# dh_perl - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install diff --git a/depcomp b/depcomp deleted file mode 100755 index df8eea7..0000000 --- a/depcomp +++ /dev/null @@ -1,630 +0,0 @@ -#! /bin/sh -# depcomp - compile a program generating dependencies as side-effects - -scriptversion=2009-04-28.21; # UTC - -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free -# Software Foundation, Inc. - -# 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 2, 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 . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: depcomp [--help] [--version] PROGRAM [ARGS] - -Run PROGRAMS ARGS to compile a file, generating dependencies -as side-effects. - -Environment variables: - depmode Dependency tracking mode. - source Source file read by `PROGRAMS ARGS'. - object Object file output by `PROGRAMS ARGS'. - DEPDIR directory where to store dependencies. - depfile Dependency file to output. - tmpdepfile Temporary file to use when outputing dependencies. - libtool Whether libtool is used (yes/no). - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "depcomp $scriptversion" - exit $? - ;; -esac - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi - -# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. -depfile=${depfile-`echo "$object" | - sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -cygpath_u="cygpath -u -f -" -if test "$depmode" = msvcmsys; then - # This is just like msvisualcpp but w/o cygpath translation. - # Just convert the backslash-escaped backslashes to single forward - # slashes to satisfy depend.m4 - cygpath_u="sed s,\\\\\\\\,/,g" - depmode=msvisualcpp -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. -## Unfortunately, FreeBSD c89 acceptance of flags depends upon -## the command line argument order; so add the flags where they -## appear in depend2.am. Note that the slowdown incurred here -## affects only configure: in makefiles, %FASTDEP% shortcuts this. - for arg - do - case $arg in - -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; - *) set fnord "$@" "$arg" ;; - esac - shift # fnord - shift # $arg - done - "$@" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> "$depfile" - echo >> "$depfile" - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. In older versions, this file always lives in the - # current directory. Also, the AIX compiler puts `$object:' at the - # start of each line; $object doesn't have directory information. - # Version 6 uses the directory in both cases. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.u - tmpdepfile2=$base.u - tmpdepfile3=$dir.libs/$base.u - "$@" -Wc,-M - else - tmpdepfile1=$dir$base.u - tmpdepfile2=$dir$base.u - tmpdepfile3=$dir$base.u - "$@" -M - fi - stat=$? - - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -icc) - # Intel's C compiler understands `-MD -MF file'. However on - # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c - # ICC 7.0 will fill foo.d with something like - # foo.o: sub/foo.c - # foo.o: sub/foo.h - # which is wrong. We want: - # sub/foo.o: sub/foo.c - # sub/foo.o: sub/foo.h - # sub/foo.c: - # sub/foo.h: - # ICC 7.1 will output - # foo.o: sub/foo.c sub/foo.h - # and will wrap long lines using \ : - # foo.o: sub/foo.c ... \ - # sub/foo.h ... \ - # ... - - "$@" -MD -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - # Each line is of the form `foo.o: dependent.h', - # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" - # Some versions of the HPUX 10.20 sed can't process this invocation - # correctly. Breaking it into two sed invocations is a workaround. - sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | - sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp2) - # The "hp" stanza above does not work with aCC (C++) and HP's ia64 - # compilers, which have integrated preprocessors. The correct option - # to use with these is +Maked; it writes dependencies to a file named - # 'foo.d', which lands next to the object file, wherever that - # happens to be. - # Much of this is similar to the tru64 case; see comments there. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - if test "$libtool" = yes; then - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir.libs/$base.d - "$@" -Wc,+Maked - else - tmpdepfile1=$dir$base.d - tmpdepfile2=$dir$base.d - "$@" +Maked - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" - # Add `dependent.h:' lines. - sed -ne '2,${ - s/^ *// - s/ \\*$// - s/$/:/ - p - }' "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" "$tmpdepfile2" - ;; - -tru64) - # The Tru64 compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` - test "x$dir" = "x$object" && dir= - base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` - - if test "$libtool" = yes; then - # With Tru64 cc, shared objects can also be used to make a - # static library. This mechanism is used in libtool 1.4 series to - # handle both shared and static libraries in a single compilation. - # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. - # - # With libtool 1.5 this exception was removed, and libtool now - # generates 2 separate objects for the 2 libraries. These two - # compilations output dependencies in $dir.libs/$base.o.d and - # in $dir$base.o.d. We have to check for both files, because - # one of the two compilations can be disabled. We should prefer - # $dir$base.o.d over $dir.libs/$base.o.d because the latter is - # automatically cleaned when .libs/ is deleted, while ignoring - # the former would cause a distcleancheck panic. - tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 - tmpdepfile2=$dir$base.o.d # libtool 1.5 - tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 - tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 - "$@" -Wc,-MD - else - tmpdepfile1=$dir$base.o.d - tmpdepfile2=$dir$base.d - tmpdepfile3=$dir$base.d - tmpdepfile4=$dir$base.d - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - exit $stat - fi - - for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" - do - test -f "$tmpdepfile" && break - done - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a tab and a space in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout, regardless of -o. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - test -z "$dashmflag" && dashmflag=-M - # Require at least two characters before searching for `:' - # in the target name. This is to cope with DOS-style filenames: - # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. - "$@" $dashmflag | - sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - "$@" || exit $? - # Remove any Libtool call - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - # X makedepend - shift - cleared=no eat=no - for arg - do - case $cleared in - no) - set ""; shift - cleared=yes ;; - esac - if test $eat = yes; then - eat=no - continue - fi - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift ;; - # Strip any option that makedepend may not understand. Remove - # the object too, otherwise makedepend will parse it as a source file. - -arch) - eat=yes ;; - -*|$object) - ;; - *) - set fnord "$@" "$arg"; shift ;; - esac - done - obj_suffix=`echo "$object" | sed 's/^.*\././'` - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - sed '1,2d' "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - # Remove `-o $object'. - IFS=" " - for arg - do - case $arg in - -o) - shift - ;; - $object) - shift - ;; - *) - set fnord "$@" "$arg" - shift # fnord - shift # $arg - ;; - esac - done - - "$@" -E | - sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ - -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the preprocessed file to stdout. - "$@" || exit $? - - # Remove the call to Libtool. - if test "$libtool" = yes; then - while test "X$1" != 'X--mode=compile'; do - shift - done - shift - fi - - IFS=" " - for arg - do - case "$arg" in - -o) - shift - ;; - $object) - shift - ;; - "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") - set fnord "$@" - shift - shift - ;; - *) - set fnord "$@" "$arg" - shift - shift - ;; - esac - done - "$@" -E 2>/dev/null | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" - rm -f "$depfile" - echo "$object : \\" > "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvcmsys) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/doc/draft-zyp-json-schema-02.txt b/doc/draft-zyp-json-schema-02.txt new file mode 100644 index 0000000..5e72fee --- /dev/null +++ b/doc/draft-zyp-json-schema-02.txt @@ -0,0 +1,1345 @@ + + + +Internet Engineering Task Force K. Zyp, Ed. +Internet-Draft SitePen (USA) +Intended status: Informational March 23, 2010 +Expires: September 24, 2010 + + + A JSON Media Type for Describing the Structure and Meaning of JSON + Documents + draft-zyp-json-schema-02 + +Abstract + + JSON (JavaScript Object Notation) Schema defines the media type + application/schema+json, a JSON based format for defining the + structure of JSON data. JSON Schema provides a contract for what + JSON data is required for a given application and how to interact + with it. JSON Schema is intended to define validation, + documentation, hyperlink navigation, and interaction control of JSON + data. + +Status of This Memo + + This Internet-Draft is submitted to IETF in full conformance with the + provisions of BCP 78 and BCP 79. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on September 24, 2010. + +Copyright Notice + + Copyright (c) 2010 IETF Trust and the persons identified as the + document authors. All rights reserved. + + + + +Zyp Expires September 24, 2010 [Page 1] + +Internet-Draft JSON Schema Media Type March 2010 + + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the BSD License. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 3.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5 + 3.2. Design Considerations . . . . . . . . . . . . . . . . . . 6 + 4. Schema/Instance Association . . . . . . . . . . . . . . . . . 6 + 4.1. Self-Descriptive Schema . . . . . . . . . . . . . . . . . 7 + 5. Core Schema Definition . . . . . . . . . . . . . . . . . . . . 7 + 5.1. type . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 + 5.2. properties . . . . . . . . . . . . . . . . . . . . . . . . 8 + 5.3. items . . . . . . . . . . . . . . . . . . . . . . . . . . 9 + 5.4. optional . . . . . . . . . . . . . . . . . . . . . . . . . 9 + 5.5. additionalProperties . . . . . . . . . . . . . . . . . . . 9 + 5.6. requires . . . . . . . . . . . . . . . . . . . . . . . . . 9 + 5.7. minimum . . . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.8. maximum . . . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.9. minimumCanEqual . . . . . . . . . . . . . . . . . . . . . 10 + 5.10. maximumCanEqual . . . . . . . . . . . . . . . . . . . . . 10 + 5.11. minItems . . . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.12. maxItems . . . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.13. uniqueItems . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.14. pattern . . . . . . . . . . . . . . . . . . . . . . . . . 10 + 5.15. maxLength . . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.16. minLength . . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.17. enum . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.18. title . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.19. description . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.20. format . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + 5.21. contentEncoding . . . . . . . . . . . . . . . . . . . . . 12 + 5.22. default . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 5.23. divisibleBy . . . . . . . . . . . . . . . . . . . . . . . 13 + 5.24. disallow . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 5.25. extends . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 6. Hyper Schema . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 6.1. links . . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 6.1.1. Link Description Object . . . . . . . . . . . . . . . 14 + + + +Zyp Expires September 24, 2010 [Page 2] + +Internet-Draft JSON Schema Media Type March 2010 + + + 6.2. fragmentResolution . . . . . . . . . . . . . . . . . . . . 18 + 6.2.1. dot-delimited fragment resolution . . . . . . . . . . 18 + 6.2.2. slash-delimited fragment resolution . . . . . . . . . 19 + 6.3. root . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 + 6.4. readonly . . . . . . . . . . . . . . . . . . . . . . . . . 19 + 6.5. pathStart . . . . . . . . . . . . . . . . . . . . . . . . 20 + 6.6. mediaType . . . . . . . . . . . . . . . . . . . . . . . . 20 + 6.7. alternate . . . . . . . . . . . . . . . . . . . . . . . . 20 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 20 + 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 + 8.1. Registry of Link Relations . . . . . . . . . . . . . . . . 21 + 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + 9.1. Normative References . . . . . . . . . . . . . . . . . . . 22 + 9.2. Informative References . . . . . . . . . . . . . . . . . . 22 + Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 23 + Appendix B. Open Issues . . . . . . . . . . . . . . . . . . . . . 24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Zyp Expires September 24, 2010 [Page 3] + +Internet-Draft JSON Schema Media Type March 2010 + + +1. Introduction + + JSON (JavaScript Object Notation) Schema is a JSON media type for + defining the structure of JSON data. JSON Schema provides a contract + for what JSON data is required for a given application and how to + interact with it. JSON Schema is intended to define validation, + documentation, hyperlink navigation, and interaction control of JSON + data. + +2. Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119. + +3. Overview + + JSON Schema defines the media type application/schema+json for + describing the structure of other JSON documents. JSON Schema is + JSON-based and includes facilities for describing the structure of + JSON documents in terms of allowable values, descriptions, and + interpreting relations with other resources. + + JSON Schema format is organized into several separate definitions. + The first definition is the core schema specification. This + definition is primary concerned with describing a JSON structure and + specifying valid elements in the structure. The second definition is + the Hyper Schema specification which is intended define elements in a + structure that can be interpreted as hyperlinks. Hyper Schema builds + on JSON Schema to describe the hyperlink structure of other JSON + documents. This allows user agents to be able to successfully + navigate JSON documents based on their schemas. + + Cumulatively JSON Schema acts as a meta-document that can be used to + define the required type and constraints on property values, as well + as define the meaning of the property values for the purpose of + describing a resource and determining hyperlinks within the + representation. + + An example JSON Schema that describes products might look like: + + + + + + + + + + + +Zyp Expires September 24, 2010 [Page 4] + +Internet-Draft JSON Schema Media Type March 2010 + + + { + "name":"Product", + "properties":{ + "id":{ + "type":"number", + "description":"Product identifier" + }, + "name":{ + "description":"Name of the product", + "type":"string" + }, + "price":{ + "type": "number", + "minimum":0 + }, + "tags":{ + "optional":true, + "type":"array", + "items":{ + "type":"string" + } + } + }, + "links":[ + { + "rel":"full", + "href":"{id}" + }, + { + "rel":"comments", + "href":"comments/?id={id}" + } + ] + } + + This schema defines the properties of the instance JSON documents and + their required properties (id, name, and price) as well as an + optional property (tags). This also defines the link relations of + the instance JSON documents. + +3.1. Terminology + + For this specification, a schema will be used to denote a JSON Schema + definition, and an instance refers to the JSON object or array that + the schema will be describing and validating + + + + + + +Zyp Expires September 24, 2010 [Page 5] + +Internet-Draft JSON Schema Media Type March 2010 + + +3.2. Design Considerations + + The JSON Schema media type does not attempt to dictate the structure + of JSON representations that contain data, but rather provides a + separate format for flexibly communicating how a JSON representation + should be interpreted and validated, such that user agents can + properly understand acceptable structures and extrapolate hyperlink + information with the JSON document. It is acknowledged that JSON + documents come in a variety of structures, and JSON is unique in that + the structure of stored data structures often prescribes a non- + ambiguous definite JSON representation. Attempting to force a + specific structure is generally not viable, and therefore JSON Schema + allows for great flexibility in the structure of JSON data that it + describes. + + This specification is protocol agnostic. The underlying protocol + (such as HTTP) should sufficiently define the semantics of the + client-server interface, the retrieval of resource representations + linked to by JSON representations, and modification of those + resources. The goal of this format is to sufficiently describe JSON + structures such that one can utilize existing information available + in existing JSON representations from a large variety of services + that leverage a representational state transfer architecture using + existing protocols. + +4. Schema/Instance Association + + JSON Schema instances are correlated to their schema by the + "describedby" relation, where the schema is defined to be the target + of the relation. Instance representations may be of the application/ + json media type or any other subtype. Consequently, dictating how an + instance representation should specify the relation to the schema is + beyond the normative scope of this document (since this document + specifically defines the JSON Schema media type, and no other), but + it is recommended that instances specify their schema so that user + agents can interpret the instance representation and messages may + retain the self-descriptive characteristic, avoiding the need for + out-of-band information about instance data. Two approaches are + recommended for declaring the relation to the schema that describes + the meaning of a JSON instance's (or collection of instances) + structure. A MIME type parameter named "profile" or a Link header + with a relation of "describedby" SHOULD be used: + + + Content-Type: application/json; + profile=http://json.com/my-hyper-schema + + or if the content is being transferred by a protocol (such as HTTP) + + + +Zyp Expires September 24, 2010 [Page 6] + +Internet-Draft JSON Schema Media Type March 2010 + + + that provides headers, a Link header can be used: + + + Link: ; rel="describedby" + + Instances MAY specify multiple schemas, to indicate all the schemas + that are applicable to the data. The instance data may have multiple + schemas that it is defined by (the instance data should be valid for + those schemas). Or if the document is a collection of instances, the + collection may contain instances from different schemas. When + collections contain heterogeneous instances, the pathStart attribute + MAY be specified in the schema to disambiguate which schema should be + applied for each item in the collection. + +4.1. Self-Descriptive Schema + + JSON Schemas are themselves instances for the schema schemas. A + self-describing JSON Schema for the core JSON Schema can be found at + http://json-schema.org/schema and the hyper schema self-description + can be found at: http://json-schema.org/hyper-schema. All schemas + used within a protocol with media type definitions SHOULD include a + MIME parameter that refers to the self-descriptive hyper schema or + another schema that extends this hyper schema: + + + Content-Type: application/json; + profile=http://www.json-schema.org/hyper-schema + +5. Core Schema Definition + + A JSON Schema is a JSON Object that defines various attributes of the + instance and defines it's usage and valid values. A JSON Schema is a + JSON Object with schema attribute properties. The following is the + grammar of a JSON Schema: + + And an example JSON Schema definition could look like: + + + {"description":"A person", + "type":"object", + + "properties": + {"name": {"type":"string"}, + "age" : {"type":"integer", + "maximum":125}} + } + + A JSON Schema object may have any of the following properties, called + + + +Zyp Expires September 24, 2010 [Page 7] + +Internet-Draft JSON Schema Media Type March 2010 + + + schema attributes (all attributes are optional): + +5.1. type + + Union type definition - An array with two or more items which + indicates a union of type definitions. Each item in the array may + be a simple type definition or a schema. The instance value is + valid if it is of the same type as one the type definitions in the + array or if it is valid by one of the schemas in the array. For + example to indicate that a string or number is a valid: {"type": + ["string","number"]} + + Simple type definition - A string indicating a primitive or simple + type. The following are acceptable strings: + + string - Value must be a string. + + number - Value must be a number, floating point numbers are + allowed. + + integer - Value must be an integer, no floating point numbers + are allowed. This is a subset of the number type. + + boolean - Value must be a boolean. + + object - Value must be an object. + + array - Value must be an array. + + null - Value must be null. Note this is mainly for purpose of + being able use union types to define nullability. + + any - Value may be of any type including null. If the property + is not defined or is not in this list, than any type of value + is acceptable. Other type values may be used for custom + purposes, but minimal validators of the specification + implementation can allow any instance value on unknown type + values. + +5.2. properties + + This should be an object type definition, which is an object with + property definitions that correspond to instance object properties. + When the instance value is an object, the property values of the + instance object must conform to the property definitions in this + object. In this object, each property definition's value should be a + schema, and the property's name should be the name of the instance + property that it defines. + + + +Zyp Expires September 24, 2010 [Page 8] + +Internet-Draft JSON Schema Media Type March 2010 + + +5.3. items + + This should be a schema or an array of schemas. When this is an + object/schema and the instance value is an array, all the items in + the array must conform to this schema. When this is an array of + schemas and the instance value is an array, each position in the + instance array must conform to the schema in the corresponding + position for this array. This called tuple typing. When tuple + typing is used, additional items are allowed, disallowed, or + constrained by the additionalProperties attribute using the same + rules as extra properties for objects. The default value is an empty + schema which allows any value for items in the instance array. + +5.4. optional + + This indicates that the instance property in the instance object is + optional. This is false by default. + +5.5. additionalProperties + + This provides a default property definition for all properties that + are not explicitly defined in an object type definition. The value + must be a schema. If false is provided, no additional properties are + allowed, and the schema can not be extended. The default value is an + empty schema which allows any value for additional properties. + +5.6. requires + + This indicates that if this property is present in the containing + instance object, the property given by requires attribute must also + be present in the containing instance object. The value of this + property may be a string, indicating the require property name. Or + the value may be a schema, in which case the containing instance must + be valid by the schema if the property is present. For example if a + object type definition is defined: + + + { + "state": + { + "optional":true + }, + "town": + { + "requires":"state", + "optional":true + } + } + + + +Zyp Expires September 24, 2010 [Page 9] + +Internet-Draft JSON Schema Media Type March 2010 + + + An instance must include a state property if a town property is + included. If a town property is not included, the state property is + optional. + +5.7. minimum + + This indicates the minimum value for the instance property when the + type of the instance value is a number. + +5.8. maximum + + This indicates the minimum value for the instance property when the + type of the instance value is a number. + +5.9. minimumCanEqual + + If the minimum is defined, this indicates whether or not the instance + property value can equal the minimum. + +5.10. maximumCanEqual + + If the maximum is defined, this indicates whether or not the instance + property value can equal the maximum. + +5.11. minItems + + This indicates the minimum number of values in an array when an array + is the instance value. + +5.12. maxItems + + This indicates the maximum number of values in an array when an array + is the instance value. + +5.13. uniqueItems + + This indicates that all the items in an array must be unique (no two + identical values) within that array when an array is the instance + value. + +5.14. pattern + + When the instance value is a string, this provides a regular + expression that a instance string value should match in order to be + valid. Regular expressions should follow the regular expression + specification from ECMA 262/Perl 5 + + + + + +Zyp Expires September 24, 2010 [Page 10] + +Internet-Draft JSON Schema Media Type March 2010 + + +5.15. maxLength + + When the instance value is a string, this indicates maximum length of + the string. + +5.16. minLength + + When the instance value is a string, this indicates minimum length of + the string. + +5.17. enum + + This provides an enumeration of possible values that are valid for + the instance property. This should be an array, and each item in the + array represents a possible value for the instance value. If "enum" + is included, the instance value must be one of the values in enum + array in order for the schema to be valid. + +5.18. title + + This provides a short description of the instance property. The + value must be a string. + +5.19. description + + This provides a full description of the of purpose the instance + property. The value must be a string. + +5.20. format + + This property indicates the type of data, content type, or + microformat to be expected in the instance property values. A format + attribute may be one of the values listed below, and if so, should + adhere to the semantics describing for the format. A format should + only be used give meaning to primitive types (string, integer, + number, or boolean). Validators are not required to validate that + the instance values conform to a format. The following formats are + defined: + + Any valid MIME media type may be used as a format value, in which + case the instance property value must be a string, representing + the contents of the MIME file. + + date-time - This should be a date in ISO 8601 format of YYYY-MM- + DDThh:mm:ssZ in UTC time. This is the recommended form of date/ + timestamp. + + + + + +Zyp Expires September 24, 2010 [Page 11] + +Internet-Draft JSON Schema Media Type March 2010 + + + date - This should be a date in the format of YYYY-MM-DD. It is + recommended that you use the "date-time" format instead of "date" + unless you need to transfer only the date part. + + time - This should be a time in the format of hh:mm:ss. It is + recommended that you use the "date-time" format instead of "time" + unless you need to transfer only the time part. + + utc-millisec - This should be the difference, measured in + milliseconds, between the specified time and midnight, January 1, + 1970 UTC. The value should be a number (integer or float). + + regex - A regular expression. + + color - This is a CSS color (like "#FF0000" or "red"). + + style - This is a CSS style definition (like "color: red; + background-color:#FFF"). + + phone - This should be a phone number (format may follow E.123). + + uri - This value should be a URI.. + + email - This should be an email address. + + ip-address - This should be an ip version 4 address. + + ipv6 - This should be an ip version 6 address. + + street-address - This should be a street address. + + locality - This should be a city or town. + + region - This should be a region (a state in the US, province in + Canada, etc.) + + postal-code - This should be a postal code (AKA zip code). + + country - This should be the name of a country. + + Additional custom formats may be defined with a URL to a + definition of the format. + +5.21. contentEncoding + + If the instance property value is a string, this indicates that the + string should be interpreted as binary data and decoded using the + encoding named by this schema property. RFC 2045, Sec 6.1 lists + + + +Zyp Expires September 24, 2010 [Page 12] + +Internet-Draft JSON Schema Media Type March 2010 + + + possible values. + +5.22. default + + This indicates the default for the instance property. + +5.23. divisibleBy + + This indicates that the instance property value must be divisible by + the given schema value when the instance property value is a number. + +5.24. disallow + + This attribute may take the same values as the "type" attribute, + however if the instance matches the type or if this value is an array + and the instance matches any type or schema in the array, than this + instance is not valid. + +5.25. extends + + The value of this property should be another schema which will + provide a base schema which the current schema will inherit from. + The inheritance rules are such that any instance that is valid + according to the current schema must be valid according to the + referenced schema. This may also be an array, in which case, the + instance must be valid for all the schemas in the array. + +6. Hyper Schema + + This section defines hypermedia definitions of JSON schema. The + following attributes are specified in addition to those attributes + that already provided by JSON schema with the specific purpose of + informing user agents of relations between resources based on JSON + data. Just as with JSON schema attributes, all the attributes in + hyper-schema are optional. Therefore an empty object is a valid + (non-informative) schema, and essentially describes plain JSON (no + constraints on the structures). Addition of attributes provides + additive information for user agents. + +6.1. links + + The value of the links property should be an array, where each item + in the array is a link description object which describes the link + relations of the instances. + + + + + + + +Zyp Expires September 24, 2010 [Page 13] + +Internet-Draft JSON Schema Media Type March 2010 + + +6.1.1. Link Description Object + + A link description object is used to describe the link relations. In + the context of a schema, it defines the link relations of the + instances of the schema, and can be parameterized by the instance + values. The link description format can be used on its own in + regular (non-schema documents), and use of this format can be + declared by referencing the normative link description schema as the + the schema for the data structure that uses the links. The URI of + the normative link description schema is: + http://json-schema.org/links. + +6.1.1.1. href + + The value of the "href" link description property indicates the + target URI of the related resource. The value of the instance + property should be resolved as a URI-Reference per [RFC3986] and may + be a relative URI. The base URI to be used for relative resolution + should be the URI used to retrieve the instance object (not the + schema) when used in the context of a schema. Also, the URI may be + parametrized by the property values of the instance object. + + Instance property values should be substituted into the URIs where + matching braces ('{', '}') are found surrounding zero or more + characters, creating an expanded URI. Instance property value + substitutions are resolved by using the text between the braces to + denote the property name from the instance to get the value to + substitute. For example, if an href value is defined: + + + http://somesite.com/{id} + + Then it would be resolved by replace the value of the "id" property + value from the instance object. If the value of the "id" property + was "45", the expanded URI would be: + + + http://somesite.com/45 + + If matching braces are found with the string "-this" (no quotes) + between the braces, than the actual instance value should be used to + replace the braces, rather than a property value. This should only + be used in situations where the instance is a scalar (string, + boolean, or number), and not for objects or arrays. + + + + + + + +Zyp Expires September 24, 2010 [Page 14] + +Internet-Draft JSON Schema Media Type March 2010 + + +6.1.1.2. rel + + The value of the "rel" property indicates the name of the relation to + the target resource. The relation to the target should be + interpreted as specifically from the instance object that the schema + (or sub-schema) applies to, not just the top level resource that + contains the object within its hierarchy. If a resource JSON + representation contains a sub object with a property interpreted as a + link, that sub-object holds the relation with the target. A relation + to target from the top level resource must be indicated with the + schema describing the top level JSON representation. + + Relationship definitions SHOULD NOT be media type dependent, and + users are encouraged to utilize existing accepted relation + definitions, including those in existing relation registries (see + &rfc4287). However, we define these relation here for clarity of + normative interpretation within the context of JSON hyper schema + defined relations: + + self - If the relation value is "self", when this property is + encountered in the instance object, the object represents a + resource and the instance object is treated as a full + representation of the target resource identified by the specified + URI. + + full - This indicates that the target of the link is the full + representation for the instance object. The object that contains + this link may not be the full representation. + + describedby - This indicates the target of the link is the schema + for the instance object. This may be used to specifically denote + the schemas of objects within a JSON object hierarchy, + facilitating polymorphic type data structures. + + The following relations are applicable for schemas (the schema as + the "from" resource in the relation). + + instances - This indicates the target resource that represents + collection of instances of a schema. + + create - This indicates a target to use for creating new instances + of a schema. This link definition SHOULD be a submission link + with a non-safe method (like POST). + + For example, if a schema is defined: + + + + + + +Zyp Expires September 24, 2010 [Page 15] + +Internet-Draft JSON Schema Media Type March 2010 + + + { + "links": [ + { + "rel": "self" + "href": "{id}" + }, + { + "rel": "up" + "href": "{upId}" + }, + { + "rel": "children" + "href": "?upId={id}" + } + ] + } + + And if a collection of instance resource's JSON representation was + retrieved: + + + GET /Resource/ + + [ + { + "id": "thing", + "upId": "parent" + }, + { + "id": "thing2", + "upId": "parent" + } + ] + + This would indicate that for the first item in the collection, it's + own (self) URI would resolve to "/Resource/thing" and the first + item's "up" relation should be resolved to the resource at + "/Resource/parent". The "children" collection would be located at + "/Resource/?upId=thing". + +6.1.1.2.1. targetSchema + + This property value can be a schema that defines the expected + structure of the JSON representation of the target of the link. + + + + + + + +Zyp Expires September 24, 2010 [Page 16] + +Internet-Draft JSON Schema Media Type March 2010 + + +6.1.1.3. Submission Link Properties + + The following properties also apply to link definition objects, and + provide functionality analogous to HTML forms, in providing a means + for submitting extra (often user supplied) information to send to a + server. + +6.1.1.3.1. method + + This indicates which method should be used to access the target + resource. In an HTTP environment, this would be "GET" or "POST" + (other HTTP methods such as "PUT" and "DELETE" have semantics that + are clearly implied by accessed resources, and do not need to be + defined here). This defaults to "GET". + +6.1.1.3.2. enctype + + If present, this property indicates a query media type format that + the server supports for querying or posting to the collection of + instances at the target resource. The query can be suffixed to the + target URI to query the collection with property-based constraints on + the resources that SHOULD be returned from the server or used to post + data to the resource (depending on the method). For example, with + the following schema: + + + { + "links":[ + { + "enctype": "application/x-www-form-urlencoded", + "method": "GET", + "href": "/Product/", + "properties":{ + "name":{"description":"name of the product"} + } + } + ] + } + + This indicates that the client can query the server for instances + that have a specific name: + + + /Product/?name=Slinky + + If no enctype or method is specified, only the single URI specified + by the href property is defined. If the method is POST, application/ + json is the default media type. + + + +Zyp Expires September 24, 2010 [Page 17] + +Internet-Draft JSON Schema Media Type March 2010 + + +6.1.1.3.3. properties + + This is inherited from the base JSON schema definition, and can + follow the same structure, but its meaning should be used to define + the acceptable property names and values for the action (whether it + be for the GET query or POST body). If properties are omitted, and + this form is the child of a schema, the properties from the parent + schema should be used as the basis for the form action. + +6.2. fragmentResolution + + This property indicates the fragment resolution protocol to use for + resolving fragment identifiers in URIs within the instance + representations. This applies to the instance object URIs and all + children of the instance object's URIs. The default fragment + resolution protocol is "slash-delimited", which is defined below. + Other fragment resolution protocols may be used, but are not defined + in this document. + + The fragment identifier is based on RFC 2396 Sec 5, and defines the + mechanism for resolving references to entities within a document. + +6.2.1. dot-delimited fragment resolution + + With the dot-delimited fragment resolution protocol, the fragment + identifier is interpreted as a series of property reference tokens + that are delimited by the "." character (\x2E). Each property + reference token is a series of any legal URI component characters + except the "." character. Each property reference token should be + interpreted, starting from the beginning of the fragment identifier, + as a path reference in the target JSON structure. The final target + value of the fragment can be determined by starting with the root of + the JSON structure from the representation of the resource identified + by the pre-fragment URI. If the target is a JSON object, than the + new target is the value of the property with the name identified by + the next property reference token in the fragment. If the target is + a JSON array, than the target is determined by finding the item in + array the array with the index defined by the next property reference + token (which MUST be a number). The target is successively updated + for each property reference token, until the entire fragment has been + traversed. + + Property names SHOULD be URI-encoded. In particular, any "." in a + property name MUST be encoded to avoid being interpreted as a + property delimiter. + + For example, for the following JSON representation: + + + + +Zyp Expires September 24, 2010 [Page 18] + +Internet-Draft JSON Schema Media Type March 2010 + + + { + "foo":{ + "anArray":[ + {"prop":44} + ], + "another prop":{ + "baz":"A string" + } + } + } + + The following fragment identifiers would be resolved: + + + fragment identifier resolution + ------------------- ---------- + # self, the root of the resource itself + #foo the object referred to by the foo property + #foo.another prop the object referred to by the "another prop" + property of the object referred to by the + "foo" property + #foo.another prop.baz the string referred to by the value of "baz" + property of the "another prop" property of + the object referred to by the "foo" property + #foo.anArray.0 the first object in the "anArray" array + +6.2.2. slash-delimited fragment resolution + + The slash-delimited fragment resolution protocol is exactly the same + as dot-delimited fragment resolution protocol except that the "/" + character (\x2F) is used as the delimiter between property names + (instead of "."). + +6.3. root + + This attribute indicates that the value of the instance property + value SHOULD be treated as the root or the body of the representation + for the purposes of user agent interaction and fragment resolution + (all other properties of the instance objects are can be regarded as + meta-data descriptions for the data). + +6.4. readonly + + This indicates that the instance property should not be changed. + Attempts by a user agent to modify the value of this property are + expected to be rejected by a server. + + + + + +Zyp Expires September 24, 2010 [Page 19] + +Internet-Draft JSON Schema Media Type March 2010 + + +6.5. pathStart + + This property value is a URI-Reference that indicates the URI that + all the URIs for the instances of the schema should start with. When + multiple schemas have been referenced for an instance, the user agent + can determine if this schema is applicable for a particular instance + by determining if URI of the instance begins with the pathStart's + referenced URI. pathStart MUST be resolved as per [RFC3986] section + 5. If the URI of the instance does not start with URI indicated by + pathStart, or if another schema specifies a starting URI that is + longer and also matches the instance, this schema should not be + applied to the instance. Any schema that does not have a pathStart + attribute should be considered applicable to all the instances for + which it is referenced. + +6.6. mediaType + + This indicates the media type of the instance representations that + this schema is defining. + +6.7. alternate + + This is an array of JSON schema definitions that define any other + schemas for alternate JSON-based representations of the instance + resources. + +7. Security Considerations + + This specification is a sub-type of the JSON format, and consequently + the security considerations are generally the same as RFC 4627. + However, an additional issue is that when link relation of "self" is + used to denote a full representation of an object, the user agent + SHOULD NOT consider the representation to be the authoritative + representation of the resource denoted by the target URI if the + target URI is not equivalent to or a sub-path of the the URI used to + request the resource representation which contains the target URI + with the "self" link. For example, if a hyper schema was defined: + + + { + "links":[ + { + "rel":"self", + "href":"{id}" + } + ] + } + + + + +Zyp Expires September 24, 2010 [Page 20] + +Internet-Draft JSON Schema Media Type March 2010 + + + And a resource was requested from somesite.com: + + + GET /foo/ + + With a response of: + + +Content-Type: application/json; profile=/schema-for-this-data +[ + {"id":"bar", "name":"This representation can be safely treated \ + as authoritative "}, + {"id":"/baz", "name":"This representation should not be treated as \ + authoritative the user agent should make request the resource\ + from "/baz" to ensure it has the authoritative representation"}, + {"id":"http://othersite.com/something", "name":"This representation\ + should also not be treated as authoritative and the target\ + resource representation should be retrieved for the\ + authoritative representation"} +] + +8. IANA Considerations + + The proposed MIME media type for JSON Schema is application/ + schema+json + + Type name: application + + Subtype name: schema+json + + Required parameters: profile + + The value of the profile parameter should be a URI (relative or + absolute) that refers to the schema used to define the structure of + this structure (the meta-schema). Normally the value would be + http://json-schema.org/hyper-schema, but it is allowable to use other + schemas that extend the hyper schema's meta- schema. + + Optional parameters: pretty + + The value of the pretty parameter may be true or false to indicate if + additional whitespace has been included to make the JSON + representation easier to read. + +8.1. Registry of Link Relations + + This registry is maintained by IANA per RFC 4287 and this + specification adds three values: "full", "create", "instances". New + + + +Zyp Expires September 24, 2010 [Page 21] + +Internet-Draft JSON Schema Media Type March 2010 + + + assignments are subject to IESG Approval, as outlined in [RFC5226]. + Requests should be made by email to IANA, which will then forward the + request to the IESG, requesting approval. + +9. References + +9.1. Normative References + + [RFC3986] Berners-Lee, T., Fielding, R., and + L. Masinter, "Uniform Resource + Identifier (URI): Generic Syntax", + STD 66, RFC 3986, January 2005. + + [RFC2119] Bradner, S., "Key words for use in + RFCs to Indicate Requirement + Levels", BCP 14, RFC 2119, + March 1997. + + [RFC4287] Nottingham, M., Ed. and R. Sayre, + Ed., "The Atom Syndication + Format", RFC 4287, December 2005. + + [RFC3339] Klyne, G., Ed. and C. Newman, + "Date and Time on the Internet: + Timestamps", RFC 3339, July 2002. + + [RFC2045] Freed, N. and N. Borenstein, + "Multipurpose Internet Mail + Extensions (MIME) Part One: Format + of Internet Message Bodies", + RFC 2045, November 1996. + +9.2. Informative References + + [RFC4627] Crockford, D., "The application/ + json Media Type for JavaScript + Object Notation (JSON)", RFC 4627, + July 2006. + + [RFC2616] Fielding, R., Gettys, J., Mogul, + J., Frystyk, H., Masinter, L., + Leach, P., and T. Berners-Lee, + "Hypertext Transfer Protocol -- + HTTP/1.1", RFC 2616, June 1999. + + [RFC5226] Narten, T. and H. Alvestrand, + "Guidelines for Writing an IANA + Considerations Section in RFCs", + + + +Zyp Expires September 24, 2010 [Page 22] + +Internet-Draft JSON Schema Media Type March 2010 + + + BCP 26, RFC 5226, May 2008. + + [I-D.hammer-discovery] Hammer-Lahav, E., "LRDD: Link- + based Resource Descriptor + Discovery", + draft-hammer-discovery-04 (work in + progress), March 2010. + + [I-D.gregorio-uritemplate] Gregorio, J., Fielding, R., + Hadley, M., and M. Nottingham, + "URI Template", + draft-gregorio-uritemplate-04 + (work in progress), March 2010. + + [I-D.nottingham-http-link-header] Nottingham, M., "Web Linking", dra + ft-nottingham-http-link-header-08 + (work in progress), March 2010. + + [W3C.REC-html401-19991224] Hors, A., Jacobs, I., and D. + Raggett, "HTML 4.01 + Specification", World Wide Web + Consortium Recommendation REC- + html401-19991224, December 1999, < + http://www.w3.org/TR/1999/ + REC-html401-19991224>. + +Appendix A. Change Log + + -02 + + o Replaced maxDecimal attribute with divisibleBy attribute + + o Added slash-delimited fragment resolution protocol and made it the + default. + + o Added language about using links outside of schemas by referencing + it's normative URI. + + o Added uniqueItems attribute + + o Added targetSchema attribute to link description object + + -01 + + o Fixed category and updates from template + + -00 + + + + +Zyp Expires September 24, 2010 [Page 23] + +Internet-Draft JSON Schema Media Type March 2010 + + + o Initial draft + +Appendix B. Open Issues + + Should we give a preference to MIME headers over Link headers (or + only use one)? + + Should we use "profile" as the media type parameter instead? + + Should "root" be a MIME parameter instead of a schema attribute? + + Should "format" be renamed to "mediaType" or "contentType" to reflect + the usage MIME media types that are allowed. + + I still do not like how dates are handled. + + Should "slash-delimited" or "dot-delimited" be the default fragment + resolution protocol? + +Author's Address + + Kris Zyp (editor) + SitePen (USA) + 530 Lytton Avenue + Palo Alto, CA 94301 + USA + + Phone: +1 650 968 8787 + EMail: kris@sitepen.com + + + + + + + + + + + + + + + + + + + + + + +Zyp Expires September 24, 2010 [Page 24] + + diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am index 6e7e33c..d9ef4a1 100644 --- a/doc/reference/Makefile.am +++ b/doc/reference/Makefile.am @@ -16,7 +16,7 @@ DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.xml DOC_SOURCE_DIR = ../../json-glib # Extra options to pass to gtkdoc-scangobj. Not normally needed. -SCANGOBJ_OPTIONS = --type-init-func="g_type_init()" +SCANGOBJ_OPTIONS = # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" @@ -24,7 +24,7 @@ SCAN_OPTIONS = --deprecated-guards="JSON_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml -MKDB_OPTIONS = --sgml-mode --output-format=xml --name-space=json +MKDB_OPTIONS = --output-format=xml --name-space=json # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl @@ -34,7 +34,8 @@ MKTMPL_OPTIONS = # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = \ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \ - --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject + --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \ + --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gio # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h @@ -51,7 +52,8 @@ IGNORE_HFILES = \ json-private.h \ json-marshal.h \ json-glib.h \ - json-enum-types.h + json-enum-types.h \ + json-debug.h EXTRA_HFILES = @@ -61,7 +63,10 @@ HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml -content_files = version.xml +content_files = \ + json-glib-format.xml \ + json-glib-validate.xml \ + version.xml # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files @@ -74,23 +79,34 @@ expand_content_files = # e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) -INCLUDES = -I$(top_srcdir) -I$(top_builddir) $(JSON_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) $(JSON_CFLAGS) GTKDOC_LIBS = $(top_builddir)/json-glib/libjson-glib-1.0.la $(JSON_LIBS) -# needed to avoid including Makefile.am.gtest which redeclares -# EXTRA_DIST and generates a warning when the gtk-doc.make include -# below -test-report: - @true - -test: - @true - -check-local: test - # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make -# Other files to distribute -# e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += version.xml.in + +man_MANS = + +if ENABLE_MAN +man_MANS += \ + json-glib-format.1 \ + json-glib-validate.1 + +XSLTPROC_FLAGS = \ + --nonet \ + --stringparam man.output.quietly 1 \ + --stringparam funcsynopsis.style ansi \ + --stringparam man.th.extra1.suppress 1 \ + --stringparam man.authors.section.enabled 0 \ + --stringparam man.copyright.section.enabled 0 + +.xml.1: + $(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +CLEANFILES ?= +CLEANFILES += $(man_MANS) +EXTRA_DIST += $(man_MANS) diff --git a/doc/reference/html/JsonGenerator.html b/doc/reference/html/JsonGenerator.html deleted file mode 100644 index 6deb588..0000000 --- a/doc/reference/html/JsonGenerator.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - -JsonGenerator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

JsonGenerator

-

JsonGenerator — Generates JSON data streams

-
-
-

Synopsis

-
                    JsonGenerator;
-                    JsonGeneratorClass;
-JsonGenerator *     json_generator_new                  (void);
-gboolean            json_generator_to_file              (JsonGenerator *generator,
-                                                         const gchar *filename,
-                                                         GError **error);
-gchar *             json_generator_to_data              (JsonGenerator *generator,
-                                                         gsize *length);
-void                json_generator_set_root             (JsonGenerator *generator,
-                                                         JsonNode *node);
-
-
-
-

Object Hierarchy

-
-  GObject
-   +----JsonGenerator
-
-
-
-

Properties

-
-  "indent"                   guint                 : Read / Write
-  "indent-char"              guint                 : Read / Write
-  "pretty"                   gboolean              : Read / Write
-  "root"                     JsonNode*             : Read / Write
-
-
-
-

Description

-

-JsonGenerator provides an object for generating a JSON data stream and -put it into a buffer or a file.

-
-
-

Details

-
-

JsonGenerator

-
typedef struct _JsonGenerator JsonGenerator;
-

-JSON data streams generator. The contents of the JsonGenerator structure -are private and should only be accessed via the provided API.

-
-
-
-

JsonGeneratorClass

-
typedef struct {
-} JsonGeneratorClass;
-
-

-JsonGenerator class

-
-
-
-

json_generator_new ()

-
JsonGenerator *     json_generator_new                  (void);
-

-Creates a new JsonGenerator. You can use this object to generate a -JSON data stream starting from a data object model composed by -JsonNodes.

-
-- - - - -

Returns :

the newly created JsonGenerator instance -
-
-
-
-

json_generator_to_file ()

-
gboolean            json_generator_to_file              (JsonGenerator *generator,
-                                                         const gchar *filename,
-                                                         GError **error);
-

-Creates a JSON data stream and puts it inside filename, overwriting the -current file contents. This operation is atomic.

-
-- - - - - - - - - - - - - - - - - - -

generator :

a JsonGenerator -

filename :

path to the target file -

error :

return location for a GError, or NULL -

Returns :

TRUE if saving was successful. -
-
-
-
-

json_generator_to_data ()

-
gchar *             json_generator_to_data              (JsonGenerator *generator,
-                                                         gsize *length);
-

-Generates a JSON data stream from generator and returns it as a -buffer.

-
-- - - - - - - - - - - - - - -

generator :

a JsonGenerator -

length :

out. out.

Returns :

a newly allocated buffer holding a JSON data stream. - Use g_free() to free the allocated resources. -
-
-
-
-

json_generator_set_root ()

-
void                json_generator_set_root             (JsonGenerator *generator,
-                                                         JsonNode *node);
-

-Sets node as the root of the JSON data stream to be serialized by -the JsonGenerator. -

-

-

-
-

Note

The node is copied by the generator object, so it can be safely -freed after calling this function.
-
-- - - - - - - - - - -

generator :

a JsonGenerator -

node :

a JsonNode -
-
-
-
-

Property Details

-
-

The "indent" property

-
  "indent"                   guint                 : Read / Write
-

-Number of spaces to be used to indent when pretty printing.

-

Default value: 2

-
-
-
-

The "indent-char" property

-
  "indent-char"              guint                 : Read / Write
-

-The character that should be used when indenting in pretty print.

-

Default value: ' '

-

Since 0.6

-
-
-
-

The "pretty" property

-
  "pretty"                   gboolean              : Read / Write
-

-Whether the output should be "pretty-printed", with indentation and -newlines. The indentation level can be controlled by using the -JsonGenerator:indent property

-

Default value: FALSE

-
-
-
-

The "root" property

-
  "root"                     JsonNode*             : Read / Write
-

-The root JsonNode to be used when constructing a JSON data -stream.

-

Since 0.4

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/JsonParser.html b/doc/reference/html/JsonParser.html deleted file mode 100644 index 08af3a5..0000000 --- a/doc/reference/html/JsonParser.html +++ /dev/null @@ -1,704 +0,0 @@ - - - - -JsonParser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

JsonParser

-

JsonParser — Parse JSON data streams

-
- -
-

Object Hierarchy

-
-  GObject
-   +----JsonParser
-
-
-
-

Signals

-
-  "array-element"                                  : Run Last
-  "array-end"                                      : Run Last
-  "array-start"                                    : Run Last
-  "error"                                          : Run Last
-  "object-end"                                     : Run Last
-  "object-member"                                  : Run Last
-  "object-start"                                   : Run Last
-  "parse-end"                                      : Run Last
-  "parse-start"                                    : Run Last
-
-
-
-

Description

-

-JsonParser provides an object for parsing a JSON data stream, either -inside a file or inside a static buffer.

-
-
-

Details

-
-

enum JsonParserError

-
typedef enum {
-  JSON_PARSER_ERROR_PARSE,
-  
-  JSON_PARSER_ERROR_UNKNOWN
-} JsonParserError;
-
-

-Error enumeration for JsonParser

-
-- - - - - - - - - - -

JSON_PARSER_ERROR_PARSE

parse error -

JSON_PARSER_ERROR_UNKNOWN

unknown error -
-
-
-
-

JsonParser

-
typedef struct _JsonParser JsonParser;
-

-JSON data streams parser. The contents of the JsonParser structure are -private and should only be accessed via the provided API.

-
-
-
-

JsonParserClass

-
typedef struct {
-  void (* parse_start)   (JsonParser   *parser);
-
-  void (* object_start)  (JsonParser   *parser);
-  void (* object_member) (JsonParser   *parser,
-                          JsonObject   *object,
-                          const gchar  *member_name);
-  void (* object_end)    (JsonParser   *parser,
-                          JsonObject   *object);
-
-  void (* array_start)   (JsonParser   *parser);
-  void (* array_element) (JsonParser   *parser,
-                          JsonArray    *array,
-                          gint          index_);
-  void (* array_end)     (JsonParser   *parser,
-                          JsonArray    *array);
-
-  void (* parse_end)     (JsonParser   *parser);
-  
-  void (* error)         (JsonParser   *parser,
-                          const GError *error);
-} JsonParserClass;
-
-

-JsonParser class.

-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

parse_start ()

class handler for the JsonParser::parse-start signal -

object_start ()

class handler for the JsonParser::object-start signal -

object_member ()

class handler for the JsonParser::object-member signal -

object_end ()

class handler for the JsonParser::object-end signal -

array_start ()

class handler for the JsonParser::array-start signal -

array_element ()

class handler for the JsonParser::array-element signal -

array_end ()

class handler for the JsonParser::array-end signal -

parse_end ()

class handler for the JsonParser::parse-end signal -

error ()

class handler for the JsonParser::error signal -
-
-
-
-

json_parser_new ()

-
JsonParser *        json_parser_new                     (void);
-

-Creates a new JsonParser instance. You can use the JsonParser to -load a JSON stream from either a file or a buffer and then walk the -hierarchy using the data types API.

-
-- - - - -

Returns :

the newly created JsonParser. Use g_object_unref() - to release all the memory it allocates. -
-
-
-
-

json_parser_load_from_file ()

-
gboolean            json_parser_load_from_file          (JsonParser *parser,
-                                                         const gchar *filename,
-                                                         GError **error);
-

-Loads a JSON stream from the content of filename and parses it. See -json_parser_load_from_data().

-
-- - - - - - - - - - - - - - - - - - -

parser :

a JsonParser -

filename :

the path for the file to parse -

error :

return location for a GError, or NULL -

Returns :

TRUE if the file was successfully loaded and parsed. - In case of error, error is set accordingly and FALSE is returned -
-
-
-
-

json_parser_load_from_data ()

-
gboolean            json_parser_load_from_data          (JsonParser *parser,
-                                                         const gchar *data,
-                                                         gssize length,
-                                                         GError **error);
-

-Loads a JSON stream from a buffer and parses it. You can call this function -multiple times with the same JsonParser object, but the contents of the -parser will be destroyed each time.

-
-- - - - - - - - - - - - - - - - - - - - - - -

parser :

a JsonParser -

data :

the buffer to parse -

length :

the length of the buffer, or -1 -

error :

return location for a GError, or NULL -

Returns :

TRUE if the buffer was succesfully parser. In case - of error, error is set accordingly and FALSE is returned -
-
-
-
-

json_parser_get_root ()

-
JsonNode *          json_parser_get_root                (JsonParser *parser);
-

-Retrieves the top level node from the parsed JSON stream.

-
-- - - - - - - - - - -

parser :

a JsonParser -

Returns :

transfer none. transfer none.
-
-
-
-

json_parser_get_current_line ()

-
guint               json_parser_get_current_line        (JsonParser *parser);
-

-Retrieves the line currently parsed, starting from 1. -

-

-This function has defined behaviour only while parsing; calling this -function from outside the signal handlers emitted by JsonParser will -yield 0.

-
-- - - - - - - - - - -

parser :

a JsonParser -

Returns :

the currently parsed line, or 0. -
-
-
-
-

json_parser_get_current_pos ()

-
guint               json_parser_get_current_pos         (JsonParser *parser);
-

-Retrieves the current position inside the current line, starting -from 0. -

-

-This function has defined behaviour only while parsing; calling this -function from outside the signal handlers emitted by JsonParser will -yield 0.

-
-- - - - - - - - - - -

parser :

a JsonParser -

Returns :

the position in the current line, or 0. -
-
-
-
-

json_parser_has_assignment ()

-
gboolean            json_parser_has_assignment          (JsonParser *parser,
-                                                         gchar **variable_name);
-

-A JSON data stream might sometimes contain an assignment, like: -

-

-

-
-  var _json_data = { "member_name" : [ ...
-
-

-

-

-even though it would technically constitute a violation of the RFC. -

-

-JsonParser will ignore the left hand identifier and parse the right -hand value of the assignment. JsonParser will record, though, the -existence of the assignment in the data stream and the variable name -used.

-
-- - - - - - - - - - - - - - -

parser :

a JsonParser -

variable_name :

out) (allow-none. out. allow-none.

Returns :

TRUE if there was an assignment, FALSE otherwise. If - variable_name is not NULL it will be set to the name of the variable - used in the assignment. The string is owned by JsonParser and should - never be modified or freed. - -
-

Since 0.4

-
-
-
-

Signal Details

-
-

The "array-element" signal

-
void                user_function                      (JsonParser *parser,
-                                                        JsonArray  *array,
-                                                        gint        index_,
-                                                        gpointer    user_data)      : Run Last
-

-The ::array-element signal is emitted each time the JsonParser -has successfully parsed a single element of a JsonArray. The -array and element index are passed to the signal handlers.

-
-- - - - - - - - - - - - - - - - - - -

parser :

the JsonParser that received the signal -

array :

a JsonArray -

index_ :

the index of the newly parsed element -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "array-end" signal

-
void                user_function                      (JsonParser *parser,
-                                                        JsonArray  *array,
-                                                        gpointer    user_data)      : Run Last
-

-The ::array-end signal is emitted each time the JsonParser -has successfully parsed an entire JsonArray

-
-- - - - - - - - - - - - - - -

parser :

the JsonParser that received the signal -

array :

the parsed JsonArrary -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "array-start" signal

-
void                user_function                      (JsonParser *parser,
-                                                        gpointer    user_data)      : Run Last
-

-The ::array-start signal is emitted each time the JsonParser -starts parsing a JsonArray

-
-- - - - - - - - - - -

parser :

the JsonParser that received the signal -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "error" signal

-
void                user_function                      (JsonParser *parser,
-                                                        gpointer    error,
-                                                        gpointer    user_data)      : Run Last
-

-The ::error signal is emitted each time a JsonParser encounters -an error in a JSON stream.

-
-- - - - - - - - - - - - - - -

parser :

the parser instance that received the signal -

error :

a pointer to the GError -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "object-end" signal

-
void                user_function                      (JsonParser *parser,
-                                                        JsonObject *object,
-                                                        gpointer    user_data)      : Run Last
-

-The ::object-end signal is emitted each time the JsonParser -has successfully parsed an entire JsonObject.

-
-- - - - - - - - - - - - - - -

parser :

the JsonParser that received the signal -

object :

the parsed JsonObject -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "object-member" signal

-
void                user_function                      (JsonParser *parser,
-                                                        JsonObject *object,
-                                                        gchar      *member_name,
-                                                        gpointer    user_data)        : Run Last
-

-The ::object-member signal is emitted each time the JsonParser -has successfully parsed a single member of a JsonObject. The -object and member are passed to the signal handlers.

-
-- - - - - - - - - - - - - - - - - - -

parser :

the JsonParser that received the signal -

object :

a JsonObject -

member_name :

the name of the newly parsed member -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "object-start" signal

-
void                user_function                      (JsonParser *parser,
-                                                        gpointer    user_data)      : Run Last
-

-The ::object-start signal is emitted each time the JsonParser -starts parsing a JsonObject.

-
-- - - - - - - - - - -

parser :

the JsonParser that received the signal -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "parse-end" signal

-
void                user_function                      (JsonParser *parser,
-                                                        gpointer    user_data)      : Run Last
-

-The ::parse-end signal is emitted when the parser successfully -finished parsing a JSON data stream

-
-- - - - - - - - - - -

parser :

the JsonParser that received the signal -

user_data :

user data set when the signal handler was connected.
-
-
-
-

The "parse-start" signal

-
void                user_function                      (JsonParser *parser,
-                                                        gpointer    user_data)      : Run Last
-

-The ::parse-start signal is emitted when the parser began parsing -a JSON data stream.

-
-- - - - - - - - - - -

parser :

the JsonParser that received the signal -

user_data :

user data set when the signal handler was connected.
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/annotation-glossary.html b/doc/reference/html/annotation-glossary.html deleted file mode 100644 index 62f1725..0000000 --- a/doc/reference/html/annotation-glossary.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - -Annotation Glossary - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Annotation Glossary

-

O

-
-out
-

Parameter for returning results. Default is transfer full.

-

A

-
-allow-none
-

NULL is ok, both for passing and for returning.

-

E

-
-element-type
-

Generics and defining elements of containers and arrays.

-

T

-
-transfer container
-

Free data container after the code is done.

-
-transfer full
-

Free data after the code is done.

-
-transfer none
-

Don't free data after the code is done.

-
- - - \ No newline at end of file diff --git a/doc/reference/html/ch01.html b/doc/reference/html/ch01.html deleted file mode 100644 index 4f0d310..0000000 --- a/doc/reference/html/ch01.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - -Data Types - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Data Types

-
-
-JSON Node — Node in a JSON object model -
-
-JSON Array — a JSON array representation -
-
-JSON Object — a JSON object representation -
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ch02.html b/doc/reference/html/ch02.html deleted file mode 100644 index e81431a..0000000 --- a/doc/reference/html/ch02.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -Parser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Parser

-
-JsonParser — Parse JSON data streams -
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ch03.html b/doc/reference/html/ch03.html deleted file mode 100644 index 0c17f0b..0000000 --- a/doc/reference/html/ch03.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -Generator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Generator

-
-JsonGenerator — Generates JSON data streams -
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ch04.html b/doc/reference/html/ch04.html deleted file mode 100644 index 54fd40c..0000000 --- a/doc/reference/html/ch04.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - -Object Hierarchy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Object Hierarchy

-
-    GObject
-        JsonGenerator
-        JsonParser
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/home.png b/doc/reference/html/home.png deleted file mode 100644 index 1700361..0000000 Binary files a/doc/reference/html/home.png and /dev/null differ diff --git a/doc/reference/html/index.html b/doc/reference/html/index.html deleted file mode 100644 index 408f136..0000000 --- a/doc/reference/html/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - -JSON-GLib Reference Manual - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-

for JSON-GLib 0.10.4 -

-
-
-
-

- Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free - Documentation License, Version 1.1 or any later - version published by the Free Software Foundation with no - Invariant Sections, no Front-Cover Texts, and no Back-Cover - Texts. You may obtain a copy of the GNU Free - Documentation License from the Free Software - Foundation by visiting their Web site or by writing - to: - -

-


-          The Free Software Foundation, Inc.,
-          59 Temple Place - Suite 330,
-          Boston, MA 02111-1307,
-          USA
-        

-

-

-
-
-
-
-
-
I. JSON-GLib Overview
-
II. JSON-GLib Reference
-
-
Data Types
-
-
-JSON Node — Node in a JSON object model -
-
-JSON Array — a JSON array representation -
-
-JSON Object — a JSON object representation -
-
-
-
III. Reading and writing
-
-
Parser
-
-JsonParser — Parse JSON data streams -
-
Generator
-
-JsonGenerator — Generates JSON data streams -
-
-
IV. JSON-GLib Advanced API
-
-
-GObject Serialization — Serialize and deserialize GObjects -
-
-Serializable Interface — Interface for serialize and deserialize special GObjects -
-
-Boxed Types Serialization — Serialize and deserialize GBoxed types -
-
-
V. JSON-GLib Additional Reference
-
-
-Versioning information — JSON-GLib version checking -
-
Object Hierarchy
-
-
Index
-
Index of deprecated symbols
-
Index of new symbols in 0.4
-
Index of new symbols in 0.6
-
Index of new symbols in 0.8
-
Index of new symbols in 0.10
-
Annotation Glossary
-
A. License
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/index.sgml b/doc/reference/html/index.sgml deleted file mode 100644 index 273c952..0000000 --- a/doc/reference/html/index.sgml +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/reference/html/ix01.html b/doc/reference/html/ix01.html deleted file mode 100644 index 8dd40a2..0000000 --- a/doc/reference/html/ix01.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - -Index - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Index

-

A

-
JsonArray
-
-
JsonArrayForeach
-
-
json_array_add_array_element
-
-
json_array_add_boolean_element
-
-
json_array_add_double_element
-
-
json_array_add_element
-
-
json_array_add_int_element
-
-
json_array_add_null_element
-
-
json_array_add_object_element
-
-
json_array_add_string_element
-
-
json_array_dup_element
-
-
json_array_foreach_element
-
-
json_array_get_array_element
-
-
json_array_get_boolean_element
-
-
json_array_get_double_element
-
-
json_array_get_element
-
-
json_array_get_elements
-
-
json_array_get_int_element
-
-
json_array_get_length
-
-
json_array_get_null_element
-
-
json_array_get_object_element
-
-
json_array_get_string_element
-
-
json_array_new
-
-
json_array_ref
-
-
json_array_remove_element
-
-
json_array_sized_new
-
-
json_array_unref
-
-

B

-
JsonBoxedDeserializeFunc
-
-
JsonBoxedSerializeFunc
-
-
json_boxed_can_deserialize
-
-
json_boxed_can_serialize
-
-
json_boxed_deserialize
-
-
json_boxed_register_deserialize_func
-
-
json_boxed_register_serialize_func
-
-
json_boxed_serialize
-
-

C

-
JSON_CHECK_VERSION
-
-
json_construct_gobject
-
-

G

-
JsonGenerator
-
-
JsonGenerator:indent
-
-
JsonGenerator:indent-char
-
-
JsonGenerator:pretty
-
-
JsonGenerator:root
-
-
JsonGeneratorClass
-
-
json_generator_new
-
-
json_generator_set_root
-
-
json_generator_to_data
-
-
json_generator_to_file
-
-
json_gobject_deserialize
-
-
json_gobject_from_data
-
-
json_gobject_serialize
-
-
json_gobject_to_data
-
-

M

-
JSON_MAJOR_VERSION
-
-
JSON_MICRO_VERSION
-
-
JSON_MINOR_VERSION
-
-

N

-
JsonNode
-
-
JsonNodeType
-
-
json_node_copy
-
-
json_node_dup_array
-
-
json_node_dup_object
-
-
json_node_dup_string
-
-
json_node_free
-
-
json_node_get_array
-
-
json_node_get_boolean
-
-
json_node_get_double
-
-
json_node_get_int
-
-
json_node_get_node_type
-
-
json_node_get_object
-
-
json_node_get_parent
-
-
json_node_get_string
-
-
json_node_get_value
-
-
json_node_get_value_type
-
-
JSON_NODE_HOLDS
-
-
JSON_NODE_HOLDS_ARRAY
-
-
JSON_NODE_HOLDS_NULL
-
-
JSON_NODE_HOLDS_OBJECT
-
-
JSON_NODE_HOLDS_VALUE
-
-
json_node_is_null
-
-
json_node_new
-
-
json_node_set_array
-
-
json_node_set_boolean
-
-
json_node_set_double
-
-
json_node_set_int
-
-
json_node_set_object
-
-
json_node_set_parent
-
-
json_node_set_string
-
-
json_node_set_value
-
-
json_node_take_array
-
-
json_node_take_object
-
-
JSON_NODE_TYPE
-
-
json_node_type_name
-
-

O

-
JsonObject
-
-
JsonObjectForeach
-
-
json_object_add_member
-
-
json_object_dup_member
-
-
json_object_foreach_member
-
-
json_object_get_array_member
-
-
json_object_get_boolean_member
-
-
json_object_get_double_member
-
-
json_object_get_int_member
-
-
json_object_get_member
-
-
json_object_get_members
-
-
json_object_get_null_member
-
-
json_object_get_object_member
-
-
json_object_get_size
-
-
json_object_get_string_member
-
-
json_object_get_values
-
-
json_object_has_member
-
-
json_object_new
-
-
json_object_ref
-
-
json_object_remove_member
-
-
json_object_set_array_member
-
-
json_object_set_boolean_member
-
-
json_object_set_double_member
-
-
json_object_set_int_member
-
-
json_object_set_member
-
-
json_object_set_null_member
-
-
json_object_set_object_member
-
-
json_object_set_string_member
-
-
json_object_unref
-
-

P

-
JsonParser
-
-
JsonParser::array-element
-
-
JsonParser::array-end
-
-
JsonParser::array-start
-
-
JsonParser::error
-
-
JsonParser::object-end
-
-
JsonParser::object-member
-
-
JsonParser::object-start
-
-
JsonParser::parse-end
-
-
JsonParser::parse-start
-
-
JsonParserClass
-
-
JsonParserError
-
-
json_parser_get_current_line
-
-
json_parser_get_current_pos
-
-
json_parser_get_root
-
-
json_parser_has_assignment
-
-
json_parser_load_from_data
-
-
json_parser_load_from_file
-
-
json_parser_new
-
-

S

-
JsonSerializableIface
-
-
json_serializable_default_deserialize_property
-
-
json_serializable_default_serialize_property
-
-
json_serializable_deserialize_property
-
-
json_serializable_serialize_property
-
-
json_serialize_gobject
-
-

V

-
JSON_VERSION
-
-
JSON_VERSION_HEX
-
-
JSON_VERSION_S
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ix02.html b/doc/reference/html/ix02.html deleted file mode 100644 index 9ce8457..0000000 --- a/doc/reference/html/ix02.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - -Index of deprecated symbols - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Index of deprecated symbols

-

C

-
json_construct_gobject
-
-

O

-
json_object_add_member
-
-

S

-
json_serialize_gobject
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ix03.html b/doc/reference/html/ix03.html deleted file mode 100644 index 571482f..0000000 --- a/doc/reference/html/ix03.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - -Index of new symbols in 0.4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Index of new symbols in 0.4

-

C

-
json_construct_gobject
-
-

G

-
JsonGenerator:root
-
-

N

-
json_node_get_value_type
-
-

P

-
json_parser_has_assignment
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ix04.html b/doc/reference/html/ix04.html deleted file mode 100644 index 13adead..0000000 --- a/doc/reference/html/ix04.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - -Index of new symbols in 0.6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Index of new symbols in 0.6

-

A

-
json_array_dup_element
-
-

G

-
JsonGenerator:indent-char
-
-

O

-
json_object_dup_member
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/ix05.html b/doc/reference/html/ix05.html deleted file mode 100644 index 989aab2..0000000 --- a/doc/reference/html/ix05.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - -Index of new symbols in 0.8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/reference/html/ix06.html b/doc/reference/html/ix06.html deleted file mode 100644 index 8d5c794..0000000 --- a/doc/reference/html/ix06.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - -Index of new symbols in 0.10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/reference/html/json-advanced.html b/doc/reference/html/json-advanced.html deleted file mode 100644 index 842f9b0..0000000 --- a/doc/reference/html/json-advanced.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - -Part IV. JSON-GLib Advanced API - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Part IV. JSON-GLib Advanced API

-
-

Table of Contents

-
-
-GObject Serialization — Serialize and deserialize GObjects -
-
-Serializable Interface — Interface for serialize and deserialize special GObjects -
-
-Boxed Types Serialization — Serialize and deserialize GBoxed types -
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-base.html b/doc/reference/html/json-base.html deleted file mode 100644 index ccc9ea5..0000000 --- a/doc/reference/html/json-base.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - -Part II. JSON-GLib Reference - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Part II. JSON-GLib Reference

-
-
-

- JSON-GLib provides wrappers around the complex data types defined - by the JSON specification. The fundamental types are handled using - the Generic Value container (GValue) provided by GLib. -

-

- JSON complex data types are either arrays (a n-tuple of items) - or objects (a mapping between a string and a value); arrays and - objects can contain multiple values, including other arrays and - objects. -

-
-

Table of Contents

-
-
Data Types
-
-
-JSON Node — Node in a JSON object model -
-
-JSON Array — a JSON array representation -
-
-JSON Object — a JSON object representation -
-
-
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-Boxed-Types-Serialization.html b/doc/reference/html/json-glib-Boxed-Types-Serialization.html deleted file mode 100644 index 35d7e04..0000000 --- a/doc/reference/html/json-glib-Boxed-Types-Serialization.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - -Boxed Types Serialization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

Boxed Types Serialization

-

Boxed Types Serialization — Serialize and deserialize GBoxed types

-
-
-

Synopsis

-
JsonNode *          (*JsonBoxedSerializeFunc)           (gconstpointer boxed);
-gpointer            (*JsonBoxedDeserializeFunc)         (JsonNode *node);
-void                json_boxed_register_serialize_func  (GType gboxed_type,
-                                                         JsonNodeType node_type,
-                                                         JsonBoxedSerializeFunc serialize_func);
-void                json_boxed_register_deserialize_func
-                                                        (GType gboxed_type,
-                                                         JsonNodeType node_type,
-                                                         JsonBoxedDeserializeFunc deserialize_func);
-
-gboolean            json_boxed_can_serialize            (GType gboxed_type,
-                                                         JsonNodeType *node_type);
-gboolean            json_boxed_can_deserialize          (GType gboxed_type,
-                                                         JsonNodeType node_type);
-JsonNode *          json_boxed_serialize                (GType gboxed_type,
-                                                         gconstpointer boxed);
-gpointer            json_boxed_deserialize              (GType gboxed_type,
-                                                         JsonNode *node);
-
-
-
-

Description

-

-GLib's GBoxed type is a generic wrapper for arbitrary C structures. -

-

-JSON-GLib allows serialization and deserialization of a GBoxed type -by registering functions mapping a JsonNodeType to a specific -GType. -

-

-When registering a GBoxed type you should also register the -corresponding transformation functions, e.g.: -

-

-

-
-  GType
-  my_struct_get_type (void)
-  {
-    static GType boxed_type = 0;
-
-    if (boxed_type == 0)
-      {
-        boxed_type =
-          g_boxed_type_register_static (g_intern_static_string ("MyStruct"),
-                                        (GBoxedCopyFunc) my_struct_copy,
-                                        (GBoxedFreeFunc) my_struct_free);
-
-        json_boxed_register_serialize_func (boxed_type, JSON_NODE_OBJECT,
-                                            my_struct_serialize);
-        json_boxed_register_deserialize_func (boxed_type, JSON_NODE_OBJECT,
-                                              my_struct_deserialize);
-      }
-
-    return boxed_type;
-  }
-
-

-

-

-The serialization function will be invoked by json_boxed_serialize(): -it will be passed a pointer to the C structure and it must return a -JsonNode. The deserialization function will be invoked by -json_boxed_deserialize(): it will be passed a JsonNode for the -declared type and it must return a newly allocated C structure. -

-

-It is possible to check whether a GBoxed type can be deserialized -from a specific JsonNodeType, and whether a GBoxed can be serialized -and to which specific JsonNodeType.

-
-
-

Details

-
-

JsonBoxedSerializeFunc ()

-
JsonNode *          (*JsonBoxedSerializeFunc)           (gconstpointer boxed);
-

-Serializes the passed GBoxed and stores it inside a JsonNode

-
-- - - - - - - - - - -

boxed :

a GBoxed -

Returns :

the newly created JsonNode - -
-

Since 0.10

-
-
-
-

JsonBoxedDeserializeFunc ()

-
gpointer            (*JsonBoxedDeserializeFunc)         (JsonNode *node);
-

-Deserializes the contents of the passed JsonNode into a GBoxed

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the newly created boxed type - -
-

Since 0.10

-
-
-
-

json_boxed_register_serialize_func ()

-
void                json_boxed_register_serialize_func  (GType gboxed_type,
-                                                         JsonNodeType node_type,
-                                                         JsonBoxedSerializeFunc serialize_func);
-

-Registers a serialization function for a GBoxed of type gboxed_type -to a JsonNode of type node_type

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

node_type :

a node type -

serialize_func :

serialization function for boxed_type into - a JsonNode of type node_type -
-

Since 0.10

-
-
-
-

json_boxed_register_deserialize_func ()

-
void                json_boxed_register_deserialize_func
-                                                        (GType gboxed_type,
-                                                         JsonNodeType node_type,
-                                                         JsonBoxedDeserializeFunc deserialize_func);
-

-Registers a deserialization function for a GBoxed of type gboxed_type -from a JsonNode of type node_type

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

node_type :

a node type -

deserialize_func :

deserialization function for boxed_type from - a JsonNode of type node_type -
-

Since 0.10

-
-
-
-

json_boxed_can_serialize ()

-
gboolean            json_boxed_can_serialize            (GType gboxed_type,
-                                                         JsonNodeType *node_type);
-

-Checks whether it is possible to serialize a GBoxed of -type gboxed_type into a JsonNode. The type of the -JsonNode is placed inside node_type if the function -returns TRUE and it's undefined otherwise.

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

node_type :

out. out.

Returns :

TRUE if the type can be serialized, - and FALSE otherwise. - -
-

Since 0.10

-
-
-
-

json_boxed_can_deserialize ()

-
gboolean            json_boxed_can_deserialize          (GType gboxed_type,
-                                                         JsonNodeType node_type);
-

-Checks whether it is possible to deserialize a GBoxed of -type gboxed_type from a JsonNode of type node_type

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

node_type :

a JsonNode type -

Returns :

TRUE if the type can be deserialized, FALSE otherwise - -
-

Since 0.10

-
-
-
-

json_boxed_serialize ()

-
JsonNode *          json_boxed_serialize                (GType gboxed_type,
-                                                         gconstpointer boxed);
-

-Serializes boxed, a pointer to a GBoxed of type gboxed_type, -into a JsonNode

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

boxed :

a pointer to a GBoxed of type gboxed_type -

Returns :

a JsonNode with the serialization of the boxed - type, or NULL if serialization either failed or was not - possible - -
-

Since 0.10

-
-
-
-

json_boxed_deserialize ()

-
gpointer            json_boxed_deserialize              (GType gboxed_type,
-                                                         JsonNode *node);
-

-Deserializes node into a GBoxed of gboxed_type

-
-- - - - - - - - - - - - - - -

gboxed_type :

a boxed type -

node :

a JsonNode -

Returns :

the newly allocated GBoxed. Use g_boxed_free() to - release the resources allocated by this function - -
-

Since 0.10

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-GObject-Serialization.html b/doc/reference/html/json-glib-GObject-Serialization.html deleted file mode 100644 index 8093b2c..0000000 --- a/doc/reference/html/json-glib-GObject-Serialization.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - -GObject Serialization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

GObject Serialization

-

GObject Serialization — Serialize and deserialize GObjects

-
-
-

Synopsis

-
JsonNode *          json_gobject_serialize              (GObject *gobject);
-GObject *           json_gobject_deserialize            (GType gtype,
-                                                         JsonNode *node);
-gchar *             json_gobject_to_data                (GObject *gobject,
-                                                         gsize *length);
-GObject *           json_gobject_from_data              (GType gtype,
-                                                         const gchar *data,
-                                                         gssize length,
-                                                         GError **error);
-
-GObject *           json_construct_gobject              (GType gtype,
-                                                         const gchar *data,
-                                                         gsize length,
-                                                         GError **error);
-gchar *             json_serialize_gobject              (GObject *gobject,
-                                                         gsize *length);
-
-
-
-

Description

-

-JSON-GLib provides API for serializing and deserializing GObjects -to and from JSON data streams. -

-

-Simple GObject classes can be (de)serialized into JSON objects, if the -properties have compatible types with the native JSON types (integers, -booleans, strings, string vectors). If the class to be (de)serialized has -complex data types for properties (like boxed types or other objects) -then the class should implement the provided JsonSerializable interface -and its virtual functions.

-
-
-

Details

-
-

json_gobject_serialize ()

-
JsonNode *          json_gobject_serialize              (GObject *gobject);
-

-Creates a JsonNode representing the passed GObject -instance. Each member of the returned JSON object will -map to a property of the GObject

-
-- - - - - - - - - - -

gobject :

a GObject -

Returns :

transfer full. transfer full.
-

Since 0.10

-
-
-
-

json_gobject_deserialize ()

-
GObject *           json_gobject_deserialize            (GType gtype,
-                                                         JsonNode *node);
-

-Creates a new GObject of type gtype, and constructs it -using the members of the passed JsonObject

-
-- - - - - - - - - - - - - - -

gtype :

the type of the GObject to create -

node :

a JsonNode of type JSON_NODE_OBJECT describing the - instance of type gtype -

Returns :

transfer full. transfer full.
-

Since 0.10

-
-
-
-

json_gobject_to_data ()

-
gchar *             json_gobject_to_data                (GObject *gobject,
-                                                         gsize *length);
-

-Serializes a GObject into a JSON data stream, iterating recursively -over each property. -

-

-If gobject implements the JsonSerializableIface interface, it will -be asked to serialize all its properties; otherwise, the default -implementation will be use to translate the compatible types into -JSON native types.

-
-- - - - - - - - - - - - - - -

gobject :

a GObject -

length :

return value for the length of the buffer, or NULL. out.

Returns :

a JSON data stream representing the passed GObject - -
-

Since 0.10

-
-
-
-

json_gobject_from_data ()

-
GObject *           json_gobject_from_data              (GType gtype,
-                                                         const gchar *data,
-                                                         gssize length,
-                                                         GError **error);
-

-Deserializes a JSON data stream and creates the corresponding -GObject class. If gtype implements the JsonSerializableIface -interface, it will be asked to deserialize all the JSON members -into the respective properties; otherwise, the default implementation -will be used to translate the compatible JSON native types. -

-

-Note: the JSON data stream must be an object declaration.

-
-- - - - - - - - - - - - - - - - - - - - - - -

gtype :

the GType of object to construct -

data :

a JSON data stream -

length :

length of the data stream, or -1 if it is NUL-terminated -

error :

return location for a GError, or NULL -

Returns :

a GObject or NULL - -
-

Since 0.10

-
-
-
-

json_construct_gobject ()

-
GObject *           json_construct_gobject              (GType gtype,
-                                                         const gchar *data,
-                                                         gsize length,
-                                                         GError **error);
-
-

Warning

-

json_construct_gobject has been deprecated since version 0.10 and should not be used in newly-written code. Use json_gobject_from_data() instead

-
-

-Deserializes a JSON data stream and creates the corresponding -GObject class. If gtype implements the JsonSerializableIface -interface, it will be asked to deserialize all the JSON members -into the respective properties; otherwise, the default implementation -will be used to translate the compatible JSON native types. -

-

-Note: the JSON data stream must be an object declaration.

-
-- - - - - - - - - - - - - - - - - - - - - - -

gtype :

the GType of object to construct -

data :

a JSON data stream -

length :

length of the data stream -

error :

return location for a GError, or NULL -

Returns :

a GObject or NULL - -
-

Since 0.4

-
-
-
-

json_serialize_gobject ()

-
gchar *             json_serialize_gobject              (GObject *gobject,
-                                                         gsize *length);
-
-

Warning

-

json_serialize_gobject has been deprecated since version 0.10 and should not be used in newly-written code. Use json_gobject_to_data() instead

-
-

-Serializes a GObject into a JSON data stream. If gobject implements -the JsonSerializableIface interface, it will be asked to serizalize all -its properties; otherwise, the default implementation will be use to -translate the compatible types into JSON native types.

-
-- - - - - - - - - - - - - - -

gobject :

a GObject -

length :

return value for the length of the buffer, or NULL. out.

Returns :

a JSON data stream representing the passed GObject - -
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-JSON-Array.html b/doc/reference/html/json-glib-JSON-Array.html deleted file mode 100644 index ca94411..0000000 --- a/doc/reference/html/json-glib-JSON-Array.html +++ /dev/null @@ -1,858 +0,0 @@ - - - - -JSON Array - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

JSON Array

-

JSON Array — a JSON array representation

-
-
-

Synopsis

-
                    JsonArray;
-JsonArray *         json_array_new                      (void);
-JsonArray *         json_array_sized_new                (guint n_elements);
-JsonArray *         json_array_ref                      (JsonArray *array);
-void                json_array_unref                    (JsonArray *array);
-
-void                json_array_add_element              (JsonArray *array,
-                                                         JsonNode *node);
-JsonNode *          json_array_get_element              (JsonArray *array,
-                                                         guint index_);
-JsonNode *          json_array_dup_element              (JsonArray *array,
-                                                         guint index_);
-GList *             json_array_get_elements             (JsonArray *array);
-guint               json_array_get_length               (JsonArray *array);
-void                json_array_remove_element           (JsonArray *array,
-                                                         guint index_);
-void                (*JsonArrayForeach)                 (JsonArray *array,
-                                                         guint index_,
-                                                         JsonNode *element_node,
-                                                         gpointer user_data);
-void                json_array_foreach_element          (JsonArray *array,
-                                                         JsonArrayForeach func,
-                                                         gpointer data);
-
-void                json_array_add_array_element        (JsonArray *array,
-                                                         JsonArray *value);
-JsonArray *         json_array_get_array_element        (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_boolean_element      (JsonArray *array,
-                                                         gboolean value);
-gboolean            json_array_get_boolean_element      (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_double_element       (JsonArray *array,
-                                                         gdouble value);
-gdouble             json_array_get_double_element       (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_int_element          (JsonArray *array,
-                                                         gint64 value);
-gint64              json_array_get_int_element          (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_null_element         (JsonArray *array);
-gboolean            json_array_get_null_element         (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_object_element       (JsonArray *array,
-                                                         JsonObject *value);
-JsonObject *        json_array_get_object_element       (JsonArray *array,
-                                                         guint index_);
-void                json_array_add_string_element       (JsonArray *array,
-                                                         const gchar *value);
-const gchar *       json_array_get_string_element       (JsonArray *array,
-                                                         guint index_);
-
-
-
-

Description

-

-JsonArray is the representation of the array type inside JSON. It contains -JsonNodes, which may contain fundamental types, other arrays or -objects. -

-

-Since arrays can be expensive, they are reference counted. You can control -the lifetime of a JsonArray using json_array_ref() and json_array_unref(). -

-

-To append an element, use json_array_add_element(). -To extract an element at a given index, use json_array_get_element(). -To retrieve the entire array in list form, use json_array_get_elements(). -To retrieve the length of the array, use json_array_get_length().

-
-
-

Details

-
-

JsonArray

-
typedef struct _JsonArray JsonArray;
-

-A JSON array type. The contents of the JsonArray structure are private -and should only be accessed by the provided API

-
-
-
-

json_array_new ()

-
JsonArray *         json_array_new                      (void);
-

-Creates a new JsonArray.

-
-- - - - -

Returns :

the newly created JsonArray -
-
-
-
-

json_array_sized_new ()

-
JsonArray *         json_array_sized_new                (guint n_elements);
-

-Creates a new JsonArray with n_elements slots already allocated.

-
-- - - - - - - - - - -

n_elements :

number of slots to pre-allocate -

Returns :

the newly created JsonArray -
-
-
-
-

json_array_ref ()

-
JsonArray *         json_array_ref                      (JsonArray *array);
-

-Increase by one the reference count of a JsonArray.

-
-- - - - - - - - - - -

array :

a JsonArray -

Returns :

the passed JsonArray, with the reference count - increased by one. -
-
-
-
-

json_array_unref ()

-
void                json_array_unref                    (JsonArray *array);
-

-Decreases by one the reference count of a JsonArray. If the -reference count reaches zero, the array is destroyed and all -its allocated resources are freed.

-
-- - - - -

array :

a JsonArray -
-
-
-
-

json_array_add_element ()

-
void                json_array_add_element              (JsonArray *array,
-                                                         JsonNode *node);
-

-Appends node inside array. The array will take ownership of the -JsonNode.

-
-- - - - - - - - - - -

array :

a JsonArray -

node :

a JsonNode -
-
-
-
-

json_array_get_element ()

-
JsonNode *          json_array_get_element              (JsonArray *array,
-                                                         guint index_);
-

-Retrieves the JsonNode containing the value of the element at index_ -inside a JsonArray.

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

a pointer to the JsonNode at the requested index -
-
-
-
-

json_array_dup_element ()

-
JsonNode *          json_array_dup_element              (JsonArray *array,
-                                                         guint index_);
-

-Retrieves a copy of the JsonNode containing the value of the -element at index_ inside a JsonArray

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

transfer full. transfer full.
-

Since 0.6

-
-
-
-

json_array_get_elements ()

-
GList *             json_array_get_elements             (JsonArray *array);
-

-Gets the elements of a JsonArray as a list of JsonNodes.

-
-- - - - - - - - - - -

array :

a JsonArray -

Returns :

element-type JsonNode) (transfer container. element-type JsonNode. transfer container JsonNode.
-
-
-
-

json_array_get_length ()

-
guint               json_array_get_length               (JsonArray *array);
-

-Retrieves the length of a JsonArray

-
-- - - - - - - - - - -

array :

a JsonArray -

Returns :

the length of the array -
-
-
-
-

json_array_remove_element ()

-
void                json_array_remove_element           (JsonArray *array,
-                                                         guint index_);
-

-Removes the JsonNode inside array at index_ freeing its allocated -resources.

-
-- - - - - - - - - - -

array :

a JsonArray -

index_ :

the position of the element to be removed -
-
-
-
-

JsonArrayForeach ()

-
void                (*JsonArrayForeach)                 (JsonArray *array,
-                                                         guint index_,
-                                                         JsonNode *element_node,
-                                                         gpointer user_data);
-

-The function to be passed to json_array_foreach_element(). You -should not add or remove elements to and from array within -this function. It is safe to change the value of element_node.

-
-- - - - - - - - - - - - - - - - - - -

array :

the iterated JsonArray -

index_ :

the index of the element -

element_node :

a JsonNode containing the value at index_ -

user_data :

data passed to the function -
-

Since 0.8

-
-
-
-

json_array_foreach_element ()

-
void                json_array_foreach_element          (JsonArray *array,
-                                                         JsonArrayForeach func,
-                                                         gpointer data);
-

-Iterates over all elements of array and calls func on -each one of them. -

-

-It is safe to change the value of a JsonNode of the array -from within the iterator func, but it is not safe to add or -remove elements from the array.

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

func :

the function to be called on each element -

data :

data to be passed to the function. allow-none.
-

Since 0.8

-
-
-
-

json_array_add_array_element ()

-
void                json_array_add_array_element        (JsonArray *array,
-                                                         JsonArray *value);
-

-Conveniently adds an array into array. The array takes ownership -of the newly added JsonArray -

-

-See also: json_array_add_element(), json_node_take_array()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

a JsonArray -
-

Since 0.8

-
-
-
-

json_array_get_array_element ()

-
JsonArray *         json_array_get_array_element        (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the array from the element at index_ -inside array -

-

-See also: json_array_get_element(), json_node_get_array()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the array. transfer none.
-

Since 0.8

-
-
-
-

json_array_add_boolean_element ()

-
void                json_array_add_boolean_element      (JsonArray *array,
-                                                         gboolean value);
-

-Conveniently adds a boolean value into array -

-

-See also: json_array_add_element(), json_node_set_boolean()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

a boolean value -
-

Since 0.8

-
-
-
-

json_array_get_boolean_element ()

-
gboolean            json_array_get_boolean_element      (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the boolean value of the element at index_ -inside array -

-

-See also: json_array_get_element(), json_node_get_boolean()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the integer value - -
-

Since 0.8

-
-
-
-

json_array_add_double_element ()

-
void                json_array_add_double_element       (JsonArray *array,
-                                                         gdouble value);
-

-Conveniently adds a floating point value into array -

-

-See also: json_array_add_element(), json_node_set_double()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

a floating point value -
-

Since 0.8

-
-
-
-

json_array_get_double_element ()

-
gdouble             json_array_get_double_element       (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the floating point value of the element at -index_ inside array -

-

-See also: json_array_get_element(), json_node_get_double()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the floating point value - -
-

Since 0.8

-
-
-
-

json_array_add_int_element ()

-
void                json_array_add_int_element          (JsonArray *array,
-                                                         gint64 value);
-

-Conveniently adds an integer value into array -

-

-See also: json_array_add_element(), json_node_set_int()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

an integer value -
-

Since 0.8

-
-
-
-

json_array_get_int_element ()

-
gint64              json_array_get_int_element          (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the integer value of the element at index_ -inside array -

-

-See also: json_array_get_element(), json_node_get_int()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the integer value - -
-

Since 0.8

-
-
-
-

json_array_add_null_element ()

-
void                json_array_add_null_element         (JsonArray *array);
-

-Conveniently adds a null element into array -

-

-See also: json_array_add_element(), JSON_NODE_NULL

-
-- - - - -

array :

a JsonArray -
-

Since 0.8

-
-
-
-

json_array_get_null_element ()

-
gboolean            json_array_get_null_element         (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves whether the element at index_ is set to null -

-

-See also: json_array_get_element(), JSON_NODE_TYPE(), JSON_NODE_NULL

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

TRUE if the element is null - -
-

Since 0.8

-
-
-
-

json_array_add_object_element ()

-
void                json_array_add_object_element       (JsonArray *array,
-                                                         JsonObject *value);
-

-Conveniently adds an object into array. The array takes ownership -of the newly added JsonObject -

-

-See also: json_array_add_element(), json_node_take_object()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

a JsonObject -
-

Since 0.8

-
-
-
-

json_array_get_object_element ()

-
JsonObject *        json_array_get_object_element       (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the object from the element at index_ -inside array -

-

-See also: json_array_get_element(), json_node_get_object()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the object. transfer none.
-

Since 0.8

-
-
-
-

json_array_add_string_element ()

-
void                json_array_add_string_element       (JsonArray *array,
-                                                         const gchar *value);
-

-Conveniently adds a string value into array -

-

-See also: json_array_add_element(), json_node_set_string()

-
-- - - - - - - - - - -

array :

a JsonArray -

value :

a string value -
-

Since 0.8

-
-
-
-

json_array_get_string_element ()

-
const gchar *       json_array_get_string_element       (JsonArray *array,
-                                                         guint index_);
-

-Conveniently retrieves the string value of the element at index_ -inside array -

-

-See also: json_array_get_element(), json_node_get_string()

-
-- - - - - - - - - - - - - - -

array :

a JsonArray -

index_ :

the index of the element to retrieve -

Returns :

the string value; the returned string is owned by - the JsonArray and should not be modified or freed - -
-

Since 0.8

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-JSON-Node.html b/doc/reference/html/json-glib-JSON-Node.html deleted file mode 100644 index 04f80c3..0000000 --- a/doc/reference/html/json-glib-JSON-Node.html +++ /dev/null @@ -1,930 +0,0 @@ - - - - -JSON Node - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

JSON Node

-

JSON Node — Node in a JSON object model

-
-
-

Synopsis

-
enum                JsonNodeType;
-                    JsonNode;
-#define             JSON_NODE_TYPE                      (node)
-#define             JSON_NODE_HOLDS                     (node,t)
-#define             JSON_NODE_HOLDS_VALUE               (node)
-#define             JSON_NODE_HOLDS_OBJECT              (node)
-#define             JSON_NODE_HOLDS_ARRAY               (node)
-#define             JSON_NODE_HOLDS_NULL                (node)
-JsonNode *          json_node_new                       (JsonNodeType type);
-JsonNode *          json_node_copy                      (JsonNode *node);
-void                json_node_free                      (JsonNode *node);
-
-void                json_node_set_array                 (JsonNode *node,
-                                                         JsonArray *array);
-void                json_node_take_array                (JsonNode *node,
-                                                         JsonArray *array);
-JsonArray *         json_node_get_array                 (JsonNode *node);
-JsonArray *         json_node_dup_array                 (JsonNode *node);
-
-void                json_node_set_object                (JsonNode *node,
-                                                         JsonObject *object);
-void                json_node_take_object               (JsonNode *node,
-                                                         JsonObject *object);
-JsonObject *        json_node_get_object                (JsonNode *node);
-JsonObject *        json_node_dup_object                (JsonNode *node);
-
-void                json_node_set_value                 (JsonNode *node,
-                                                         const GValue *value);
-void                json_node_get_value                 (JsonNode *node,
-                                                         GValue *value);
-void                json_node_set_boolean               (JsonNode *node,
-                                                         gboolean value);
-gboolean            json_node_get_boolean               (JsonNode *node);
-void                json_node_set_double                (JsonNode *node,
-                                                         gdouble value);
-gdouble             json_node_get_double                (JsonNode *node);
-void                json_node_set_int                   (JsonNode *node,
-                                                         gint64 value);
-gint64              json_node_get_int                   (JsonNode *node);
-void                json_node_set_string                (JsonNode *node,
-                                                         const gchar *value);
-const gchar *       json_node_get_string                (JsonNode *node);
-gchar *             json_node_dup_string                (JsonNode *node);
-
-void                json_node_set_parent                (JsonNode *node,
-                                                         JsonNode *parent);
-JsonNode *          json_node_get_parent                (JsonNode *node);
-const gchar *       json_node_type_name                 (JsonNode *node);
-GType               json_node_get_value_type            (JsonNode *node);
-JsonNodeType        json_node_get_node_type             (JsonNode *node);
-gboolean            json_node_is_null                   (JsonNode *node);
-
-
-
-

Description

-

-A JsonNode is a generic container of elements inside a JSON stream. -It can contain fundamental types (integers, booleans, floating point -numbers, strings) and complex types (arrays and objects). -

-

-When parsing a JSON data stream you extract the root node and walk -the node tree by retrieving the type of data contained inside the -node with the JSON_NODE_TYPE macro. If the node contains a fundamental -type you can retrieve a copy of the GValue holding it with the -json_node_get_value() function, and then use the GValue API to extract -the data; if the node contains a complex type you can retrieve the -JsonObject or the JsonArray using json_node_get_object() or -json_node_get_array() respectively, and then retrieve the nodes -they contain.

-
-
-

Details

-
-

enum JsonNodeType

-
typedef enum {
-  JSON_NODE_OBJECT,
-  JSON_NODE_ARRAY,
-  JSON_NODE_VALUE,
-  JSON_NODE_NULL
-} JsonNodeType;
-
-

-Indicates the content of a JsonNode.

-
-- - - - - - - - - - - - - - - - - - -

JSON_NODE_OBJECT

The node contains a JsonObject -

JSON_NODE_ARRAY

The node contains a JsonArray -

JSON_NODE_VALUE

The node contains a fundamental type -

JSON_NODE_NULL

Special type, for nodes containing null -
-
-
-
-

JsonNode

-
typedef struct _JsonNode JsonNode;
-

-A generic container of JSON data types. The contents of the JsonNode -structure are private and should only be accessed via the provided -functions and never directly.

-
-- -
-
-
-
-

JSON_NODE_TYPE()

-
#define JSON_NODE_TYPE(node)    (json_node_get_node_type ((node)))
-
-

-Evaluates to the JsonNodeType contained by node

-
-- - - - -

node :

a JsonNode -
-
-
-
-

JSON_NODE_HOLDS()

-
#define JSON_NODE_HOLDS(node,t)         (json_node_get_node_type ((node)) == (t))
-
-

-Evaluates to TRUE if the node holds type t

-
-- - - - - - - - - - -

node :

a JsonNode -

t :

a JsonNodeType -
-

Since 0.10

-
-
-
-

JSON_NODE_HOLDS_VALUE()

-
#define JSON_NODE_HOLDS_VALUE(node)     (JSON_NODE_HOLDS ((node), JSON_NODE_VALUE))
-
-

-Evaluates to TRUE if node holds a JSON_NODE_VALUE

-
-- - - - -

node :

a JsonNode -
-

Since 0.10

-
-
-
-

JSON_NODE_HOLDS_OBJECT()

-
#define JSON_NODE_HOLDS_OBJECT(node)    (JSON_NODE_HOLDS ((node), JSON_NODE_OBJECT))
-
-

-Evaluates to TRUE if node holds a JSON_NODE_OBJECT

-
-- - - - -

node :

a JsonNode -
-

Since 0.10

-
-
-
-

JSON_NODE_HOLDS_ARRAY()

-
#define JSON_NODE_HOLDS_ARRAY(node)     (JSON_NODE_HOLDS ((node), JSON_NODE_ARRAY))
-
-

-Evaluates to TRUE if node holds a JSON_NODE_ARRAY

-
-- - - - -

node :

a JsonNode -
-

Since 0.10

-
-
-
-

JSON_NODE_HOLDS_NULL()

-
#define JSON_NODE_HOLDS_NULL(node)      (JSON_NODE_HOLDS ((node), JSON_NODE_NULL))
-
-

-Evaluates to TRUE if node holds a JSON_NODE_NULL

-
-- - - - -

node :

a JsonNode -
-

Since 0.10

-
-
-
-

json_node_new ()

-
JsonNode *          json_node_new                       (JsonNodeType type);
-

-Creates a new JsonNode of type.

-
-- - - - - - - - - - -

type :

a JsonNodeType -

Returns :

the newly created JsonNode -
-
-
-
-

json_node_copy ()

-
JsonNode *          json_node_copy                      (JsonNode *node);
-

-Copies node. If the node contains complex data types then the reference -count of the objects is increased.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the copied JsonNode. transfer full.
-
-
-
-

json_node_free ()

-
void                json_node_free                      (JsonNode *node);
-

-Frees the resources allocated by node.

-
-- - - - -

node :

a JsonNode -
-
-
-
-

json_node_set_array ()

-
void                json_node_set_array                 (JsonNode *node,
-                                                         JsonArray *array);
-

-Sets array inside node and increases the JsonArray reference count

-
-- - - - - - - - - - -

node :

a JsonNode -

array :

a JsonArray -
-
-
-
-

json_node_take_array ()

-
void                json_node_take_array                (JsonNode *node,
-                                                         JsonArray *array);
-

-Sets array into node without increasing the JsonArray reference count.

-
-- - - - - - - - - - -

node :

a JsonNode -

array :

a JsonArray -
-
-
-
-

json_node_get_array ()

-
JsonArray *         json_node_get_array                 (JsonNode *node);
-

-Retrieves the JsonArray stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the JsonArray. transfer none.
-
-
-
-

json_node_dup_array ()

-
JsonArray *         json_node_dup_array                 (JsonNode *node);
-

-Retrieves the JsonArray stored inside a JsonNode and returns it -with its reference count increased by one.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

transfer full. transfer full.
-
-
-
-

json_node_set_object ()

-
void                json_node_set_object                (JsonNode *node,
-                                                         JsonObject *object);
-

-Sets objects inside node. The reference count of object is increased.

-
-- - - - - - - - - - -

node :

a JsonNode -

object :

a JsonObject -
-
-
-
-

json_node_take_object ()

-
void                json_node_take_object               (JsonNode *node,
-                                                         JsonObject *object);
-

-Sets object inside node. The reference count of object is not increased.

-
-- - - - - - - - - - -

node :

a JsonNode -

object :

a JsonObject -
-
-
-
-

json_node_get_object ()

-
JsonObject *        json_node_get_object                (JsonNode *node);
-

-Retrieves the JsonObject stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the JsonObject. transfer none.
-
-
-
-

json_node_dup_object ()

-
JsonObject *        json_node_dup_object                (JsonNode *node);
-

-Retrieves the JsonObject inside node. The reference count of -the returned object is increased.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the JsonObject. transfer full.
-
-
-
-

json_node_set_value ()

-
void                json_node_set_value                 (JsonNode *node,
-                                                         const GValue *value);
-

-Sets value inside node. The passed GValue is copied into the JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode -

value :

the GValue to set -
-
-
-
-

json_node_get_value ()

-
void                json_node_get_value                 (JsonNode *node,
-                                                         GValue *value);
-

-Retrieves a value from a JsonNode and copies into value. When done -using it, call g_value_unset() on the GValue.

-
-- - - - - - - - - - -

node :

a JsonNode -

value :

return location for an uninitialized value -
-
-
-
-

json_node_set_boolean ()

-
void                json_node_set_boolean               (JsonNode *node,
-                                                         gboolean value);
-

-Sets value as the boolean content of the node, replacing any existing -content.

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

value :

a boolean value -
-
-
-
-

json_node_get_boolean ()

-
gboolean            json_node_get_boolean               (JsonNode *node);
-

-Gets the boolean value stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

Returns :

a boolean value. -
-
-
-
-

json_node_set_double ()

-
void                json_node_set_double                (JsonNode *node,
-                                                         gdouble value);
-

-Sets value as the double content of the node, replacing any existing -content.

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

value :

a double value -
-
-
-
-

json_node_get_double ()

-
gdouble             json_node_get_double                (JsonNode *node);
-

-Gets the double value stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

Returns :

a double value. -
-
-
-
-

json_node_set_int ()

-
void                json_node_set_int                   (JsonNode *node,
-                                                         gint64 value);
-

-Sets value as the integer content of the node, replacing any existing -content.

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

value :

an integer value -
-
-
-
-

json_node_get_int ()

-
gint64              json_node_get_int                   (JsonNode *node);
-

-Gets the integer value stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

Returns :

an integer value. -
-
-
-
-

json_node_set_string ()

-
void                json_node_set_string                (JsonNode *node,
-                                                         const gchar *value);
-

-Sets value as the string content of the node, replacing any existing -content.

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

value :

a string value -
-
-
-
-

json_node_get_string ()

-
const gchar *       json_node_get_string                (JsonNode *node);
-

-Gets the string value stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

Returns :

a string value. -
-
-
-
-

json_node_dup_string ()

-
gchar *             json_node_dup_string                (JsonNode *node);
-

-Gets a copy of the string value stored inside a JsonNode

-
-- - - - - - - - - - -

node :

a JsonNode of type JSON_NODE_VALUE -

Returns :

transfer full. transfer full.
-
-
-
-

json_node_set_parent ()

-
void                json_node_set_parent                (JsonNode *node,
-                                                         JsonNode *parent);
-

-Sets the parent JsonNode of node

-
-- - - - - - - - - - -

node :

a JsonNode -

parent :

the parent JsonNode of node -
-

Since 0.8

-
-
-
-

json_node_get_parent ()

-
JsonNode *          json_node_get_parent                (JsonNode *node);
-

-Retrieves the parent JsonNode of node.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the parent node, or NULL if node is the root node -
-
-
-
-

json_node_type_name ()

-
const gchar *       json_node_type_name                 (JsonNode *node);
-

-Retrieves the user readable name of the data type contained by node.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

a string containing the name of the type. The returned string - is owned by the node and should never be modified or freed -
-
-
-
-

json_node_get_value_type ()

-
GType               json_node_get_value_type            (JsonNode *node);
-

-Returns the GType of the payload of the node.

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

a GType for the payload. - -
-

Since 0.4

-
-
-
-

json_node_get_node_type ()

-
JsonNodeType        json_node_get_node_type             (JsonNode *node);
-

-Retrieves the JsonNodeType of node

-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

the type of the node - -
-

Since 0.8

-
-
-
-

json_node_is_null ()

-
gboolean            json_node_is_null                   (JsonNode *node);
-

-Checks whether node is a JSON_NODE_NULL -

-

-

-
-

Note

A null node is not the same as a NULLJsonNode -
-
-- - - - - - - - - - -

node :

a JsonNode -

Returns :

TRUE if the node is null - -
-

Since 0.8

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-JSON-Object.html b/doc/reference/html/json-glib-JSON-Object.html deleted file mode 100644 index 2a943eb..0000000 --- a/doc/reference/html/json-glib-JSON-Object.html +++ /dev/null @@ -1,1008 +0,0 @@ - - - - -JSON Object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

JSON Object

-

JSON Object — a JSON object representation

-
-
-

Synopsis

-
                    JsonObject;
-JsonObject *        json_object_new                     (void);
-JsonObject *        json_object_ref                     (JsonObject *object);
-void                json_object_unref                   (JsonObject *object);
-
-void                json_object_add_member              (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *node);
-void                json_object_set_member              (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *node);
-gboolean            json_object_has_member              (JsonObject *object,
-                                                         const gchar *member_name);
-JsonNode *          json_object_get_member              (JsonObject *object,
-                                                         const gchar *member_name);
-JsonNode *          json_object_dup_member              (JsonObject *object,
-                                                         const gchar *member_name);
-GList *             json_object_get_members             (JsonObject *object);
-GList *             json_object_get_values              (JsonObject *object);
-guint               json_object_get_size                (JsonObject *object);
-void                json_object_remove_member           (JsonObject *object,
-                                                         const gchar *member_name);
-void                (*JsonObjectForeach)                (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *member_node,
-                                                         gpointer user_data);
-void                json_object_foreach_member          (JsonObject *object,
-                                                         JsonObjectForeach func,
-                                                         gpointer data);
-
-void                json_object_set_array_member        (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonArray *value);
-JsonArray *         json_object_get_array_member        (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_boolean_member      (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gboolean value);
-gboolean            json_object_get_boolean_member      (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_double_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gdouble value);
-gdouble             json_object_get_double_member       (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_int_member          (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gint64 value);
-gint64              json_object_get_int_member          (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_null_member         (JsonObject *object,
-                                                         const gchar *member_name);
-gboolean            json_object_get_null_member         (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_object_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonObject *value);
-JsonObject *        json_object_get_object_member       (JsonObject *object,
-                                                         const gchar *member_name);
-void                json_object_set_string_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         const gchar *value);
-const gchar *       json_object_get_string_member       (JsonObject *object,
-                                                         const gchar *member_name);
-
-
-
-

Description

-

-JsonArray is the representation of the object type inside JSON. It contains -JsonNodes, which may contain fundamental types, arrays or other -objects. Each member of an object is accessed using its name. -

-

-Since objects can be expensive, they are reference counted. You can control -the lifetime of a JsonObject using json_object_ref() and json_object_unref(). -

-

-To add or overwrite a member with a given name, use json_object_set_member(). -To extract a member with a given name, use json_object_get_member(). -To retrieve the list of members, use json_object_get_members(). -To retrieve the size of the object (that is, the number of members it has), -use json_object_get_size().

-
-
-

Details

-
-

JsonObject

-
typedef struct _JsonObject JsonObject;
-

-A JSON object type. The contents of the JsonObject structure are private -and should only be accessed by the provided API

-
-
-
-

json_object_new ()

-
JsonObject *        json_object_new                     (void);
-

-Creates a new JsonObject, an JSON object type representation.

-
-- - - - -

Returns :

the newly created JsonObject -
-
-
-
-

json_object_ref ()

-
JsonObject *        json_object_ref                     (JsonObject *object);
-

-Increase by one the reference count of a JsonObject.

-
-- - - - - - - - - - -

object :

a JsonObject -

Returns :

the passed JsonObject, with the reference count - increased by one. -
-
-
-
-

json_object_unref ()

-
void                json_object_unref                   (JsonObject *object);
-

-Decreases by one the reference count of a JsonObject. If the -reference count reaches zero, the object is destroyed and all -its allocated resources are freed.

-
-- - - - -

object :

a JsonObject -
-
-
-
-

json_object_add_member ()

-
void                json_object_add_member              (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *node);
-
-

Warning

-

json_object_add_member has been deprecated since version 0.8 and should not be used in newly-written code. Use json_object_set_member() instead

-
-

-Adds a member named member_name and containing node into a JsonObject. -The object will take ownership of the JsonNode. -

-

-This function will return if the object already contains a member -member_name.

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

node :

the value of the member -
-
-
-
-

json_object_set_member ()

-
void                json_object_set_member              (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *node);
-

-Sets node as the value of member_name inside object. -

-

-If object already contains a member called member_name then -the member's current value is overwritten. Otherwise, a new -member is added to object.

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

node :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_has_member ()

-
gboolean            json_object_has_member              (JsonObject *object,
-                                                         const gchar *member_name);
-

-Checks whether object has a member named member_name.

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of a JSON object member -

Returns :

TRUE if the JSON object has the requested member -
-
-
-
-

json_object_get_member ()

-
JsonNode *          json_object_get_member              (JsonObject *object,
-                                                         const gchar *member_name);
-

-Retrieves the JsonNode containing the value of member_name inside -a JsonObject.

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the JSON object member to access -

Returns :

a pointer to the node for the requested object - member, or NULL -
-
-
-
-

json_object_dup_member ()

-
JsonNode *          json_object_dup_member              (JsonObject *object,
-                                                         const gchar *member_name);
-

-Retrieves a copy of the JsonNode containing the value of member_name -inside a JsonObject

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the JSON object member to access -

Returns :

(transfer full) a copy of the node for the requested - object member or NULL. Use json_node_free() when done. - -
-

Since 0.6

-
-
-
-

json_object_get_members ()

-
GList *             json_object_get_members             (JsonObject *object);
-

-Retrieves all the names of the members of a JsonObject. You can -obtain the value for each member using json_object_get_member().

-
-- - - - - - - - - - -

object :

a JsonObject -

Returns :

element-type utf8) (transfer container. element-type utf8. transfer container utf8.
-
-
-
-

json_object_get_values ()

-
GList *             json_object_get_values              (JsonObject *object);
-

-Retrieves all the values of the members of a JsonObject.

-
-- - - - - - - - - - -

object :

a JsonObject -

Returns :

element-type JsonNode) (transfer container. element-type JsonNode. transfer container JsonNode.
-
-
-
-

json_object_get_size ()

-
guint               json_object_get_size                (JsonObject *object);
-

-Retrieves the number of members of a JsonObject.

-
-- - - - - - - - - - -

object :

a JsonObject -

Returns :

the number of members -
-
-
-
-

json_object_remove_member ()

-
void                json_object_remove_member           (JsonObject *object,
-                                                         const gchar *member_name);
-

-Removes member_name from object, freeing its allocated resources.

-
-- - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member to remove -
-
-
-
-

JsonObjectForeach ()

-
void                (*JsonObjectForeach)                (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonNode *member_node,
-                                                         gpointer user_data);
-

-The function to be passed to json_object_foreach_member(). You -should not add or remove members to and from object within -this function. It is safe to change the value of member_node.

-
-- - - - - - - - - - - - - - - - - - -

object :

the iterated JsonObject -

member_name :

the name of the member -

member_node :

a JsonNode containing the member_name value -

user_data :

data passed to the function -
-

Since 0.8

-
-
-
-

json_object_foreach_member ()

-
void                json_object_foreach_member          (JsonObject *object,
-                                                         JsonObjectForeach func,
-                                                         gpointer data);
-

-Iterates over all members of object and calls func on -each one of them. -

-

-It is safe to change the value of a JsonNode of the object -from within the iterator func, but it is not safe to add or -remove members from the object.

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

func :

the function to be called on each member -

data :

data to be passed to the function -
-

Since 0.8

-
-
-
-

json_object_set_array_member ()

-
void                json_object_set_array_member        (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonArray *value);
-

-Convenience function for setting an array value of -member_name inside object. -

-

-The object will take ownership of the passed JsonArray -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_array_member ()

-
JsonArray *         json_object_get_array_member        (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the array -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the array inside the object's member. transfer none.
-

Since 0.8

-
-
-
-

json_object_set_boolean_member ()

-
void                json_object_set_boolean_member      (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gboolean value);
-

-Convenience function for setting a boolean value of -member_name inside object. -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_boolean_member ()

-
gboolean            json_object_get_boolean_member      (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the boolean value -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the boolean value of the object's member - -
-

Since 0.8

-
-
-
-

json_object_set_double_member ()

-
void                json_object_set_double_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gdouble value);
-

-Convenience function for setting a floating point value -of member_name inside object. -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_double_member ()

-
gdouble             json_object_get_double_member       (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the floating point value -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the floating point value of the object's member - -
-

Since 0.8

-
-
-
-

json_object_set_int_member ()

-
void                json_object_set_int_member          (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         gint64 value);
-

-Convenience function for setting an integer value of -member_name inside object. -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_int_member ()

-
gint64              json_object_get_int_member          (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the integer value -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the integer value of the object's member - -
-

Since 0.8

-
-
-
-

json_object_set_null_member ()

-
void                json_object_set_null_member         (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function for setting a null value of -member_name inside object. -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -
-

Since 0.8

-
-
-
-

json_object_get_null_member ()

-
gboolean            json_object_get_null_member         (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that checks whether the value -stored in member_name of object is null -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

TRUE if the value is null - -
-

Since 0.8

-
-
-
-

json_object_set_object_member ()

-
void                json_object_set_object_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         JsonObject *value);
-

-Convenience function for setting an object value of -member_name inside object. -

-

-The object will take ownership of the passed JsonObject -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_object_member ()

-
JsonObject *        json_object_get_object_member       (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the object -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the object inside the object's member. transfer none.
-

Since 0.8

-
-
-
-

json_object_set_string_member ()

-
void                json_object_set_string_member       (JsonObject *object,
-                                                         const gchar *member_name,
-                                                         const gchar *value);
-

-Convenience function for setting a string value of -member_name inside object. -

-

-See also: json_object_set_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

value :

the value of the member -
-

Since 0.8

-
-
-
-

json_object_get_string_member ()

-
const gchar *       json_object_get_string_member       (JsonObject *object,
-                                                         const gchar *member_name);
-

-Convenience function that retrieves the string value -stored in member_name of object -

-

-See also: json_object_get_member()

-
-- - - - - - - - - - - - - - -

object :

a JsonObject -

member_name :

the name of the member -

Returns :

the string value of the object's member - -
-

Since 0.8

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-Serializable-Interface.html b/doc/reference/html/json-glib-Serializable-Interface.html deleted file mode 100644 index 4d408b9..0000000 --- a/doc/reference/html/json-glib-Serializable-Interface.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - -Serializable Interface - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

Serializable Interface

-

Serializable Interface — Interface for serialize and deserialize special GObjects

-
-
-

Synopsis

-
                    JsonSerializableIface;
-JsonNode *          json_serializable_serialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         const GValue *value,
-                                                         GParamSpec *pspec);
-gboolean            json_serializable_deserialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         GValue *value,
-                                                         GParamSpec *pspec,
-                                                         JsonNode *property_node);
-
-JsonNode *          json_serializable_default_serialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         const GValue *value,
-                                                         GParamSpec *pspec);
-gboolean            json_serializable_default_deserialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         GValue *value,
-                                                         GParamSpec *pspec,
-                                                         JsonNode *property_node);
-
-
-
-

Description

-

-JsonSerializable is an interface for GObject classes that -allows controlling how the class is going to be serialized -or deserialized by json_construct_gobject() and -json_serialize_gobject() respectively.

-
-
-

Details

-
-

JsonSerializableIface

-
typedef struct {
-  JsonNode *(* serialize_property)   (JsonSerializable *serializable,
-                                      const gchar      *property_name,
-                                      const GValue     *value,
-                                      GParamSpec       *pspec);
-  gboolean  (* deserialize_property) (JsonSerializable *serializable,
-                                      const gchar      *property_name,
-                                      GValue           *value,
-                                      GParamSpec       *pspec,
-                                      JsonNode         *property_node);
-} JsonSerializableIface;
-
-

-Interface that allows serializing and deserializing GObjects -with properties storing complex data types. The json_serialize_gobject() -function will check if the passed GObject implements this interface, -so it can also be used to override the default property serialization -sequence.

-
-- - - - - - - - - - -

serialize_property ()

virtual function for serializing a GObject property - into a JsonNode -

deserialize_property ()

virtual function for deserializing a JsonNode - into a GObject property -
-
-
-
-

json_serializable_serialize_property ()

-
JsonNode *          json_serializable_serialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         const GValue *value,
-                                                         GParamSpec *pspec);
-

-Asks a JsonSerializable implementation to serialize a GObject -property into a JsonNode object.

-
-- - - - - - - - - - - - - - - - - - - - - - -

serializable :

a JsonSerializable object -

property_name :

the name of the property -

value :

the value of the property -

pspec :

a GParamSpec -

Returns :

a JsonNode containing the serialized property -
-
-
-
-

json_serializable_deserialize_property ()

-
gboolean            json_serializable_deserialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         GValue *value,
-                                                         GParamSpec *pspec,
-                                                         JsonNode *property_node);
-

-Asks a JsonSerializable implementation to deserialize the -property contained inside property_node into value.

-
-- - - - - - - - - - - - - - - - - - - - - - - - - - -

serializable :

a JsonSerializable -

property_name :

the name of the property -

value :

a pointer to an uninitialized GValue -

pspec :

a GParamSpec -

property_node :

a JsonNode containing the serialized property -

Returns :

TRUE if the property was successfully deserialized. -
-
-
-
-

json_serializable_default_serialize_property ()

-
JsonNode *          json_serializable_default_serialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         const GValue *value,
-                                                         GParamSpec *pspec);
-

-Calls the default implementation of the JsonSerializable -serialize_property() virtual function -

-

-This function can be used inside a custom implementation -of the serialize_property() virtual function in lieu of: -

-

-

-
-  JsonSerializable *iface;
-  JsonNode *node;
-
-  iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE);
-  node = iface->serialize_property (serializable, property_name,
-                                    value,
-                                    pspec);
-
-
-- - - - - - - - - - - - - - - - - - - - - - -

serializable :

a JsonSerializable object -

property_name :

the name of the property -

value :

the value of the property -

pspec :

a GParamSpec -

Returns :

transfer full. transfer full.
-

Since 0.10

-
-
-
-

json_serializable_default_deserialize_property ()

-
gboolean            json_serializable_default_deserialize_property
-                                                        (JsonSerializable *serializable,
-                                                         const gchar *property_name,
-                                                         GValue *value,
-                                                         GParamSpec *pspec,
-                                                         JsonNode *property_node);
-

-Calls the default implementation of the JsonSerializable -deserialize_property() virtual function -

-

-This function can be used inside a custom implementation -of the deserialize_property() virtual function in lieu of: -

-

-

-
-  JsonSerializable *iface;
-  gboolean res;
-
-  iface = g_type_default_interface_peek (JSON_TYPE_SERIALIZABLE);
-  res = iface->deserialize_property (serializable, property_name,
-                                     value,
-                                     pspec,
-                                     property_node);
-
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - -

serializable :

a JsonSerializable -

property_name :

the name of the property -

value :

a pointer to an uninitialized GValue -

pspec :

a GParamSpec -

property_node :

a JsonNode containing the serialized property -

Returns :

TRUE if the property was successfully deserialized. - -
-

Since 0.10

-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib-Versioning-information.html b/doc/reference/html/json-glib-Versioning-information.html deleted file mode 100644 index 5108623..0000000 --- a/doc/reference/html/json-glib-Versioning-information.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - -Versioning information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-

Versioning information

-

Versioning information — JSON-GLib version checking

-
-
-

Synopsis

-
#define             JSON_MAJOR_VERSION
-#define             JSON_MINOR_VERSION
-#define             JSON_MICRO_VERSION
-
-#define             JSON_VERSION
-#define             JSON_VERSION_S
-#define             JSON_VERSION_HEX
-
-#define             JSON_CHECK_VERSION                  (major,minor,micro)
-
-
-
-

Description

-

-JSON-GLib provides macros to check the version of the library -at compile-time

-
-
-

Details

-
-

JSON_MAJOR_VERSION

-
#define JSON_MAJOR_VERSION              (0)
-
-

-Json major version component (e.g. 1 if JSON_VERSION is 1.2.3)

-
-
-
-

JSON_MINOR_VERSION

-
#define JSON_MINOR_VERSION              (10)
-
-

-Json minor version component (e.g. 2 if JSON_VERSION is 1.2.3)

-
-
-
-

JSON_MICRO_VERSION

-
#define JSON_MICRO_VERSION              (4)
-
-

-Json micro version component (e.g. 3 if JSON_VERSION is 1.2.3)

-
-
-
-

JSON_VERSION

-
#define JSON_VERSION                    (0.10.4)
-
-

-Json version.

-
-
-
-

JSON_VERSION_S

-
#define JSON_VERSION_S                  "0.10.4"
-
-

-Json version, encoded as a string, useful for printing and -concatenation.

-
-
-
-

JSON_VERSION_HEX

-
#define             JSON_VERSION_HEX
-

-Json version, encoded as an hexadecimal number, useful for -integer comparisons.

-
-
-
-

JSON_CHECK_VERSION()

-
#define             JSON_CHECK_VERSION(major,minor,micro)
-

-Compile-time version checking. Evaluates to TRUE if the version -of Json is greater than the required one.

-
-- - - - - - - - - - - - - - -

major :

required major version -

minor :

required minor version -

micro :

required micro version -
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-glib.devhelp b/doc/reference/html/json-glib.devhelp deleted file mode 100644 index 95e1ad7..0000000 --- a/doc/reference/html/json-glib.devhelp +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/reference/html/json-glib.devhelp2 b/doc/reference/html/json-glib.devhelp2 deleted file mode 100644 index 6f2d4fc..0000000 --- a/doc/reference/html/json-glib.devhelp2 +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/reference/html/json-glib.html b/doc/reference/html/json-glib.html deleted file mode 100644 index e3ecb39..0000000 --- a/doc/reference/html/json-glib.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - -Part I. JSON-GLib Overview - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Part I. JSON-GLib Overview

-
-
-

- JSON-GLib is a library aimed at providing an API for efficient parsing - and writing of JSON (JavaScript Object Notation) streams, using GLib's - data types and API. -

-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-streams.html b/doc/reference/html/json-streams.html deleted file mode 100644 index b6cdcba..0000000 --- a/doc/reference/html/json-streams.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - -Part III. Reading and writing - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Part III. Reading and writing

-
-
-

- JSON-GLib provides a parser object to read any valid JSON data - stream and build the data object model in memory. -

-
-

Table of Contents

-
-
Parser
-
-JsonParser — Parse JSON data streams -
-
Generator
-
-JsonGenerator — Generates JSON data streams -
-
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/json-tools.html b/doc/reference/html/json-tools.html deleted file mode 100644 index 817481f..0000000 --- a/doc/reference/html/json-tools.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - -Part V. JSON-GLib Additional Reference - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Part V. JSON-GLib Additional Reference

-
-

Table of Contents

-
-
-Versioning information — JSON-GLib version checking -
-
Object Hierarchy
-
-
-
- - - \ No newline at end of file diff --git a/doc/reference/html/left.png b/doc/reference/html/left.png deleted file mode 100644 index 2d05b3d..0000000 Binary files a/doc/reference/html/left.png and /dev/null differ diff --git a/doc/reference/html/license.html b/doc/reference/html/license.html deleted file mode 100644 index 7ac7338..0000000 --- a/doc/reference/html/license.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - -Appendix A. License - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

-Appendix A. License

-

- This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General - Public License as published by the Free Software - Foundation; either version 2 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 Library General Public License for - more details. -

-

- You may obtain a copy of the GNU Library General - Public License from the Free Software Foundation by - visiting their Web - site or by writing to: - -

-


-        Free Software Foundation, Inc.
-        59 Temple Place - Suite 330
-        Boston, MA 02111-1307
-        USA
-      

-

-

-
- - - \ No newline at end of file diff --git a/doc/reference/html/right.png b/doc/reference/html/right.png deleted file mode 100644 index 92832e3..0000000 Binary files a/doc/reference/html/right.png and /dev/null differ diff --git a/doc/reference/html/style.css b/doc/reference/html/style.css deleted file mode 100644 index e31596b..0000000 --- a/doc/reference/html/style.css +++ /dev/null @@ -1,257 +0,0 @@ -.synopsis, .classsynopsis -{ - /* tango:aluminium 1/2 */ - background: #eeeeec; - border: solid 1px #d3d7cf; - padding: 0.5em; -} -.programlisting -{ - /* tango:sky blue 0/1 */ - background: #e6f3ff; - border: solid 1px #729fcf; - padding: 0.5em; -} -.variablelist -{ - padding: 4px; - margin-left: 3em; -} -.variablelist td:first-child -{ - vertical-align: top; -} - -@media screen { - sup a.footnote - { - position: relative; - top: 0em ! important; - - } - /* this is needed so that the local anchors are displayed below the naviagtion */ - div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] - { - position: relative; - padding-top:4.5em; - } - /* this seems to be a bug in the xsl style sheets when generating indexes */ - div.index div.index - { - top: 0em; - } - /* make space for the fixed navigation bar and add space at the bottom so that - * link targets appear somewhat close to top - */ - body - { - padding-top: 3.2em; - padding-bottom: 20em; - } - /* style and size the navigation bar */ - table.navigation#top - { - position: fixed; - /* tango:scarlet red 0/1 */ - background: #ffe6e6; - border: solid 1px #ef2929; - margin-top: 0; - margin-bottom: 0; - top: 0; - left: 0; - height: 3em; - z-index: 10; - } - .navigation a, .navigation a:visited - { - /* tango:scarlet red 3 */ - color: #a40000; - } - .navigation a:hover - { - /* tango:scarlet red 1 */ - color: #ef2929; - } - td.shortcuts - { - /* tango:scarlet red 1 */ - color: #ef2929; - font-size: 80%; - white-space: nowrap; - } -} -@media print { - table.navigation { - visibility: collapse; - display: none; - } - div.titlepage table.navigation { - visibility: visible; - display: table; - /* tango:scarlet red 0/1 */ - background: #ffe6e6; - border: solid 1px #ef2929; - margin-top: 0; - margin-bottom: 0; - top: 0; - left: 0; - height: 3em; - } -} - -.navigation .title -{ - font-size: 200%; -} - -div.gallery-float -{ - float: left; - padding: 10px; -} -div.gallery-float img -{ - border-style: none; -} -div.gallery-spacer -{ - clear: both; -} - -a, a:visited -{ - text-decoration: none; - /* tango:sky blue 2 */ - color: #3465a4; -} -a:hover -{ - text-decoration: underline; - /* tango:sky blue 1 */ - color: #729fcf; -} - -div.table table -{ - border-collapse: collapse; - border-spacing: 0px; - /* tango:aluminium 3 */ - border: solid 1px #babdb6; -} - -div.table table td, div.table table th -{ - /* tango:aluminium 3 */ - border: solid 1px #babdb6; - padding: 3px; - vertical-align: top; -} - -div.table table th -{ - /* tango:aluminium 2 */ - background-color: #d3d7cf; -} - -hr -{ - /* tango:aluminium 3 */ - color: #babdb6; - background: #babdb6; - border: none 0px; - height: 1px; - clear: both; -} - -.footer -{ - padding-top: 3.5em; - /* tango:aluminium 3 */ - color: #babdb6; - text-align: center; - font-size: 80%; -} - -.warning -{ - /* tango:orange 0/1 */ - background: #ffeed9; - border-color: #ffb04f; -} -.note -{ - /* tango:chameleon 0/0.5 */ - background: #d8ffb2; - border-color: #abf562; -} -.note, .warning -{ - padding: 0.5em; - border-width: 1px; - border-style: solid; -} -.note h3, .warning h3 -{ - margin-top: 0.0em -} -.note p, .warning p -{ - margin-bottom: 0.0em -} - -/* blob links */ -h2 .extralinks, h3 .extralinks -{ - float: right; - /* tango:aluminium 3 */ - color: #babdb6; - font-size: 80%; - font-weight: normal; -} - -/* code listings */ - -.programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ -.programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ -.programlisting .function { color: #000000; font-weight: bold; } -.programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ -.programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ -.programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ -.programlisting .normal { color: #000000; } -.programlisting .number { color: #75507b; } /* tango: plum 2 */ -.programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ -.programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ -.programlisting .type { color: #000000; } -.programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ -.programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ - -.listing_frame { - /* tango:sky blue 1 */ - border: solid 1px #729fcf; - padding: 0px; -} - -.listing_lines, .listing_code { - margin-top: 0px; - margin-bottom: 0px; - padding: 0.5em; -} -.listing_lines { - /* tango:sky blue 0.5 */ - background: #a6c5e3; - /* tango:aluminium 6 */ - color: #2e3436; -} -.listing_code { - /* tango:sky blue 0 */ - background: #e6f3ff; -} -.listing_code .programlisting { - /* override from previous */ - border: none 0px; - padding: 0px; -} -.listing_lines pre, .listing_code pre { - margin: 0px; -} - diff --git a/doc/reference/html/up.png b/doc/reference/html/up.png deleted file mode 100644 index 85b3e2a..0000000 Binary files a/doc/reference/html/up.png and /dev/null differ diff --git a/doc/reference/json-glib-docs.xml b/doc/reference/json-glib-docs.xml index 6fa1fe6..e3b6425 100644 --- a/doc/reference/json-glib-docs.xml +++ b/doc/reference/json-glib-docs.xml @@ -15,7 +15,7 @@ - 2009 + 2009, 2010, 2011 Intel Corporation @@ -102,11 +102,14 @@ Parser + + Generator + @@ -117,12 +120,18 @@ + + JSON-GLib Additional Reference - + + JSON-GLib Tools + + + Object Hierarchy @@ -161,7 +170,17 @@ - + + Index of new symbols in 0.12 + + + + + Index of new symbols in 0.14 + + + + License diff --git a/doc/reference/json-glib-format.xml b/doc/reference/json-glib-format.xml new file mode 100644 index 0000000..d4ba59e --- /dev/null +++ b/doc/reference/json-glib-format.xml @@ -0,0 +1,81 @@ + + + + json-glib-format + JSON-GLib + + + Developer + Emmanuele + Bassi + + + + + + json-glib-format + 1 + User Commands + + + + json-glib-format + JSON-GLib formatting tool + + + + + json-glib-format + , + + SPACES + URI + + URI + + + + +Description +json-glib-format offers a simple command line +interface to format JSON data. It reads a list or URIs, applies the +spacified formatting rules on the JSON data, and outputs the formatted +JSON to the standard output. + + +The resources to operate on are specified by the URI +argument. + + + + +Commands + + + +, + +Prints help and exits. + + + + +, + +Prettifies the output, by adding spaces and indentation. This argument is +useful to improve the readability of JSON data, at the expense of its size. + + + + + SPACES + +Changes the number of spaces using to indent the JSON data from the default of 2. +This argument is only considered if is used. + + + + + + + diff --git a/doc/reference/json-glib-overrides.txt b/doc/reference/json-glib-overrides.txt deleted file mode 100644 index e69de29..0000000 diff --git a/doc/reference/json-glib-sections.txt b/doc/reference/json-glib-sections.txt index 951a0e4..89c1120 100644 --- a/doc/reference/json-glib-sections.txt +++ b/doc/reference/json-glib-sections.txt @@ -91,6 +91,15 @@ JSON_NODE_HOLDS_VALUE JSON_NODE_HOLDS_OBJECT JSON_NODE_HOLDS_ARRAY JSON_NODE_HOLDS_NULL +json_node_alloc +json_node_init +json_node_init_int +json_node_init_double +json_node_init_boolean +json_node_init_string +json_node_init_null +json_node_init_object +json_node_init_array json_node_new json_node_copy json_node_free @@ -129,6 +138,8 @@ json_node_get_node_type json_node_is_null +JSON_DEPRECATED +JSON_DEPRECATED_FOR JSON_TYPE_NODE json_node_get_type @@ -144,6 +155,9 @@ JsonParserClass json_parser_new json_parser_load_from_file json_parser_load_from_data +json_parser_load_from_stream +json_parser_load_from_stream_async +json_parser_load_from_stream_finish json_parser_get_root @@ -175,9 +189,19 @@ json_parser_error_quark JsonGenerator JsonGeneratorClass json_generator_new +json_generator_set_root +json_generator_get_root +json_generator_set_pretty +json_generator_get_pretty +json_generator_set_indent +json_generator_get_indent +json_generator_set_indent_char +json_generator_get_indent_char + + json_generator_to_file json_generator_to_data -json_generator_set_root +json_generator_to_stream JSON_TYPE_GENERATOR @@ -198,6 +222,10 @@ json_generator_get_type JsonSerializableIface json_serializable_serialize_property json_serializable_deserialize_property +json_serializable_find_property +json_serializable_get_property +json_serializable_list_properties +json_serializable_set_property json_serializable_default_serialize_property @@ -243,6 +271,16 @@ json_serialize_gobject
+json-gvariant + + +json_gvariant_serialize +json_gvariant_serialize_data +json_gvariant_deserialize +json_gvariant_deserialize_data +
+ +
json-version Versioning information JSON_MAJOR_VERSION @@ -256,4 +294,116 @@ JSON_VERSION_HEX JSON_CHECK_VERSION +JSON_VERSION_MIN_REQUIRED +JSON_VERSION_MAX_ALLOWED + + +JSON_VERSION_1_0 +JSON_VERSION_CUR_STABLE +JSON_VERSION_PREV_STABLE +JSON_AVAILABLE_IN_1_0 +JSON_DEPRECATED_IN_1_0 +JSON_DEPRECATED_IN_1_0_FOR + + +JSON_ENCODE_VERSION +JSON_DEPRECATED +JSON_DEPRECATED_FOR +JSON_UNAVAILABLE +_JSON_EXTERN +
+ +
+json-builder +JsonBuilder +JsonBuilderClass +json_builder_new +json_builder_get_root +json_builder_reset + +json_builder_begin_array +json_builder_end_array +json_builder_begin_object +json_builder_set_member_name +json_builder_end_object + +json_builder_add_value +json_builder_add_int_value +json_builder_add_double_value +json_builder_add_boolean_value +json_builder_add_string_value +json_builder_add_null_value + +JSON_TYPE_BUILDER +JSON_BUILDER +JSON_BUILDER_CLASS +JSON_IS_BUILDER +JSON_IS_BUILDER_CLASS +JSON_BUILDER_GET_CLASS + +JsonBuilderPrivate +json_builder_get_type +
+ +
+json-reader +JsonReader +JsonReaderClass +json_reader_new +json_reader_set_root + +json_reader_read_element +json_reader_end_element +json_reader_is_array +json_reader_count_elements + +json_reader_read_member +json_reader_end_member +json_reader_is_object +json_reader_count_members +json_reader_list_members +json_reader_get_member_name + +json_reader_is_value +json_reader_get_value +json_reader_get_int_value +json_reader_get_double_value +json_reader_get_string_value +json_reader_get_boolean_value +json_reader_get_null_value + +JsonReaderError +JSON_READER_ERROR +json_reader_get_error + +JSON_READER +JSON_READER_CLASS +JSON_IS_READER +JSON_IS_READER_CLASS +JSON_READER_GET_CLASS +JSON_TYPE_READER + +JsonReaderPrivate +json_reader_get_type +json_reader_error_quark +
+ +
+json-path +JsonPath +JsonPathClass +json_path_new +JSON_PATH_ERROR +JsonPathError +json_path_compile +json_path_match + +json_path_query + +JSON_TYPE_PATH +JSON_PATH +JSON_IS_PATH + +json_path_get_type +json_path_error_quark
diff --git a/doc/reference/json-glib-validate.xml b/doc/reference/json-glib-validate.xml new file mode 100644 index 0000000..1cd5c6d --- /dev/null +++ b/doc/reference/json-glib-validate.xml @@ -0,0 +1,67 @@ + + + + json-glib-validate + JSON-GLib + + + Developer + Emmanuele + Bassi + + + + + + json-glib-validate + 1 + User Commands + + + + json-glib-validate + JSON-GLib validation tool + + + + + json-glib-validate + , + URI + + URI + + + + +Description +json-glib-validate offers a simple command line +interface to validate JSON data. It lets you list URIs that point to JSON +data and checks that the data conforms to the JSON syntax. + + +The resources to operate on are specified by the URI +argument. + + + +If the JSON data is valid, json-glib-validate will terminate +with an exit code of 0; if the data is invalid, an error will be printed on +stderr and json-glib-validate will +terminate with a nonzero exit code. + + +Commands + + + +, + +Prints help and exits. + + + + + + + diff --git a/doc/reference/json-glib.types b/doc/reference/json-glib.types index 28cf10b..d937207 100644 --- a/doc/reference/json-glib.types +++ b/doc/reference/json-glib.types @@ -1,2 +1,7 @@ +#include +json_builder_get_type json_generator_get_type json_parser_get_type +json_path_get_type +json_reader_get_type +json_serializable_get_type diff --git a/doc/reference/tmpl/json-array.sgml b/doc/reference/tmpl/json-array.sgml deleted file mode 100644 index 8cea54f..0000000 --- a/doc/reference/tmpl/json-array.sgml +++ /dev/null @@ -1,270 +0,0 @@ - -JSON Array - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@Returns: - - - - - - - -@n_elements: -@Returns: - - - - - - - -@array: -@Returns: - - - - - - - -@array: - - - - - - - -@array: -@node: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@Returns: - - - - - - - -@array: -@Returns: - - - - - - - -@array: -@index_: - - - - - - - -@array: -@index_: -@element_node: -@user_data: - - - - - - - -@array: -@func: -@data: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - - - - - - -@array: -@value: - - - - - - - -@array: -@index_: -@Returns: - - diff --git a/doc/reference/tmpl/json-gboxed.sgml b/doc/reference/tmpl/json-gboxed.sgml deleted file mode 100644 index 18ea71f..0000000 --- a/doc/reference/tmpl/json-gboxed.sgml +++ /dev/null @@ -1,99 +0,0 @@ - -Boxed Types Serialization - - - - - - - - - - - - - - - - - - - - - - - - -@boxed: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@gboxed_type: -@node_type: -@serialize_func: - - - - - - - -@gboxed_type: -@node_type: -@deserialize_func: - - - - - - - -@gboxed_type: -@node_type: -@Returns: - - - - - - - -@gboxed_type: -@node_type: -@Returns: - - - - - - - -@gboxed_type: -@boxed: -@Returns: - - - - - - - -@gboxed_type: -@node: -@Returns: - - diff --git a/doc/reference/tmpl/json-generator.sgml b/doc/reference/tmpl/json-generator.sgml deleted file mode 100644 index 9aec95c..0000000 --- a/doc/reference/tmpl/json-generator.sgml +++ /dev/null @@ -1,91 +0,0 @@ - -JsonGenerator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@Returns: - - - - - - - -@generator: -@filename: -@error: -@Returns: - - - - - - - -@generator: -@length: -@Returns: - - - - - - - -@generator: -@node: - - diff --git a/doc/reference/tmpl/json-glib-unused.sgml b/doc/reference/tmpl/json-glib-unused.sgml deleted file mode 100644 index e69de29..0000000 diff --git a/doc/reference/tmpl/json-gobject.sgml b/doc/reference/tmpl/json-gobject.sgml deleted file mode 100644 index ae24d34..0000000 --- a/doc/reference/tmpl/json-gobject.sgml +++ /dev/null @@ -1,84 +0,0 @@ - -GObject Serialization - - - - - - - - - - - - - - - - - - - - - - - - -@gobject: -@Returns: - - - - - - - -@gtype: -@node: -@Returns: - - - - - - - -@gobject: -@length: -@Returns: - - - - - - - -@gtype: -@data: -@length: -@error: -@Returns: - - - - - - - -@gtype: -@data: -@length: -@error: -@Returns: - - - - - - - -@gobject: -@length: -@Returns: - - diff --git a/doc/reference/tmpl/json-node.sgml b/doc/reference/tmpl/json-node.sgml deleted file mode 100644 index 1b06d53..0000000 --- a/doc/reference/tmpl/json-node.sgml +++ /dev/null @@ -1,337 +0,0 @@ - -JSON Node - - - - - - - - - - - - - - - - - - - - - - - - -@JSON_NODE_OBJECT: -@JSON_NODE_ARRAY: -@JSON_NODE_VALUE: -@JSON_NODE_NULL: - - - - - - - - - - - - -@node: - - - - - - - -@node: -@t: - - - - - - - -@node: - - - - - - - -@node: - - - - - - - -@node: - - - - - - - -@node: - - - - - - - -@type: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: - - - - - - - -@node: -@array: - - - - - - - -@node: -@array: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@object: - - - - - - - -@node: -@object: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@value: - - - - - - - -@node: -@value: - - - - - - - -@node: -@value: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@value: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@value: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@value: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@parent: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - - - - - - -@node: -@Returns: - - diff --git a/doc/reference/tmpl/json-object.sgml b/doc/reference/tmpl/json-object.sgml deleted file mode 100644 index d80fa56..0000000 --- a/doc/reference/tmpl/json-object.sgml +++ /dev/null @@ -1,298 +0,0 @@ - -JSON Object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@Returns: - - - - - - - -@object: -@Returns: - - - - - - - -@object: - - - - - - - -@object: -@member_name: -@node: - - - - - - - -@object: -@member_name: -@node: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@Returns: - - - - - - - -@object: -@Returns: - - - - - - - -@object: -@Returns: - - - - - - - -@object: -@member_name: - - - - - - - -@object: -@member_name: -@member_node: -@user_data: - - - - - - - -@object: -@func: -@data: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - - - - - - -@object: -@member_name: -@value: - - - - - - - -@object: -@member_name: -@Returns: - - diff --git a/doc/reference/tmpl/json-parser.sgml b/doc/reference/tmpl/json-parser.sgml deleted file mode 100644 index 64f57ad..0000000 --- a/doc/reference/tmpl/json-parser.sgml +++ /dev/null @@ -1,188 +0,0 @@ - -JsonParser - - - - - - - - - - - - - - - - - - - - - - - - -@JSON_PARSER_ERROR_PARSE: -@JSON_PARSER_ERROR_UNKNOWN: - - - - - - - - - - - - -@jsonparser: the object which received the signal. -@arg1: -@arg2: - - - - - - -@jsonparser: the object which received the signal. -@arg1: - - - - - - -@jsonparser: the object which received the signal. - - - - - - -@jsonparser: the object which received the signal. -@arg1: - - - - - - -@jsonparser: the object which received the signal. -@arg1: - - - - - - -@jsonparser: the object which received the signal. -@arg1: -@arg2: - - - - - - -@jsonparser: the object which received the signal. - - - - - - -@jsonparser: the object which received the signal. - - - - - - -@jsonparser: the object which received the signal. - - - - - - -@parse_start: -@object_start: -@object_member: -@object_end: -@array_start: -@array_element: -@array_end: -@parse_end: -@error: - - - - - - -@Returns: - - - - - - - -@parser: -@filename: -@error: -@Returns: - - - - - - - -@parser: -@data: -@length: -@error: -@Returns: - - - - - - - -@parser: -@Returns: - - - - - - - -@parser: -@Returns: - - - - - - - -@parser: -@Returns: - - - - - - - -@parser: -@variable_name: -@Returns: - - diff --git a/doc/reference/tmpl/json-serializable.sgml b/doc/reference/tmpl/json-serializable.sgml deleted file mode 100644 index 01c2b8c..0000000 --- a/doc/reference/tmpl/json-serializable.sgml +++ /dev/null @@ -1,79 +0,0 @@ - -Serializable Interface - - - - - - - - - - - - - - - - - - - - - - - - -@serialize_property: -@deserialize_property: - - - - - - -@serializable: -@property_name: -@value: -@pspec: -@Returns: - - - - - - - -@serializable: -@property_name: -@value: -@pspec: -@property_node: -@Returns: - - - - - - - -@serializable: -@property_name: -@value: -@pspec: -@Returns: - - - - - - - -@serializable: -@property_name: -@value: -@pspec: -@property_node: -@Returns: - - diff --git a/doc/reference/tmpl/json-version.sgml b/doc/reference/tmpl/json-version.sgml deleted file mode 100644 index dc02e32..0000000 --- a/doc/reference/tmpl/json-version.sgml +++ /dev/null @@ -1,73 +0,0 @@ - -Versioning information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@major: -@minor: -@micro: - - diff --git a/doc/rfc4627.txt b/doc/rfc4627.txt new file mode 100644 index 0000000..67b8909 --- /dev/null +++ b/doc/rfc4627.txt @@ -0,0 +1,563 @@ + + + + + + +Network Working Group D. Crockford +Request for Comments: 4627 JSON.org +Category: Informational July 2006 + + + The application/json Media Type for JavaScript Object Notation (JSON) + +Status of This Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2006). + +Abstract + + JavaScript Object Notation (JSON) is a lightweight, text-based, + language-independent data interchange format. It was derived from + the ECMAScript Programming Language Standard. JSON defines a small + set of formatting rules for the portable representation of structured + data. + +1. Introduction + + JavaScript Object Notation (JSON) is a text format for the + serialization of structured data. It is derived from the object + literals of JavaScript, as defined in the ECMAScript Programming + Language Standard, Third Edition [ECMA]. + + JSON can represent four primitive types (strings, numbers, booleans, + and null) and two structured types (objects and arrays). + + A string is a sequence of zero or more Unicode characters [UNICODE]. + + An object is an unordered collection of zero or more name/value + pairs, where a name is a string and a value is a string, number, + boolean, null, object, or array. + + An array is an ordered sequence of zero or more values. + + The terms "object" and "array" come from the conventions of + JavaScript. + + JSON's design goals were for it to be minimal, portable, textual, and + a subset of JavaScript. + + + +Crockford Informational [Page 1] + +RFC 4627 JSON July 2006 + + +1.1. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC2119]. + + The grammatical rules in this document are to be interpreted as + described in [RFC4234]. + +2. JSON Grammar + + A JSON text is a sequence of tokens. The set of tokens includes six + structural characters, strings, numbers, and three literal names. + + A JSON text is a serialized object or array. + + JSON-text = object / array + + These are the six structural characters: + + begin-array = ws %x5B ws ; [ left square bracket + + begin-object = ws %x7B ws ; { left curly bracket + + end-array = ws %x5D ws ; ] right square bracket + + end-object = ws %x7D ws ; } right curly bracket + + name-separator = ws %x3A ws ; : colon + + value-separator = ws %x2C ws ; , comma + + Insignificant whitespace is allowed before or after any of the six + structural characters. + + ws = *( + %x20 / ; Space + %x09 / ; Horizontal tab + %x0A / ; Line feed or New line + %x0D ; Carriage return + ) + +2.1. Values + + A JSON value MUST be an object, array, number, or string, or one of + the following three literal names: + + false null true + + + +Crockford Informational [Page 2] + +RFC 4627 JSON July 2006 + + + The literal names MUST be lowercase. No other literal names are + allowed. + + value = false / null / true / object / array / number / string + + false = %x66.61.6c.73.65 ; false + + null = %x6e.75.6c.6c ; null + + true = %x74.72.75.65 ; true + +2.2. Objects + + An object structure is represented as a pair of curly brackets + surrounding zero or more name/value pairs (or members). A name is a + string. A single colon comes after each name, separating the name + from the value. A single comma separates a value from a following + name. The names within an object SHOULD be unique. + + object = begin-object [ member *( value-separator member ) ] + end-object + + member = string name-separator value + +2.3. Arrays + + An array structure is represented as square brackets surrounding zero + or more values (or elements). Elements are separated by commas. + + array = begin-array [ value *( value-separator value ) ] end-array + +2.4. Numbers + + The representation of numbers is similar to that used in most + programming languages. A number contains an integer component that + may be prefixed with an optional minus sign, which may be followed by + a fraction part and/or an exponent part. + + Octal and hex forms are not allowed. Leading zeros are not allowed. + + A fraction part is a decimal point followed by one or more digits. + + An exponent part begins with the letter E in upper or lowercase, + which may be followed by a plus or minus sign. The E and optional + sign are followed by one or more digits. + + Numeric values that cannot be represented as sequences of digits + (such as Infinity and NaN) are not permitted. + + + +Crockford Informational [Page 3] + +RFC 4627 JSON July 2006 + + + number = [ minus ] int [ frac ] [ exp ] + + decimal-point = %x2E ; . + + digit1-9 = %x31-39 ; 1-9 + + e = %x65 / %x45 ; e E + + exp = e [ minus / plus ] 1*DIGIT + + frac = decimal-point 1*DIGIT + + int = zero / ( digit1-9 *DIGIT ) + + minus = %x2D ; - + + plus = %x2B ; + + + zero = %x30 ; 0 + +2.5. Strings + + The representation of strings is similar to conventions used in the C + family of programming languages. A string begins and ends with + quotation marks. All Unicode characters may be placed within the + quotation marks except for the characters that must be escaped: + quotation mark, reverse solidus, and the control characters (U+0000 + through U+001F). + + Any character may be escaped. If the character is in the Basic + Multilingual Plane (U+0000 through U+FFFF), then it may be + represented as a six-character sequence: a reverse solidus, followed + by the lowercase letter u, followed by four hexadecimal digits that + encode the character's code point. The hexadecimal letters A though + F can be upper or lowercase. So, for example, a string containing + only a single reverse solidus character may be represented as + "\u005C". + + Alternatively, there are two-character sequence escape + representations of some popular characters. So, for example, a + string containing only a single reverse solidus character may be + represented more compactly as "\\". + + To escape an extended character that is not in the Basic Multilingual + Plane, the character is represented as a twelve-character sequence, + encoding the UTF-16 surrogate pair. So, for example, a string + containing only the G clef character (U+1D11E) may be represented as + "\uD834\uDD1E". + + + +Crockford Informational [Page 4] + +RFC 4627 JSON July 2006 + + + string = quotation-mark *char quotation-mark + + char = unescaped / + escape ( + %x22 / ; " quotation mark U+0022 + %x5C / ; \ reverse solidus U+005C + %x2F / ; / solidus U+002F + %x62 / ; b backspace U+0008 + %x66 / ; f form feed U+000C + %x6E / ; n line feed U+000A + %x72 / ; r carriage return U+000D + %x74 / ; t tab U+0009 + %x75 4HEXDIG ) ; uXXXX U+XXXX + + escape = %x5C ; \ + + quotation-mark = %x22 ; " + + unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + +3. Encoding + + JSON text SHALL be encoded in Unicode. The default encoding is + UTF-8. + + Since the first two characters of a JSON text will always be ASCII + characters [RFC0020], it is possible to determine whether an octet + stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + at the pattern of nulls in the first four octets. + + 00 00 00 xx UTF-32BE + 00 xx 00 xx UTF-16BE + xx 00 00 00 UTF-32LE + xx 00 xx 00 UTF-16LE + xx xx xx xx UTF-8 + +4. Parsers + + A JSON parser transforms a JSON text into another representation. A + JSON parser MUST accept all texts that conform to the JSON grammar. + A JSON parser MAY accept non-JSON forms or extensions. + + An implementation may set limits on the size of texts that it + accepts. An implementation may set limits on the maximum depth of + nesting. An implementation may set limits on the range of numbers. + An implementation may set limits on the length and character contents + of strings. + + + + +Crockford Informational [Page 5] + +RFC 4627 JSON July 2006 + + +5. Generators + + A JSON generator produces JSON text. The resulting text MUST + strictly conform to the JSON grammar. + +6. IANA Considerations + + The MIME media type for JSON text is application/json. + + Type name: application + + Subtype name: json + + Required parameters: n/a + + Optional parameters: n/a + + Encoding considerations: 8bit if UTF-8; binary if UTF-16 or UTF-32 + + JSON may be represented using UTF-8, UTF-16, or UTF-32. When JSON + is written in UTF-8, JSON is 8bit compatible. When JSON is + written in UTF-16 or UTF-32, the binary content-transfer-encoding + must be used. + + Security considerations: + + Generally there are security issues with scripting languages. JSON + is a subset of JavaScript, but it is a safe subset that excludes + assignment and invocation. + + A JSON text can be safely passed into JavaScript's eval() function + (which compiles and executes a string) if all the characters not + enclosed in strings are in the set of characters that form JSON + tokens. This can be quickly determined in JavaScript with two + regular expressions and calls to the test and replace methods. + + var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( + text.replace(/"(\\.|[^"\\])*"/g, ''))) && + eval('(' + text + ')'); + + Interoperability considerations: n/a + + Published specification: RFC 4627 + + + + + + + + +Crockford Informational [Page 6] + +RFC 4627 JSON July 2006 + + + Applications that use this media type: + + JSON has been used to exchange data between applications written + in all of these programming languages: ActionScript, C, C#, + ColdFusion, Common Lisp, E, Erlang, Java, JavaScript, Lua, + Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Scheme. + + Additional information: + + Magic number(s): n/a + File extension(s): .json + Macintosh file type code(s): TEXT + + Person & email address to contact for further information: + Douglas Crockford + douglas@crockford.com + + Intended usage: COMMON + + Restrictions on usage: none + + Author: + Douglas Crockford + douglas@crockford.com + + Change controller: + Douglas Crockford + douglas@crockford.com + +7. Security Considerations + + See Security Considerations in Section 6. + +8. Examples + + This is a JSON object: + + { + "Image": { + "Width": 800, + "Height": 600, + "Title": "View from 15th Floor", + "Thumbnail": { + "Url": "http://www.example.com/image/481989943", + "Height": 125, + "Width": "100" + }, + "IDs": [116, 943, 234, 38793] + + + +Crockford Informational [Page 7] + +RFC 4627 JSON July 2006 + + + } + } + + Its Image member is an object whose Thumbnail member is an object + and whose IDs member is an array of numbers. + + This is a JSON array containing two objects: + + [ + { + "precision": "zip", + "Latitude": 37.7668, + "Longitude": -122.3959, + "Address": "", + "City": "SAN FRANCISCO", + "State": "CA", + "Zip": "94107", + "Country": "US" + }, + { + "precision": "zip", + "Latitude": 37.371991, + "Longitude": -122.026020, + "Address": "", + "City": "SUNNYVALE", + "State": "CA", + "Zip": "94085", + "Country": "US" + } + ] + +9. References + +9.1. Normative References + + [ECMA] European Computer Manufacturers Association, "ECMAScript + Language Specification 3rd Edition", December 1999, + . + + [RFC0020] Cerf, V., "ASCII format for network interchange", RFC 20, + October 1969. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC4234] Crocker, D. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", RFC 4234, October 2005. + + + +Crockford Informational [Page 8] + +RFC 4627 JSON July 2006 + + + [UNICODE] The Unicode Consortium, "The Unicode Standard Version 4.0", + 2003, . + +Author's Address + + Douglas Crockford + JSON.org + EMail: douglas@crockford.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Crockford Informational [Page 9] + +RFC 4627 JSON July 2006 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2006). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + +Acknowledgement + + Funding for the RFC Editor function is provided by the IETF + Administrative Support Activity (IASA). + + + + + + + +Crockford Informational [Page 10] + diff --git a/gtk-doc.make b/gtk-doc.make deleted file mode 100644 index 57fab98..0000000 --- a/gtk-doc.make +++ /dev/null @@ -1,230 +0,0 @@ -# -*- mode: makefile -*- - -#################################### -# Everything below here is generic # -#################################### - -if GTK_DOC_USE_LIBTOOL -GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -GTKDOC_RUN = $(LIBTOOL) --mode=execute -else -GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -GTKDOC_RUN = -endif - -# We set GPATH here; this gives us semantics for GNU make -# which are more like other make's VPATH, when it comes to -# whether a source that is a target of one rule is then -# searched for in VPATH/GPATH. -# -GPATH = $(srcdir) - -TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) - -EXTRA_DIST = \ - $(content_files) \ - $(HTML_IMAGES) \ - $(DOC_MAIN_SGML_FILE) \ - $(DOC_MODULE)-sections.txt \ - $(DOC_MODULE)-overrides.txt - -DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ - pdf-build.stamp \ - $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \ - $(srcdir)/pdf.stamp - -SCANOBJ_FILES = \ - $(DOC_MODULE).args \ - $(DOC_MODULE).hierarchy \ - $(DOC_MODULE).interfaces \ - $(DOC_MODULE).prerequisites \ - $(DOC_MODULE).signals - -REPORT_FILES = \ - $(DOC_MODULE)-undocumented.txt \ - $(DOC_MODULE)-undeclared.txt \ - $(DOC_MODULE)-unused.txt - -CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) - -if ENABLE_GTK_DOC -if GTK_DOC_BUILD_HTML -HTML_BUILD_STAMP=html-build.stamp -else -HTML_BUILD_STAMP= -endif -if GTK_DOC_BUILD_PDF -PDF_BUILD_STAMP=pdf-build.stamp -else -PDF_BUILD_STAMP= -endif - -all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) -else -all-local: -endif - -docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) - -$(REPORT_FILES): sgml-build.stamp - -#### scan #### - -scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) - @echo 'gtk-doc: Scanning header files' - @-chmod -R u+w $(srcdir) - @_source_dir='' ; for i in $(DOC_SOURCE_DIR) ; do \ - _source_dir="$${_source_dir} --source-dir=$$i" ; \ - done ; \ - cd $(srcdir) && \ - gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) - @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ - CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ - else \ - cd $(srcdir) ; \ - for i in $(SCANOBJ_FILES) ; do \ - test -f $$i || touch $$i ; \ - done \ - fi - @touch scan-build.stamp - -$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp - @true - -#### templates #### - -tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt - @echo 'gtk-doc: Rebuilding template files' - @-chmod -R u+w $(srcdir) - @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) - @touch tmpl-build.stamp - -tmpl.stamp: tmpl-build.stamp - @true - -$(srcdir)/tmpl/*.sgml: - @true - -#### xml #### - -sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) - @echo 'gtk-doc: Building XML' - @-chmod -R u+w $(srcdir) - @_source_dir='' ; for i in $(DOC_SOURCE_DIR) ; do \ - _source_dir="$${_source_dir} --source-dir=$$i" ; \ - done ; \ - cd $(srcdir) && \ - gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) - @touch sgml-build.stamp - -sgml.stamp: sgml-build.stamp - @true - -#### html #### - -html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) - @echo 'gtk-doc: Building HTML' - @-chmod -R u+w $(srcdir) - @rm -rf $(srcdir)/html - @mkdir $(srcdir)/html - @mkhtml_options=""; \ - gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ - if test "$(?)" = "0"; then \ - mkhtml_options=--path="$(srcdir)"; \ - fi; \ - cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) - @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) - @echo 'gtk-doc: Fixing cross-references' - @cd $(srcdir) && gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) - @touch html-build.stamp - -#### pdf #### - -pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) - @echo 'gtk-doc: Building PDF' - @-chmod -R u+w $(srcdir) - @rm -rf $(srcdir)/$(DOC_MODULE).pdf - @mkpdf_imgdirs=""; \ - if test "x$(HTML_IMAGES)" != "x"; then \ - for img in $(HTML_IMAGES); do \ - part=`dirname $$img`; \ - echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \ - if test $$? != 0; then \ - mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \ - fi; \ - done; \ - fi; \ - cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) - @touch pdf-build.stamp - -############## - -clean-local: - rm -f *~ *.bak - rm -rf .libs - -distclean-local: - cd $(srcdir) && \ - rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \ - $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt - -maintainer-clean-local: clean - cd $(srcdir) && rm -rf xml html - -install-data-local: - @installfiles=`echo $(srcdir)/html/*`; \ - if test "$$installfiles" = '$(srcdir)/html/*'; \ - then echo '-- Nothing to install' ; \ - else \ - if test -n "$(DOC_MODULE_VERSION)"; then \ - installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ - else \ - installdir="$(DESTDIR)$(TARGET_DIR)"; \ - fi; \ - $(mkinstalldirs) $${installdir} ; \ - for i in $$installfiles; do \ - echo '-- Installing '$$i ; \ - $(INSTALL_DATA) $$i $${installdir}; \ - done; \ - if test -n "$(DOC_MODULE_VERSION)"; then \ - mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ - $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ - mv -f $${installdir}/$(DOC_MODULE).devhelp \ - $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \ - fi; \ - $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ - fi - -uninstall-local: - @if test -n "$(DOC_MODULE_VERSION)"; then \ - installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ - else \ - installdir="$(DESTDIR)$(TARGET_DIR)"; \ - fi; \ - rm -rf $${installdir} - -# -# Require gtk-doc when making dist -# -if ENABLE_GTK_DOC -dist-check-gtkdoc: -else -dist-check-gtkdoc: - @echo "*** gtk-doc must be installed and enabled in order to make dist" - @false -endif - -dist-hook: dist-check-gtkdoc dist-hook-local - mkdir $(distdir)/tmpl - mkdir $(distdir)/html - -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl - cp $(srcdir)/html/* $(distdir)/html - -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/ - -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ - -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ - cd $(distdir) && rm -f $(DISTCLEANFILES) - $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html - -.PHONY : dist-hook-local docs diff --git a/install-sh b/install-sh deleted file mode 100755 index 6781b98..0000000 --- a/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/json-glib-0.10.4 b/json-glib-0.10.4 deleted file mode 100644 index e69de29..0000000 diff --git a/json-glib.doap b/json-glib.doap new file mode 100644 index 0000000..c608277 --- /dev/null +++ b/json-glib.doap @@ -0,0 +1,37 @@ + + + JSON-GLib + json-glib + GLib-based JSON manipulation library + JSON-GLib implements a full JSON parser using GLib and GObject. Use JSON-GLib it is possible to parse and generate valid JSON data structures, using a DOM-like API. JSON-GLib also offers GObject integration, providing the ability to serialize and deserialize GObject instances to and from JSON data types. + + + + + + + + + C + + + + Emmanuele Bassi + + ebassi + + + + + + Emmanuele Bassi + + ebassi + + + + diff --git a/json-glib.pc.in b/json-glib.pc.in deleted file mode 100644 index 0e26a47..0000000 --- a/json-glib.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${exec_prefix}/include/json-glib-1.0 - -Name: JSON-GLib -Description: JSON Parser for GLib -Version: @VERSION@ -Libs: -L${libdir} -ljson-glib-1.0 -Cflags: -I${includedir} -I${includedir}/json-glib/ -Requires: gobject-2.0 diff --git a/json-glib/Makefile.am b/json-glib/Makefile.am index 6471fa9..28638b2 100644 --- a/json-glib/Makefile.am +++ b/json-glib/Makefile.am @@ -1,59 +1,58 @@ -include $(top_srcdir)/build/autotools/Makefile.am.gtest -include $(top_srcdir)/build/autotools/Makefile.am.silent - -if ENABLE_GLIB_TEST -# build this directory *before* the tests/ -SUBDIRS = . tests -endif - -DIST_SUBDIRS = tests +# preamble NULL = - -INCLUDES = -I$(top_srcdir) - -AM_CPPFLAGS = \ - -DPREFIX=\""$(prefix)"\" \ - -DLIBDIR=\""$(libdir)"\" \ - -DJSON_COMPILATION=1 \ - -DG_DISABLE_DEPRECATED \ - -DJSON_DISABLE_DEPRECATED \ - -DG_LOG_DOMAIN=\"Json\" \ - $(JSON_DEBUG_CFLAGS) \ - $(NULL) - -AM_CFLAGS = $(JSON_CFLAGS) $(MAINTAINER_CFLAGS) - +AM_CPPFLAGS = +AM_CFLAGS = BUILT_SOURCES = - CLEANFILES = -DISTCLEANFILES = json-version.h +EXTRA_DIST = +DISTCLEANFILES = +lib_LTLIBRARIES = +bin_PROGRAMS = + +# build the tests last +SUBDIRS = . tests +# main library source_h = \ + $(top_srcdir)/json-glib/json-builder.h \ $(top_srcdir)/json-glib/json-generator.h \ $(top_srcdir)/json-glib/json-gobject.h \ + $(top_srcdir)/json-glib/json-gvariant.h \ $(top_srcdir)/json-glib/json-parser.h \ + $(top_srcdir)/json-glib/json-path.h \ + $(top_srcdir)/json-glib/json-reader.h \ $(top_srcdir)/json-glib/json-types.h \ + $(top_srcdir)/json-glib/json-version-macros.h \ $(NULL) source_h_private = \ - $(top_srcdir)/json-glib/json-scanner.h \ + $(top_srcdir)/json-glib/json-debug.h \ $(top_srcdir)/json-glib/json-gobject-private.h \ + $(top_srcdir)/json-glib/json-scanner.h \ $(top_srcdir)/json-glib/json-types-private.h \ $(NULL) source_c = \ $(srcdir)/json-array.c \ + $(srcdir)/json-builder.c \ + $(srcdir)/json-debug.c \ $(srcdir)/json-gboxed.c \ $(srcdir)/json-generator.c \ $(srcdir)/json-gobject.c \ + $(srcdir)/json-gvariant.c \ $(srcdir)/json-node.c \ $(srcdir)/json-object.c \ $(srcdir)/json-parser.c \ + $(srcdir)/json-path.c \ + $(srcdir)/json-reader.c \ $(srcdir)/json-scanner.c \ $(srcdir)/json-serializable.c \ + $(srcdir)/json-value.c \ $(NULL) +DISTCLEANFILES += json-version.h + # glib-mkenums rules glib_enum_h = json-enum-types.h glib_enum_c = json-enum-types.c @@ -65,11 +64,22 @@ glib_marshal_list = json-marshal.list glib_marshal_prefix = _json_marshal include $(top_srcdir)/build/autotools/Makefile.am.marshal -lib_LTLIBRARIES = libjson-glib-1.0.la - +lib_LTLIBRARIES += libjson-glib-1.0.la + +libjson_glib_1_0_la_CPPFLAGS = \ + -DPREFIX=\""$(prefix)"\" \ + -DLIBDIR=\""$(libdir)"\" \ + -DJSON_LOCALEDIR=\""$(localedir)"\" \ + -DJSON_COMPILATION=1 \ + -DG_LOG_DOMAIN=\"Json\" \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + $(JSON_DEBUG_CFLAGS) \ + $(NULL) +libjson_glib_1_0_la_CFLAGS = $(JSON_CFLAGS) $(JSON_HIDDEN_VISIBILITY_CFLAG) $(MAINTAINER_CFLAGS) $(JSON_GCOV_CFLAGS) libjson_glib_1_0_la_LIBADD = $(JSON_LIBS) libjson_glib_1_0_la_SOURCES = $(source_c) $(source_h) $(source_h_private) $(BUILT_SOURCES) -libjson_glib_1_0_la_LDFLAGS = $(JSON_LT_LDFLAGS) -export-dynamic -export-symbols-regex "^json.*" -rpath $(libdir) +libjson_glib_1_0_la_LDFLAGS = $(JSON_LT_LDFLAGS) $(JSON_GCOV_LDADD) -export-dynamic jsonincludedir = $(includedir)/json-glib-1.0/json-glib jsoninclude_DATA = \ @@ -79,44 +89,97 @@ jsoninclude_DATA = \ $(top_srcdir)/json-glib/json-glib.h \ $(NULL) -EXTRA_DIST += json-version.h.in json-glib.h +EXTRA_DIST += json-version.h.in json-glib.h json-version.h + +pcfiles = json-glib-1.0.pc + +json-glib-1.0.pc: json-glib.pc + $(AM_V_GEN)cp -f $< $@ + +pkgconfig_DATA = $(pcfiles) +pkgconfigdir = $(libdir)/pkgconfig +CLEANFILES += $(pcfiles) +EXTRA_DIST += json-glib.pc.in + +# tools +bin_PROGRAMS += json-glib-validate +json_glib_validate_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) -DJSON_LOCALEDIR=\""$(localedir)"\" +json_glib_validate_CFLAGS = $(JSON_CFLAGS) $(MAINTAINER_CFLAGS) +json_glib_validate_SOURCES = json-glib-validate.c +json_glib_validate_LDADD = $(JSON_LIBS) libjson-glib-1.0.la + +bin_PROGRAMS += json-glib-format +json_glib_format_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) -DJSON_LOCALEDIR=\""$(localedir)"\" +json_glib_format_CFLAGS = $(JSON_CFLAGS) $(MAINTAINER_CFLAGS) +json_glib_format_SOURCES = json-glib-format.c +json_glib_format_LDADD = $(JSON_LIBS) libjson-glib-1.0.la -TESTS_ENVIRONMENT = srcdir="$(srcdir)" json_all_c_sources="$(source_c)" +# intospection +-include $(INTROSPECTION_MAKEFILE) if HAVE_INTROSPECTION -BUILT_GIRSOURCES = - -Json-1.0.gir: $(INTROSPECTION_SCANNER) libjson-glib-1.0.la - $(QUIET_GEN)$(INTROSPECTION_SCANNER) \ - -v --namespace Json --nsversion=1.0 \ - $(INCLUDES) \ - $(AM_CPPFLAGS) \ - --c-include='json-glib/json-gobject.h' \ - --include=GObject-2.0 \ - --library=libjson-glib-1.0.la \ - --libtool="$(top_builddir)/libtool" \ - --pkg gobject-2.0 \ - --output $@ \ - $(source_h) \ - $(source_c) - -BUILT_GIRSOURCES += Json-1.0.gir - -# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to -# install anything - we need to install inside our prefix. +INTROSPECTION_GIRS = Json-1.0.gir + +introspection_source = \ + $(source_c) \ + $(source_h) \ + $(top_builddir)/json-glib/json-enum-types.h \ + $(top_builddir)/json-glib/json-enum-types.c \ + $(top_builddir)/json-glib/json-version.h + +Json-1.0.gir: libjson-glib-1.0.la Makefile + +Json_1_0_gir_NAMESPACE = Json +Json_1_0_gir_VERSION = 1.0 +Json_1_0_gir_LIBS = libjson-glib-1.0.la +Json_1_0_gir_FILES = $(introspection_source) +Json_1_0_gir_CFLAGS = -DJSON_COMPILATION=1 -I$(top_srcdir) -I$(top_builddir) $(JSON_CFLAGS) +Json_1_0_gir_INCLUDES = GObject-2.0 Gio-2.0 +Json_1_0_gir_SCANNERFLAGS = --warn-all --pkg-export json-glib-1.0 --c-include "json-glib/json-glib.h" + girdir = $(datadir)/gir-1.0 -gir_DATA = $(BUILT_GIRSOURCES) +dist_gir_DATA = Json-1.0.gir typelibsdir = $(libdir)/girepository-1.0/ -typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib) - -%.typelib: %.gir $(INTROSPECTION_COMPILER) - $(QUIET_GEN)\ - $(DEBUG) $(INTROSPECTION_COMPILER) \ - --includedir=$(srcdir) \ - --includedir=. \ - $(INTROSPECTION_COMPILER_OPTS) $< \ - -o $(@F) +typelibs_DATA = Json-1.0.typelib -CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA) +CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA) endif # HAVE_INTROSPECTION + +# visual studio +dist-hook: ../build/win32/vs9/json-glib.vcproj ../build/win32/vs10/json-glib.vcxproj ../build/win32/vs10/json-glib.vcxproj.filters + +../build/win32/vs9/json-glib.vcproj: $(top_srcdir)/build/win32/vs9/json-glib.vcprojin + for F in $(libjson_glib_1_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >jsonglib.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/json-glib.vcprojin >$@ + rm jsonglib.sourcefiles + +../build/win32/vs10/json-glib.vcxproj: $(top_srcdir)/build/win32/vs10/json-glib.vcxprojin + for F in $(libjson_glib_1_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >jsonglib.vs10.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/json-glib.vcxprojin >$@ + rm jsonglib.vs10.sourcefiles + +../build/win32/vs10/json-glib.vcxproj.filters: $(top_srcdir)/build/win32/vs10/json-glib.vcxproj.filtersin + for F in $(libjson_glib_1_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' Sources' \ + ;; \ + esac; \ + done >jsonglib.vs10.sourcefiles.filters + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/json-glib.vcxproj.filtersin >$@ + rm jsonglib.vs10.sourcefiles.filters + +# Let the VS9/VS10 Project files be cleared out before they are re-expanded... +DISTCLEANFILES += ../build/win32/vs9/json-glib.vcproj \ + ../build/win32/vs10/json-glib.vcxproj \ + ../build/win32/vs10/json-glib.vcxproj.filters diff --git a/json-glib/json-array.c b/json-glib/json-array.c index 7f72e87..c747989 100644 --- a/json-glib/json-array.c +++ b/json-glib/json-array.c @@ -21,9 +21,7 @@ * Emmanuele Bassi */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include "json-types-private.h" @@ -32,7 +30,7 @@ * @short_description: a JSON array representation * * #JsonArray is the representation of the array type inside JSON. It contains - * #JsonNodes, which may contain fundamental types, other arrays or + * #JsonNode elements, which may contain fundamental types, other arrays or * objects. * * Since arrays can be expensive, they are reference counted. You can control @@ -44,25 +42,14 @@ * To retrieve the length of the array, use json_array_get_length(). */ -GType -json_array_get_type (void) -{ - static GType array_type = 0; - - if (G_UNLIKELY (!array_type)) - array_type = g_boxed_type_register_static (g_intern_static_string ("JsonArray"), - (GBoxedCopyFunc) json_array_ref, - (GBoxedFreeFunc) json_array_unref); - - return array_type; -} +G_DEFINE_BOXED_TYPE (JsonArray, json_array, json_array_ref, json_array_unref); /** - * json_array_new: + * json_array_new: (constructor) * * Creates a new #JsonArray. * - * Return value: the newly created #JsonArray + * Return value: (transfer full): the newly created #JsonArray */ JsonArray * json_array_new (void) @@ -78,12 +65,12 @@ json_array_new (void) } /** - * json_array_sized_new: + * json_array_sized_new: (constructor) * @n_elements: number of slots to pre-allocate * * Creates a new #JsonArray with @n_elements slots already allocated. * - * Return value: the newly created #JsonArray + * Return value: (transfer full): the newly created #JsonArray */ JsonArray * json_array_sized_new (guint n_elements) @@ -104,7 +91,7 @@ json_array_sized_new (guint n_elements) * * Increase by one the reference count of a #JsonArray. * - * Return value: the passed #JsonArray, with the reference count + * Return value: (transfer none): the passed #JsonArray, with the reference count * increased by one. */ JsonArray * @@ -113,11 +100,8 @@ json_array_ref (JsonArray *array) g_return_val_if_fail (array != NULL, NULL); g_return_val_if_fail (array->ref_count > 0, NULL); -#if !GLIB_CHECK_VERSION(2, 31, 0) - g_atomic_int_exchange_and_add (&array->ref_count, 1); -#else g_atomic_int_add (&array->ref_count, 1); -#endif + return array; } @@ -132,15 +116,10 @@ json_array_ref (JsonArray *array) void json_array_unref (JsonArray *array) { - gint old_ref; - g_return_if_fail (array != NULL); g_return_if_fail (array->ref_count > 0); - old_ref = g_atomic_int_get (&array->ref_count); - if (old_ref > 1) - g_atomic_int_compare_and_exchange (&array->ref_count, old_ref, old_ref - 1); - else + if (g_atomic_int_dec_and_test (&array->ref_count)) { guint i; @@ -158,7 +137,7 @@ json_array_unref (JsonArray *array) * json_array_get_elements: * @array: a #JsonArray * - * Gets the elements of a #JsonArray as a list of #JsonNodes. + * Gets the elements of a #JsonArray as a list of #JsonNode instances. * * Return value: (element-type JsonNode) (transfer container): a #GList * containing the elements of the array. The contents of the list are @@ -218,7 +197,7 @@ json_array_dup_element (JsonArray *array, * Retrieves the #JsonNode containing the value of the element at @index_ * inside a #JsonArray. * - * Return value: a pointer to the #JsonNode at the requested index + * Return value: (transfer none): a pointer to the #JsonNode at the requested index */ JsonNode * json_array_get_element (JsonArray *array, @@ -335,15 +314,9 @@ json_array_get_boolean_element (JsonArray *array, * * Since: 0.8 */ -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar * -json_array_get_string_element (JsonArray *array, - guint index_) -#else const gchar * json_array_get_string_element (JsonArray *array, guint index_) -#endif { JsonNode *node; @@ -352,7 +325,10 @@ json_array_get_string_element (JsonArray *array, node = g_ptr_array_index (array->elements, index_); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_VALUE (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_string (node); } @@ -382,7 +358,16 @@ json_array_get_null_element (JsonArray *array, node = g_ptr_array_index (array->elements, index_); g_return_val_if_fail (node != NULL, FALSE); - return JSON_NODE_TYPE (node) == JSON_NODE_NULL; + if (JSON_NODE_HOLDS_NULL (node)) + return TRUE; + + if (JSON_NODE_HOLDS_ARRAY (node)) + return json_node_get_array (node) == NULL; + + if (JSON_NODE_HOLDS_OBJECT (node)) + return json_node_get_object (node) == NULL; + + return FALSE; } /** @@ -410,7 +395,10 @@ json_array_get_array_element (JsonArray *array, node = g_ptr_array_index (array->elements, index_); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_ARRAY (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_array (node); } @@ -440,7 +428,10 @@ json_array_get_object_element (JsonArray *array, node = g_ptr_array_index (array->elements, index_); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_object (node); } @@ -464,7 +455,7 @@ json_array_get_length (JsonArray *array) /** * json_array_add_element: * @array: a #JsonArray - * @node: a #JsonNode + * @node: (transfer full): a #JsonNode * * Appends @node inside @array. The array will take ownership of the * #JsonNode. @@ -494,14 +485,9 @@ void json_array_add_int_element (JsonArray *array, gint64 value) { - JsonNode *node; - g_return_if_fail (array != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_int (node, value); - - g_ptr_array_add (array->elements, node); + g_ptr_array_add (array->elements, json_node_init_int (json_node_alloc (), value)); } /** @@ -519,14 +505,9 @@ void json_array_add_double_element (JsonArray *array, gdouble value) { - JsonNode *node; - g_return_if_fail (array != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_double (node, value); - - g_ptr_array_add (array->elements, node); + g_ptr_array_add (array->elements, json_node_init_double (json_node_alloc (), value)); } /** @@ -544,14 +525,9 @@ void json_array_add_boolean_element (JsonArray *array, gboolean value) { - JsonNode *node; - g_return_if_fail (array != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (node, value); - - g_ptr_array_add (array->elements, node); + g_ptr_array_add (array->elements, json_node_init_boolean (json_node_alloc (), value)); } /** @@ -572,10 +548,13 @@ json_array_add_string_element (JsonArray *array, JsonNode *node; g_return_if_fail (array != NULL); - g_return_if_fail (value != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_string (node, value); + node = json_node_alloc (); + + if (value != NULL && *value != '\0') + json_node_init_string (node, value); + else + json_node_init_null (node); g_ptr_array_add (array->elements, node); } @@ -593,19 +572,15 @@ json_array_add_string_element (JsonArray *array, void json_array_add_null_element (JsonArray *array) { - JsonNode *node; - g_return_if_fail (array != NULL); - node = json_node_new (JSON_NODE_NULL); - - g_ptr_array_add (array->elements, node); + g_ptr_array_add (array->elements, json_node_init_null (json_node_alloc ())); } /** * json_array_add_array_element: * @array: a #JsonArray - * @value: a #JsonArray + * @value: (allow-none) (transfer full): a #JsonArray * * Conveniently adds an array into @array. The @array takes ownership * of the newly added #JsonArray @@ -621,10 +596,16 @@ json_array_add_array_element (JsonArray *array, JsonNode *node; g_return_if_fail (array != NULL); - g_return_if_fail (value != NULL); - node = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (node, value); + node = json_node_alloc (); + + if (value != NULL) + { + json_node_init_array (node, value); + json_array_unref (value); + } + else + json_node_init_null (node); g_ptr_array_add (array->elements, node); } @@ -632,7 +613,7 @@ json_array_add_array_element (JsonArray *array, /** * json_array_add_object_element: * @array: a #JsonArray - * @value: a #JsonObject + * @value: (transfer full): a #JsonObject * * Conveniently adds an object into @array. The @array takes ownership * of the newly added #JsonObject @@ -648,10 +629,16 @@ json_array_add_object_element (JsonArray *array, JsonNode *node; g_return_if_fail (array != NULL); - g_return_if_fail (value != NULL); - node = json_node_new (JSON_NODE_OBJECT); - json_node_take_object (node, value); + node = json_node_alloc (); + + if (value != NULL) + { + json_node_init_object (node, value); + json_object_unref (value); + } + else + json_node_init_null (node); g_ptr_array_add (array->elements, node); } @@ -677,8 +664,8 @@ json_array_remove_element (JsonArray *array, /** * json_array_foreach_element: * @array: a #JsonArray - * @func: the function to be called on each element - * @data: (allow-none): data to be passed to the function + * @func: (scope call): the function to be called on each element + * @data: (closure): data to be passed to the function * * Iterates over all elements of @array and calls @func on * each one of them. diff --git a/json-glib/json-builder.c b/json-glib/json-builder.c new file mode 100644 index 0000000..f3d6599 --- /dev/null +++ b/json-glib/json-builder.c @@ -0,0 +1,685 @@ +/* json-generator.c - JSON tree builder + * + * This file is part of JSON-GLib + * Copyright (C) 2010 Luca Bruno + * + * 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, see . + * + * Author: + * Luca Bruno + */ + +/** + * SECTION:json-builder + * @Title: JsonBuilder + * @short_description: Generates JSON trees + * @See_Also: JsonGenerator + * + * #JsonBuilder provides an object for generating a JSON tree. + * You can generate only one tree with one #JsonBuilder instance. + * + * The root of the JSON tree can be either a #JsonObject or a #JsonArray. + * Thus the first call must necessarily be either + * json_builder_begin_object() or json_builder_begin_array(). + * + * For convenience to language bindings, #JsonBuilder returns itself from + * most of functions, making it easy to chain function calls. + */ + +#include "config.h" + +#include +#include + +#include "json-types-private.h" + +#include "json-builder.h" + +struct _JsonBuilderPrivate +{ + GQueue *stack; + JsonNode *root; +}; + +typedef enum +{ + JSON_BUILDER_MODE_OBJECT, + JSON_BUILDER_MODE_ARRAY, + JSON_BUILDER_MODE_MEMBER +} JsonBuilderMode; + +typedef struct +{ + JsonBuilderMode mode; + + union + { + JsonObject *object; + JsonArray *array; + } data; + gchar *member_name; +} JsonBuilderState; + +static void +json_builder_state_free (JsonBuilderState *state) +{ + if (G_LIKELY (state)) + { + switch (state->mode) + { + case JSON_BUILDER_MODE_OBJECT: + case JSON_BUILDER_MODE_MEMBER: + json_object_unref (state->data.object); + g_free (state->member_name); + state->data.object = NULL; + state->member_name = NULL; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_unref (state->data.array); + state->data.array = NULL; + break; + + default: + g_assert_not_reached (); + } + + g_slice_free (JsonBuilderState, state); + } +} + +G_DEFINE_TYPE_WITH_PRIVATE (JsonBuilder, json_builder, G_TYPE_OBJECT) + +static void +json_builder_free_all_state (JsonBuilder *builder) +{ + JsonBuilderState *state; + + while (!g_queue_is_empty (builder->priv->stack)) + { + state = g_queue_pop_head (builder->priv->stack); + json_builder_state_free (state); + } + + if (builder->priv->root) + { + json_node_free (builder->priv->root); + builder->priv->root = NULL; + } +} + +static void +json_builder_finalize (GObject *gobject) +{ + JsonBuilderPrivate *priv = json_builder_get_instance_private ((JsonBuilder *) gobject); + + json_builder_free_all_state (JSON_BUILDER (gobject)); + + g_queue_free (priv->stack); + priv->stack = NULL; + + G_OBJECT_CLASS (json_builder_parent_class)->finalize (gobject); +} + +static void +json_builder_class_init (JsonBuilderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = json_builder_finalize; +} + +static void +json_builder_init (JsonBuilder *builder) +{ + JsonBuilderPrivate *priv = json_builder_get_instance_private (builder); + + builder->priv = priv; + + priv->stack = g_queue_new (); + priv->root = NULL; +} + +static inline JsonBuilderMode +json_builder_current_mode (JsonBuilder *builder) +{ + JsonBuilderState *state = g_queue_peek_head (builder->priv->stack); + return state->mode; +} + +static inline gboolean +json_builder_is_valid_add_mode (JsonBuilder *builder) +{ + JsonBuilderMode mode = json_builder_current_mode (builder); + return mode == JSON_BUILDER_MODE_MEMBER || mode == JSON_BUILDER_MODE_ARRAY; +} + +/** + * json_builder_new: + * + * Creates a new #JsonBuilder. You can use this object to generate a + * JSON tree and obtain the root #JsonNode. + * + * Return value: the newly created #JsonBuilder instance + */ +JsonBuilder * +json_builder_new (void) +{ + return g_object_new (JSON_TYPE_BUILDER, NULL); +} + +/** + * json_builder_get_root: + * @builder: a #JsonBuilder + * + * Returns the root of the current constructed tree, if the build is complete + * (ie: all opened objects, object members and arrays are being closed). + * + * Return value: (transfer full): the #JsonNode, or %NULL if the build is not complete. + * Free the returned value with json_node_free(). + */ +JsonNode * +json_builder_get_root (JsonBuilder *builder) +{ + JsonNode *root = NULL; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + + if (builder->priv->root) + root = json_node_copy (builder->priv->root); + + return root; +} + +/** + * json_builder_reset: + * @builder: a #JsonBuilder + * + * Resets the state of the @builder back to its initial state. + */ +void +json_builder_reset (JsonBuilder *builder) +{ + g_return_if_fail (JSON_IS_BUILDER (builder)); + + json_builder_free_all_state (builder); +} + +/** + * json_builder_begin_object: + * @builder: a #JsonBuilder + * + * Opens a subobject inside the given @builder. When done adding members to + * the subobject, json_builder_end_object() must be called. + * + * Can be called for first or only if the call is associated to an object member + * or an array element. + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_begin_object (JsonBuilder *builder) +{ + JsonObject *object; + JsonBuilderState *state; + JsonBuilderState *cur_state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (builder->priv->root == NULL, NULL); + g_return_val_if_fail (g_queue_is_empty (builder->priv->stack) || json_builder_is_valid_add_mode (builder), NULL); + + object = json_object_new (); + cur_state = g_queue_peek_head (builder->priv->stack); + if (cur_state) + { + switch (cur_state->mode) + { + case JSON_BUILDER_MODE_ARRAY: + json_array_add_object_element (cur_state->data.array, json_object_ref (object)); + break; + + case JSON_BUILDER_MODE_MEMBER: + json_object_set_object_member (cur_state->data.object, cur_state->member_name, json_object_ref (object)); + g_free (cur_state->member_name); + cur_state->member_name = NULL; + cur_state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + default: + g_assert_not_reached (); + } + } + + state = g_slice_new (JsonBuilderState); + state->data.object = object; + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + g_queue_push_head (builder->priv->stack, state); + + return builder; +} + +/** + * json_builder_end_object: + * @builder: a #JsonBuilder + * + * Closes the subobject inside the given @builder that was opened by the most + * recent call to json_builder_begin_object(). + * + * Cannot be called after json_builder_set_member_name(). + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_end_object (JsonBuilder *builder) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_current_mode (builder) == JSON_BUILDER_MODE_OBJECT, NULL); + + state = g_queue_pop_head (builder->priv->stack); + + if (g_queue_is_empty (builder->priv->stack)) + { + builder->priv->root = json_node_new (JSON_NODE_OBJECT); + json_node_take_object (builder->priv->root, json_object_ref (state->data.object)); + } + + json_builder_state_free (state); + + return builder; +} + +/** + * json_builder_begin_array: + * @builder: a #JsonBuilder + * + * Opens a subarray inside the given @builder. When done adding members to + * the subarray, json_builder_end_array() must be called. + * + * Can be called for first or only if the call is associated to an object member + * or an array element. + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_begin_array (JsonBuilder *builder) +{ + JsonArray *array; + JsonBuilderState *state; + JsonBuilderState *cur_state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (builder->priv->root == NULL, NULL); + g_return_val_if_fail (g_queue_is_empty (builder->priv->stack) || json_builder_is_valid_add_mode (builder), NULL); + + array = json_array_new (); + cur_state = g_queue_peek_head (builder->priv->stack); + if (cur_state) + { + switch (cur_state->mode) + { + case JSON_BUILDER_MODE_ARRAY: + json_array_add_array_element (cur_state->data.array, json_array_ref (array)); + break; + + case JSON_BUILDER_MODE_MEMBER: + json_object_set_array_member (cur_state->data.object, cur_state->member_name, json_array_ref (array)); + g_free (cur_state->member_name); + cur_state->member_name = NULL; + cur_state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + default: + g_assert_not_reached (); + } + } + + state = g_slice_new (JsonBuilderState); + state->data.array = array; + state->mode = JSON_BUILDER_MODE_ARRAY; + g_queue_push_head (builder->priv->stack, state); + + return builder; +} + +/** + * json_builder_end_array: + * @builder: a #JsonBuilder + * + * Closes the subarray inside the given @builder that was opened by the most + * recent call to json_builder_begin_array(). + * + * Cannot be called after json_builder_set_member_name(). + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_end_array (JsonBuilder *builder) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_current_mode (builder) == JSON_BUILDER_MODE_ARRAY, NULL); + + state = g_queue_pop_head (builder->priv->stack); + + if (g_queue_is_empty (builder->priv->stack)) + { + builder->priv->root = json_node_new (JSON_NODE_ARRAY); + json_node_take_array (builder->priv->root, json_array_ref (state->data.array)); + } + + json_builder_state_free (state); + + return builder; +} + +/** + * json_builder_set_member_name: + * @builder: a #JsonBuilder + * @member_name: the name of the member + * + * Set the name of the next member in an object. The next call must add a value, + * open an object or an array. + * + * Can be called only if the call is associated to an object. + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_set_member_name (JsonBuilder *builder, + const gchar *member_name) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (member_name != NULL, NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_current_mode (builder) == JSON_BUILDER_MODE_OBJECT, NULL); + + state = g_queue_peek_head (builder->priv->stack); + state->member_name = g_strdup (member_name); + state->mode = JSON_BUILDER_MODE_MEMBER; + + return builder; +} + +/** + * json_builder_add_value: + * @builder: a #JsonBuilder + * @node: the value of the member or element + * + * If called after json_builder_set_member_name(), sets @node as member of the + * most recent opened object, otherwise @node is added as element of the most + * recent opened array. + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_value (JsonBuilder *builder, + JsonNode *node) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_member (state->data.object, state->member_name, node); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_element (state->data.array, node); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} + +/** + * json_builder_add_int_value: + * @builder: a #JsonBuilder + * @value: the value of the member or element + * + * If called after json_builder_set_member_name(), sets @value as member of the + * most recent opened object, otherwise @value is added as element of the most + * recent opened array. + * + * See also: json_builder_add_value() + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_int_value (JsonBuilder *builder, + gint64 value) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_int_member (state->data.object, state->member_name, value); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_int_element (state->data.array, value); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} + +/** + * json_builder_add_double_value: + * @builder: a #JsonBuilder + * @value: the value of the member or element + * + * If called after json_builder_set_member_name(), sets @value as member of the + * most recent opened object, otherwise @value is added as element of the most + * recent opened array. + * + * See also: json_builder_add_value() + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_double_value (JsonBuilder *builder, + gdouble value) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_double_member (state->data.object, state->member_name, value); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_double_element (state->data.array, value); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} + +/** + * json_builder_add_boolean_value: + * @builder: a #JsonBuilder + * @value: the value of the member or element + * + * If called after json_builder_set_member_name(), sets @value as member of the + * most recent opened object, otherwise @value is added as element of the most + * recent opened array. + * + * See also: json_builder_add_value() + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_boolean_value (JsonBuilder *builder, + gboolean value) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_boolean_member (state->data.object, state->member_name, value); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_boolean_element (state->data.array, value); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} + +/** + * json_builder_add_string_value: + * @builder: a #JsonBuilder + * @value: the value of the member or element + * + * If called after json_builder_set_member_name(), sets @value as member of the + * most recent opened object, otherwise @value is added as element of the most + * recent opened array. + * + * See also: json_builder_add_value() + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_string_value (JsonBuilder *builder, + const gchar *value) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_string_member (state->data.object, state->member_name, value); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_string_element (state->data.array, value); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} + +/** + * json_builder_add_null_value: + * @builder: a #JsonBuilder + * + * If called after json_builder_set_member_name(), sets null as member of the + * most recent opened object, otherwise null is added as element of the most + * recent opened array. + * + * See also: json_builder_add_value() + * + * Return value: (transfer none): the #JsonBuilder, or %NULL if the call was inconsistent + */ +JsonBuilder * +json_builder_add_null_value (JsonBuilder *builder) +{ + JsonBuilderState *state; + + g_return_val_if_fail (JSON_IS_BUILDER (builder), NULL); + g_return_val_if_fail (!g_queue_is_empty (builder->priv->stack), NULL); + g_return_val_if_fail (json_builder_is_valid_add_mode (builder), NULL); + + state = g_queue_peek_head (builder->priv->stack); + + switch (state->mode) + { + case JSON_BUILDER_MODE_MEMBER: + json_object_set_null_member (state->data.object, state->member_name); + g_free (state->member_name); + state->member_name = NULL; + state->mode = JSON_BUILDER_MODE_OBJECT; + break; + + case JSON_BUILDER_MODE_ARRAY: + json_array_add_null_element (state->data.array); + break; + + default: + g_assert_not_reached (); + } + + return builder; +} diff --git a/json-glib/json-builder.h b/json-glib/json-builder.h new file mode 100644 index 0000000..dd0bad8 --- /dev/null +++ b/json-glib/json-builder.h @@ -0,0 +1,120 @@ +/* json-builder.h: JSON tree builder + * + * This file is part of JSON-GLib + * Copyright (C) 2010 Luca Bruno + * + * 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, see . + * + * Author: + * Luca Bruno + */ + +#ifndef __JSON_BUILDER_H__ +#define __JSON_BUILDER_H__ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define JSON_TYPE_BUILDER (json_builder_get_type ()) +#define JSON_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_BUILDER, JsonBuilder)) +#define JSON_IS_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_BUILDER)) +#define JSON_BUILDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), JSON_TYPE_BUILDER, JsonBuilderClass)) +#define JSON_IS_BUILDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), JSON_TYPE_BUILDER)) +#define JSON_BUILDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), JSON_TYPE_BUILDER, JsonBuilderClass)) + +typedef struct _JsonBuilder JsonBuilder; +typedef struct _JsonBuilderPrivate JsonBuilderPrivate; +typedef struct _JsonBuilderClass JsonBuilderClass; + +/** + * JsonBuilder: + * + * The `JsonBuilder` structure contains only private data and should be + * accessed using the provided API + * + * Since: 0.12 + */ +struct _JsonBuilder +{ + /*< private >*/ + GObject parent_instance; + + JsonBuilderPrivate *priv; +}; + +/** + * JsonBuilderClass: + * + * The `JsonBuilderClass` structure contains only private data + * + * Since: 0.12 + */ +struct _JsonBuilderClass +{ + /*< private >*/ + GObjectClass parent_class; + + /* padding, for future expansion */ + void (* _json_reserved1) (void); + void (* _json_reserved2) (void); +}; + +JSON_AVAILABLE_IN_1_0 +GType json_builder_get_type (void) G_GNUC_CONST; + +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_new (void); +JSON_AVAILABLE_IN_1_0 +JsonNode *json_builder_get_root (JsonBuilder *builder); +JSON_AVAILABLE_IN_1_0 +void json_builder_reset (JsonBuilder *builder); + +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_begin_array (JsonBuilder *builder); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_end_array (JsonBuilder *builder); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_begin_object (JsonBuilder *builder); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_end_object (JsonBuilder *builder); + +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_set_member_name (JsonBuilder *builder, + const gchar *member_name); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_value (JsonBuilder *builder, + JsonNode *node); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_int_value (JsonBuilder *builder, + gint64 value); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_double_value (JsonBuilder *builder, + gdouble value); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_boolean_value (JsonBuilder *builder, + gboolean value); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_string_value (JsonBuilder *builder, + const gchar *value); +JSON_AVAILABLE_IN_1_0 +JsonBuilder *json_builder_add_null_value (JsonBuilder *builder); + +G_END_DECLS + +#endif /* __JSON_BUILDER_H__ */ diff --git a/json-glib/json-debug.c b/json-glib/json-debug.c new file mode 100644 index 0000000..5e72e43 --- /dev/null +++ b/json-glib/json-debug.c @@ -0,0 +1,37 @@ +#include "config.h" + +#include "json-debug.h" + +static unsigned int json_debug_flags = 0; + +#ifdef JSON_ENABLE_DEBUG +static const GDebugKey json_debug_keys[] = { + { "parser", JSON_DEBUG_PARSER }, + { "gobject", JSON_DEBUG_GOBJECT }, + { "path", JSON_DEBUG_PATH } +}; +#endif /* JSON_ENABLE_DEBUG */ + +JsonDebugFlags +json_get_debug_flags (void) +{ +#ifdef JSON_ENABLE_DEBUG + static gboolean json_debug_flags_set; + const gchar *env_str; + + if (G_LIKELY (json_debug_flags_set)) + return json_debug_flags; + + env_str = g_getenv ("JSON_DEBUG"); + if (env_str != NULL && *env_str != '\0') + { + json_debug_flags |= g_parse_debug_string (env_str, + json_debug_keys, + G_N_ELEMENTS (json_debug_keys)); + } + + json_debug_flags_set = TRUE; +#endif /* JSON_ENABLE_DEBUG */ + + return json_debug_flags; +} diff --git a/json-glib/json-debug.h b/json-glib/json-debug.h new file mode 100644 index 0000000..03ea96b --- /dev/null +++ b/json-glib/json-debug.h @@ -0,0 +1,50 @@ +#ifndef __JSON_DEBUG_H__ +#define __JSON_DEBUG_H__ + +#include + +G_BEGIN_DECLS + +typedef enum { + JSON_DEBUG_PARSER = 1 << 0, + JSON_DEBUG_GOBJECT = 1 << 1, + JSON_DEBUG_PATH = 1 << 2 +} JsonDebugFlags; + +#define JSON_HAS_DEBUG(flag) (json_get_debug_flags () & JSON_DEBUG_##flag) + +#ifdef JSON_ENABLE_DEBUG + +# ifdef __GNUC__ + +# define JSON_NOTE(type,x,a...) G_STMT_START { \ + if (JSON_HAS_DEBUG (type)) { \ + g_message ("[" #type "] " G_STRLOC ": " x, ##a); \ + } } G_STMT_END + +# else +/* Try the C99 version; unfortunately, this does not allow us to pass + * empty arguments to the macro, which means we have to + * do an intemediate printf. + */ +# define JSON_NOTE(type,...) G_STMT_START { \ + if (JSON_HAS_DEBUG (type)) { \ + gchar * _fmt = g_strdup_printf (__VA_ARGS__); \ + g_message ("[" #type "] " G_STRLOC ": %s",_fmt); \ + g_free (_fmt); \ + } } G_STMT_END + +# endif /* __GNUC__ */ + +#else + +#define JSON_NOTE(type,...) G_STMT_START { } G_STMT_END + +#endif /* JSON_ENABLE_DEBUG */ + +G_GNUC_INTERNAL +JsonDebugFlags json_get_debug_flags (void); + +G_END_DECLS + +#endif /* __JSON_DEBUG_H__ */ diff --git a/json-glib/json-enum-types.h.in b/json-glib/json-enum-types.h.in index 96f565e..4ce965d 100644 --- a/json-glib/json-enum-types.h.in +++ b/json-glib/json-enum-types.h.in @@ -1,12 +1,13 @@ /*** BEGIN file-header ***/ +#ifndef __JSON_ENUM_TYPES_H__ +#define __JSON_ENUM_TYPES_H__ + #if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) #error "Only can be included directly." #endif -#ifndef __JSON_ENUM_TYPES_H__ -#define __JSON_ENUM_TYPES_H__ - #include +#include G_BEGIN_DECLS @@ -23,6 +24,7 @@ G_END_DECLS /*** END file-tail ***/ /*** BEGIN value-header ***/ +JSON_AVAILABLE_IN_1_0 GType @enum_name@_get_type (void) G_GNUC_CONST; #define JSON_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) diff --git a/json-glib/json-gboxed.c b/json-glib/json-gboxed.c index cf8e545..ef53af1 100644 --- a/json-glib/json-gboxed.c +++ b/json-glib/json-gboxed.c @@ -32,7 +32,7 @@ * When registering a #GBoxed type you should also register the * corresponding transformation functions, e.g.: * - * |[ + * |[ * GType * my_struct_get_type (void) * { @@ -66,9 +66,7 @@ * and to which specific #JsonNodeType. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include @@ -136,7 +134,7 @@ lookup_boxed_transform (GSList *transforms, } /** - * json_boxed_register_serialize_func: + * json_boxed_register_serialize_func: (skip) * @gboxed_type: a boxed type * @node_type: a node type * @serialize_func: serialization function for @boxed_type into @@ -181,7 +179,7 @@ json_boxed_register_serialize_func (GType gboxed_type, } /** - * json_boxed_register_deserialize_func: + * json_boxed_register_deserialize_func: (skip) * @gboxed_type: a boxed type * @node_type: a node type * @deserialize_func: deserialization function for @boxed_type from @@ -298,9 +296,8 @@ json_boxed_can_deserialize (GType gboxed_type, * Serializes @boxed, a pointer to a #GBoxed of type @gboxed_type, * into a #JsonNode * - * Return value: a #JsonNode with the serialization of the boxed - * type, or %NULL if serialization either failed or was not - * possible + * Return value: (transfer full): a #JsonNode with the serialization of the + * boxed type, or %NULL if serialization either failed or was not possible * * Since: 0.10 */ @@ -328,8 +325,9 @@ json_boxed_serialize (GType gboxed_type, * * Deserializes @node into a #GBoxed of @gboxed_type * - * Return value: the newly allocated #GBoxed. Use g_boxed_free() to - * release the resources allocated by this function + * Return value: (transfer full): the newly allocated #GBoxed. Use + * g_boxed_free() to release the resources allocated by this + * function * * Since: 0.10 */ diff --git a/json-glib/json-generator.c b/json-glib/json-generator.c index c77830e..8eed152 100644 --- a/json-glib/json-generator.c +++ b/json-glib/json-generator.c @@ -29,9 +29,7 @@ * put it into a buffer or a file. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include @@ -41,9 +39,6 @@ #include "json-marshal.h" #include "json-generator.h" -#define JSON_GENERATOR_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((obj), JSON_TYPE_GENERATOR, JsonGeneratorPrivate)) - struct _JsonGeneratorPrivate { JsonNode *root; @@ -61,13 +56,16 @@ enum PROP_PRETTY, PROP_INDENT, PROP_ROOT, - PROP_INDENT_CHAR + PROP_INDENT_CHAR, + + PROP_LAST }; static gchar *dump_value (JsonGenerator *generator, gint level, const gchar *name, - JsonNode *node); + JsonNode *node, + gsize *length); static gchar *dump_array (JsonGenerator *generator, gint level, const gchar *name, @@ -79,45 +77,69 @@ static gchar *dump_object (JsonGenerator *generator, JsonObject *object, gsize *length); -/* non-ASCII characters can't be escaped, otherwise UTF-8 - * chars will break, so we just pregenerate this table of - * high characters and then we feed it to g_strescape() - */ -static const char json_exceptions[] = { - 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, - 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, - 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, - 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, - 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, - 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, - 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, - 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, - 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, - 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, - 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, - 0xff, - '\0' /* g_strescape() expects a NUL-terminated string */ -}; +static GParamSpec *generator_props[PROP_LAST] = { NULL, }; -G_DEFINE_TYPE (JsonGenerator, json_generator, G_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_PRIVATE (JsonGenerator, json_generator, G_TYPE_OBJECT) static gchar * json_strescape (const gchar *str) { - return g_strescape (str, json_exceptions); + const gchar *p; + const gchar *end; + GString *output; + gsize len; + + len = strlen (str); + end = str + len; + output = g_string_sized_new (len); + + for (p = str; p < end; p++) + { + if (*p == '\\' || *p == '"') + { + g_string_append_c (output, '\\'); + g_string_append_c (output, *p); + } + else if ((*p > 0 && *p < 0x1f) || *p == 0x7f) + { + switch (*p) + { + case '\b': + g_string_append (output, "\\b"); + break; + case '\f': + g_string_append (output, "\\f"); + break; + case '\n': + g_string_append (output, "\\n"); + break; + case '\r': + g_string_append (output, "\\r"); + break; + case '\t': + g_string_append (output, "\\t"); + break; + default: + g_string_append_printf (output, "\\u00%02x", (guint)*p); + break; + } + } + else + { + g_string_append_c (output, *p); + } + } + + return g_string_free (output, FALSE); } static void json_generator_finalize (GObject *gobject) { - JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject); + JsonGeneratorPrivate *priv; - if (priv->root) + priv = json_generator_get_instance_private ((JsonGenerator *) gobject); + if (priv->root != NULL) json_node_free (priv->root); G_OBJECT_CLASS (json_generator_parent_class)->finalize (gobject); @@ -129,23 +151,26 @@ json_generator_set_property (GObject *gobject, const GValue *value, GParamSpec *pspec) { - JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject); + JsonGenerator *generator = JSON_GENERATOR (gobject); switch (prop_id) { case PROP_PRETTY: - priv->pretty = g_value_get_boolean (value); + json_generator_set_pretty (generator, g_value_get_boolean (value)); break; + case PROP_INDENT: - priv->indent = g_value_get_uint (value); + json_generator_set_indent (generator, g_value_get_uint (value)); break; + case PROP_INDENT_CHAR: - priv->indent_char = g_value_get_uint (value); + json_generator_set_indent_char (generator, g_value_get_uint (value)); break; + case PROP_ROOT: - json_generator_set_root (JSON_GENERATOR (gobject), - g_value_get_boxed (value)); + json_generator_set_root (generator, g_value_get_boxed (value)); break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -158,7 +183,7 @@ json_generator_get_property (GObject *gobject, GValue *value, GParamSpec *pspec) { - JsonGeneratorPrivate *priv = JSON_GENERATOR_GET_PRIVATE (gobject); + JsonGeneratorPrivate *priv = JSON_GENERATOR (gobject)->priv; switch (prop_id) { @@ -185,12 +210,6 @@ json_generator_class_init (JsonGeneratorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (JsonGeneratorPrivate)); - - gobject_class->set_property = json_generator_set_property; - gobject_class->get_property = json_generator_get_property; - gobject_class->finalize = json_generator_finalize; - /** * JsonGenerator:pretty: * @@ -198,26 +217,26 @@ json_generator_class_init (JsonGeneratorClass *klass) * newlines. The indentation level can be controlled by using the * JsonGenerator:indent property */ - g_object_class_install_property (gobject_class, - PROP_PRETTY, - g_param_spec_boolean ("pretty", - "Pretty", - "Pretty-print the output", - FALSE, - G_PARAM_READWRITE)); + generator_props[PROP_PRETTY] = + g_param_spec_boolean ("pretty", + "Pretty", + "Pretty-print the output", + FALSE, + G_PARAM_READWRITE); + /** * JsonGenerator:indent: * * Number of spaces to be used to indent when pretty printing. */ - g_object_class_install_property (gobject_class, - PROP_INDENT, - g_param_spec_uint ("indent", - "Indent", - "Number of indentation spaces", - 0, G_MAXUINT, - 2, - G_PARAM_READWRITE)); + generator_props[PROP_INDENT] = + g_param_spec_uint ("indent", + "Indent", + "Number of indentation spaces", + 0, G_MAXUINT, + 2, + G_PARAM_READWRITE); + /** * JsonGenerator:root: * @@ -226,13 +245,13 @@ json_generator_class_init (JsonGeneratorClass *klass) * * Since: 0.4 */ - g_object_class_install_property (gobject_class, - PROP_ROOT, - g_param_spec_boxed ("root", - "Root", - "Root of the JSON data tree", - JSON_TYPE_NODE, - G_PARAM_READWRITE)); + generator_props[PROP_ROOT] = + g_param_spec_boxed ("root", + "Root", + "Root of the JSON data tree", + JSON_TYPE_NODE, + G_PARAM_READWRITE); + /** * JsonGenerator:indent-char: * @@ -240,21 +259,25 @@ json_generator_class_init (JsonGeneratorClass *klass) * * Since: 0.6 */ - g_object_class_install_property (gobject_class, - PROP_INDENT_CHAR, - g_param_spec_unichar ("indent-char", - "Indent Char", - "Character that should be used when indenting", - ' ', - G_PARAM_READWRITE)); + generator_props[PROP_INDENT_CHAR] = + g_param_spec_unichar ("indent-char", + "Indent Char", + "Character that should be used when indenting", + ' ', + G_PARAM_READWRITE); + + gobject_class->set_property = json_generator_set_property; + gobject_class->get_property = json_generator_get_property; + gobject_class->finalize = json_generator_finalize; + g_object_class_install_properties (gobject_class, PROP_LAST, generator_props); } static void json_generator_init (JsonGenerator *generator) { - JsonGeneratorPrivate *priv; + JsonGeneratorPrivate *priv = json_generator_get_instance_private (generator); - generator->priv = priv = JSON_GENERATOR_GET_PRIVATE (generator); + generator->priv = priv; priv->pretty = FALSE; priv->indent = 2; @@ -265,12 +288,13 @@ static gchar * dump_value (JsonGenerator *generator, gint level, const gchar *name, - JsonNode *node) + JsonNode *node, + gsize *length) { JsonGeneratorPrivate *priv = generator->priv; gboolean pretty = priv->pretty; guint indent = priv->indent; - GValue value = { 0, }; + const JsonValue *value; GString *buffer; buffer = g_string_new (""); @@ -283,47 +307,59 @@ dump_value (JsonGenerator *generator, g_string_append_c (buffer, priv->indent_char); } - if (name && name[0] != '\0') - g_string_append_printf (buffer, "\"%s\" : ", name); + if (name) + { + if (pretty) + g_string_append_printf (buffer, "\"%s\" : ", name); + else + g_string_append_printf (buffer, "\"%s\":", name); + } - json_node_get_value (node, &value); + value = node->data.value; - switch (G_VALUE_TYPE (&value)) + switch (value->type) { - case G_TYPE_INT64: - g_string_append_printf (buffer, "%" G_GINT64_FORMAT, g_value_get_int64 (&value)); + case JSON_VALUE_INT: + g_string_append_printf (buffer, "%" G_GINT64_FORMAT, json_value_get_int (value)); break; - case G_TYPE_STRING: + case JSON_VALUE_STRING: { gchar *tmp; - tmp = json_strescape (g_value_get_string (&value)); - g_string_append_printf (buffer, "\"%s\"", tmp); + tmp = json_strescape (json_value_get_string (value)); + g_string_append_c (buffer, '"'); + g_string_append (buffer, tmp); + g_string_append_c (buffer, '"'); g_free (tmp); } break; - case G_TYPE_DOUBLE: + case JSON_VALUE_DOUBLE: { - gchar buf[65]; + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; - g_ascii_formatd (buf, 65, "%g", g_value_get_double (&value)); - g_string_append (buffer, buf); + g_string_append (buffer, + g_ascii_dtostr (buf, sizeof (buf), + json_value_get_double (value))); } break; - case G_TYPE_BOOLEAN: - g_string_append_printf (buffer, "%s", - g_value_get_boolean (&value) ? "true" : "false"); + case JSON_VALUE_BOOLEAN: + g_string_append (buffer, json_value_get_boolean (value) ? "true" : "false"); + break; + + case JSON_VALUE_NULL: + g_string_append (buffer, "null"); break; default: break; } - g_value_unset (&value); + if (length) + *length = buffer->len; return g_string_free (buffer, FALSE); } @@ -350,15 +386,18 @@ dump_array (JsonGenerator *generator, g_string_append_c (buffer, priv->indent_char); } - if (name && name[0] != '\0') - g_string_append_printf (buffer, "\"%s\" : ", name); + if (name) + { + if (pretty) + g_string_append_printf (buffer, "\"%s\" : ", name); + else + g_string_append_printf (buffer, "\"%s\":", name); + } g_string_append_c (buffer, '['); if (pretty) g_string_append_c (buffer, '\n'); - else - g_string_append_c (buffer, ' '); for (i = 0; i < array_len; i++) { @@ -379,7 +418,7 @@ dump_array (JsonGenerator *generator, break; case JSON_NODE_VALUE: - value = dump_value (generator, sub_level, NULL, cur); + value = dump_value (generator, sub_level, NULL, cur, NULL); g_string_append (buffer, value); g_free (value); break; @@ -402,8 +441,6 @@ dump_array (JsonGenerator *generator, if (pretty) g_string_append_c (buffer, '\n'); - else - g_string_append_c (buffer, ' '); } if (pretty) @@ -442,21 +479,25 @@ dump_object (JsonGenerator *generator, g_string_append_c (buffer, priv->indent_char); } - if (name && name[0] != '\0') - g_string_append_printf (buffer, "\"%s\" : ", name); + if (name) + { + if (pretty) + g_string_append_printf (buffer, "\"%s\" : ", name); + else + g_string_append_printf (buffer, "\"%s\":", name); + } g_string_append_c (buffer, '{'); if (pretty) g_string_append_c (buffer, '\n'); - else - g_string_append_c (buffer, ' '); members = json_object_get_members (object); for (l = members; l != NULL; l = l->next) { const gchar *member_name = l->data; + gchar *escaped_name = json_strescape (member_name); JsonNode *cur = json_object_get_member (object, member_name); guint sub_level = level + 1; guint j; @@ -469,25 +510,29 @@ dump_object (JsonGenerator *generator, { for (j = 0; j < (sub_level * indent); j++) g_string_append_c (buffer, priv->indent_char); + g_string_append_printf (buffer, "\"%s\" : null", escaped_name); + } + else + { + g_string_append_printf (buffer, "\"%s\":null", escaped_name); } - g_string_append_printf (buffer, "\"%s\" : null", member_name); break; case JSON_NODE_VALUE: - value = dump_value (generator, sub_level, member_name, cur); + value = dump_value (generator, sub_level, escaped_name, cur, NULL); g_string_append (buffer, value); g_free (value); break; case JSON_NODE_ARRAY: - value = dump_array (generator, sub_level, member_name, + value = dump_array (generator, sub_level, escaped_name, json_node_get_array (cur), NULL); g_string_append (buffer, value); g_free (value); break; case JSON_NODE_OBJECT: - value = dump_object (generator, sub_level, member_name, + value = dump_object (generator, sub_level, escaped_name, json_node_get_object (cur), NULL); g_string_append (buffer, value); g_free (value); @@ -499,8 +544,8 @@ dump_object (JsonGenerator *generator, if (pretty) g_string_append_c (buffer, '\n'); - else - g_string_append_c (buffer, ' '); + + g_free (escaped_name); } g_list_free (members); @@ -524,7 +569,7 @@ dump_object (JsonGenerator *generator, * * Creates a new #JsonGenerator. You can use this object to generate a * JSON data stream starting from a data object model composed by - * #JsonNodes. + * #JsonNodes. * * Return value: the newly created #JsonGenerator instance */ @@ -581,7 +626,7 @@ json_generator_to_data (JsonGenerator *generator, break; case JSON_NODE_VALUE: - retval = NULL; + retval = dump_value (generator, 0, NULL, root, length); break; } @@ -619,6 +664,43 @@ json_generator_to_file (JsonGenerator *generator, } /** + * json_generator_to_stream: + * @generator: a #JsonGenerator + * @stream: a #GOutputStream + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Outputs JSON data and streams it (synchronously) to @stream. + * + * Return value: %TRUE if the write operation was successful, and %FALSE + * on failure. In case of error, the #GError will be filled accordingly + * + * Since: 0.12 + */ +gboolean +json_generator_to_stream (JsonGenerator *generator, + GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gboolean retval; + gchar *buffer; + gsize len; + + g_return_val_if_fail (JSON_IS_GENERATOR (generator), FALSE); + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + buffer = json_generator_to_data (generator, &len); + retval = g_output_stream_write (stream, buffer, len, cancellable, error); + g_free (buffer); + + return retval; +} + +/** * json_generator_set_root: * @generator: a #JsonGenerator * @node: a #JsonNode @@ -626,8 +708,8 @@ json_generator_to_file (JsonGenerator *generator, * Sets @node as the root of the JSON data stream to be serialized by * the #JsonGenerator. * - * The node is copied by the generator object, so it can be safely - * freed after calling this function. + * The passed @node is copied by the generator object, so it can be + * safely freed after calling this function. */ void json_generator_set_root (JsonGenerator *generator, @@ -635,12 +717,178 @@ json_generator_set_root (JsonGenerator *generator, { g_return_if_fail (JSON_IS_GENERATOR (generator)); - if (generator->priv->root) + if (generator->priv->root == node) + return; + + if (generator->priv->root != NULL) { json_node_free (generator->priv->root); generator->priv->root = NULL; } - if (node) + if (node != NULL) generator->priv->root = json_node_copy (node); + + g_object_notify_by_pspec (G_OBJECT (generator), generator_props[PROP_ROOT]); +} + +/** + * json_generator_get_root: + * @generator: a #JsonGenerator + * + * Retrieves a pointer to the root #JsonNode set using + * json_generator_set_root(). + * + * Return value: (transfer none): a #JsonNode, or %NULL. The returned node + * is owned by the #JsonGenerator and it should not be freed + * + * Since: 0.14 + */ +JsonNode * +json_generator_get_root (JsonGenerator *generator) +{ + g_return_val_if_fail (JSON_IS_GENERATOR (generator), NULL); + + return generator->priv->root; +} + +/** + * json_generator_set_pretty: + * @generator: a #JsonGenerator + * @is_pretty: whether the generated string should be pretty printed + * + * Sets whether the generated JSON should be pretty printed, using the + * indentation character specified in the #JsonGenerator:indent-char + * property and the spacing specified in #JsonGenerator:indent property. + * + * Since: 0.14 + */ +void +json_generator_set_pretty (JsonGenerator *generator, + gboolean is_pretty) +{ + JsonGeneratorPrivate *priv; + + g_return_if_fail (JSON_IS_GENERATOR (generator)); + + priv = generator->priv; + + is_pretty = !!is_pretty; + + if (priv->pretty != is_pretty) + { + priv->pretty = is_pretty; + + g_object_notify_by_pspec (G_OBJECT (generator), generator_props[PROP_PRETTY]); + } +} + +/** + * json_generator_get_pretty: + * @generator: a #JsonGenerator + * + * Retrieves the value set using json_generator_set_pretty(). + * + * Return value: %TRUE if the generated JSON should be pretty-printed, and + * %FALSE otherwise + * + * Since: 0.14 + */ +gboolean +json_generator_get_pretty (JsonGenerator *generator) +{ + g_return_val_if_fail (JSON_IS_GENERATOR (generator), FALSE); + + return generator->priv->pretty; +} + +/** + * json_generator_set_indent: + * @generator: a #JsonGenerator + * @indent_level: the number of repetitions of the indentation character + * that should be applied when pretty printing + * + * Sets the number of repetitions for each indentation level. + * + * Since: 0.14 + */ +void +json_generator_set_indent (JsonGenerator *generator, + guint indent_level) +{ + JsonGeneratorPrivate *priv; + + g_return_if_fail (JSON_IS_GENERATOR (generator)); + + priv = generator->priv; + + if (priv->indent != indent_level) + { + priv->indent = indent_level; + + g_object_notify_by_pspec (G_OBJECT (generator), generator_props[PROP_INDENT]); + } +} + +/** + * json_generator_get_indent: + * @generator: a #JsonGenerator + * + * Retrieves the value set using json_generator_set_indent(). + * + * Return value: the number of repetitions per indentation level + * + * Since: 0.14 + */ +guint +json_generator_get_indent (JsonGenerator *generator) +{ + g_return_val_if_fail (JSON_IS_GENERATOR (generator), FALSE); + + return generator->priv->indent; +} + +/** + * json_generator_set_indent_char: + * @generator: a #JsonGenerator + * @indent_char: a Unicode character to be used when indenting + * + * Sets the character to be used when indenting + * + * Since: 0.14 + */ +void +json_generator_set_indent_char (JsonGenerator *generator, + gunichar indent_char) +{ + JsonGeneratorPrivate *priv; + + g_return_if_fail (JSON_IS_GENERATOR (generator)); + + priv = generator->priv; + + if (priv->indent_char != indent_char) + { + priv->indent_char = indent_char; + + g_object_notify_by_pspec (G_OBJECT (generator), generator_props[PROP_INDENT_CHAR]); + } +} + +/** + * json_generator_get_indent_char: + * @generator: a #JsonGenerator + * + * Retrieves the value set using json_generator_set_indent_char(). + * + * Return value: the character to be used when indenting + * + * Since: 0.14 + */ +gunichar +json_generator_get_indent_char (JsonGenerator *generator) +{ + g_return_val_if_fail (JSON_IS_GENERATOR (generator), FALSE); + + return generator->priv->indent_char; } diff --git a/json-glib/json-generator.h b/json-glib/json-generator.h index 743ec27..99c1b1d 100644 --- a/json-glib/json-generator.h +++ b/json-glib/json-generator.h @@ -21,14 +21,15 @@ * Emmanuele Bassi */ +#ifndef __JSON_GENERATOR_H__ +#define __JSON_GENERATOR_H__ + #if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) #error "Only can be included directly." #endif -#ifndef __JSON_GENERATOR_H__ -#define __JSON_GENERATOR_H__ - #include +#include G_BEGIN_DECLS @@ -74,16 +75,45 @@ struct _JsonGeneratorClass void (* _json_reserved4) (void); }; +JSON_AVAILABLE_IN_1_0 GType json_generator_get_type (void) G_GNUC_CONST; -JsonGenerator *json_generator_new (void); -gchar * json_generator_to_data (JsonGenerator *generator, - gsize *length); -gboolean json_generator_to_file (JsonGenerator *generator, - const gchar *filename, - GError **error); -void json_generator_set_root (JsonGenerator *generator, - JsonNode *node); +JSON_AVAILABLE_IN_1_0 +JsonGenerator * json_generator_new (void); + +JSON_AVAILABLE_IN_1_0 +void json_generator_set_pretty (JsonGenerator *generator, + gboolean is_pretty); +JSON_AVAILABLE_IN_1_0 +gboolean json_generator_get_pretty (JsonGenerator *generator); +JSON_AVAILABLE_IN_1_0 +void json_generator_set_indent (JsonGenerator *generator, + guint indent_level); +JSON_AVAILABLE_IN_1_0 +guint json_generator_get_indent (JsonGenerator *generator); +JSON_AVAILABLE_IN_1_0 +void json_generator_set_indent_char (JsonGenerator *generator, + gunichar indent_char); +JSON_AVAILABLE_IN_1_0 +gunichar json_generator_get_indent_char (JsonGenerator *generator); +JSON_AVAILABLE_IN_1_0 +void json_generator_set_root (JsonGenerator *generator, + JsonNode *node); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_generator_get_root (JsonGenerator *generator); + +JSON_AVAILABLE_IN_1_0 +gchar * json_generator_to_data (JsonGenerator *generator, + gsize *length); +JSON_AVAILABLE_IN_1_0 +gboolean json_generator_to_file (JsonGenerator *generator, + const gchar *filename, + GError **error); +JSON_AVAILABLE_IN_1_0 +gboolean json_generator_to_stream (JsonGenerator *generator, + GOutputStream *stream, + GCancellable *cancellable, + GError **error); G_END_DECLS diff --git a/json-glib/json-glib-format.c b/json-glib/json-glib-format.c new file mode 100644 index 0000000..d39b325 --- /dev/null +++ b/json-glib/json-glib-format.c @@ -0,0 +1,220 @@ +/* json-glib-format - Formats JSON data + * + * This file is part of JSON-GLib + * + * Copyright © 2013 Emmanuele Bassi + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#if defined (G_OS_WIN32) && !defined (HAVE_UNISTD_H) +#include + +#define STDOUT_FILENO 1 +#endif + +static char **files = NULL; +static gboolean prettify = FALSE; +static int indent_spaces = 2; + +static GOptionEntry entries[] = { + { "prettify", 'p', 0, G_OPTION_ARG_NONE, &prettify, N_("Prettify output"), NULL }, + { "indent-spaces", 'i', 0, G_OPTION_ARG_INT, &indent_spaces, N_("Indentation spaces"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &files, NULL, NULL }, + { NULL }, +}; + +static gboolean +format (JsonParser *parser, + JsonGenerator *generator, + GFile *file) +{ + GInputStream *in; + GError *error; + gboolean res = TRUE; + gboolean parse_res; + gboolean close_res; + char *data, *p; + gsize len; + + error = NULL; + + in = (GInputStream *) g_file_read (file, NULL, &error); + if (in == NULL) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error opening file: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_error_free (error); + return FALSE; + } + + parse_res = json_parser_load_from_stream (parser, in, NULL, &error); + if (!parse_res) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error parsing file: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_clear_error (&error); + res = FALSE; + goto out; + } + + json_generator_set_root (generator, json_parser_get_root (parser)); + data = json_generator_to_data (generator, &len); + p = data; + while (len > 0) + { + gssize written = write (STDOUT_FILENO, p, len); + + if (written == -1 && errno != EINTR) + { + /* Translators: the first %s is the program name, the + * second one is the URI of the file. + */ + g_printerr (_("%s: %s: error writing to stdout"), g_get_prgname (), g_file_get_uri (file)); + res = FALSE; + goto out; + } + + len -= written; + p += written; + } + + write (STDOUT_FILENO, "\n", 1); + + g_free (data); + +out: + close_res = g_input_stream_close (in, NULL, &error); + if (!close_res) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error closing: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_clear_error (&error); + res = FALSE; + } + + return res; +} + +int +main (int argc, + char *argv[]) +{ + GOptionContext *context = NULL; + GError *error = NULL; + const char *description; + const char *summary; + gchar *param; + JsonParser *parser; + JsonGenerator *generator; + gboolean res; + int i; + + setlocale (LC_ALL, ""); + + bindtextdomain (GETTEXT_PACKAGE, JSON_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + param = g_strdup_printf (("%s..."), _("FILE")); + /* Translators: this message will appear after the usage string */ + /* and before the list of options. */ + summary = _("Format JSON files."); + description = _("json-glib-format formats JSON resources."); + + context = g_option_context_new (param); + g_option_context_set_summary (context, summary); + g_option_context_set_description (context, description); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + g_option_context_parse (context, &argc, &argv, &error); + g_option_context_free (context); + + g_free (param); + + if (error != NULL) + { + /* Translators: the %s is the program name. This error message + * means the user is calling json-glib-validate without any + * argument. + */ + g_printerr (_("Error parsing commandline options: %s\n"), error->message); + g_printerr ("\n"); + g_printerr (_("Try \"%s --help\" for more information."), g_get_prgname ()); + g_printerr ("\n"); + g_error_free (error); + return 1; + } + + if (files == NULL) + { + /* Translators: the %s is the program name. This error message + * means the user is calling json-glib-validate without any + * argument. + */ + g_printerr (_("%s: missing files"), g_get_prgname ()); + g_printerr ("\n"); + g_printerr (_("Try \"%s --help\" for more information."), g_get_prgname ()); + g_printerr ("\n"); + return 1; + } + + generator = json_generator_new (); + json_generator_set_pretty (generator, prettify); + json_generator_set_indent (generator, indent_spaces); + + parser = json_parser_new (); + res = TRUE; + i = 0; + + do + { + GFile *file = g_file_new_for_commandline_arg (files[i]); + + res = format (parser, generator, file) && res; + g_object_unref (file); + } + while (files[++i] != NULL); + + g_object_unref (parser); + g_object_unref (generator); + + return res ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/json-glib/json-glib-validate.c b/json-glib/json-glib-validate.c new file mode 100644 index 0000000..2eb013a --- /dev/null +++ b/json-glib/json-glib-validate.c @@ -0,0 +1,173 @@ +/* json-glib-validate - Checks JSON data for errors + * + * This file is part of JSON-GLib + * + * Copyright © 2013 Emmanuele Bassi + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include + +#include +#include +#include + +static char **files = NULL; + +static GOptionEntry entries[] = { + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &files, NULL, NULL }, + { NULL }, +}; + +static gboolean +validate (JsonParser *parser, + GFile *file) +{ + GInputStream *in; + GError *error; + gboolean res = TRUE; + gboolean parse_res; + gboolean close_res; + + error = NULL; + + in = (GInputStream *) g_file_read (file, NULL, &error); + if (in == NULL) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error opening file: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_error_free (error); + return FALSE; + } + + parse_res = json_parser_load_from_stream (parser, in, NULL, &error); + if (!parse_res) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error parsing file: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_clear_error (&error); + res = FALSE; + } + + close_res = g_input_stream_close (in, NULL, &error); + if (!close_res) + { + /* Translators: the first %s is the program name, the second one + * is the URI of the file, the third is the error message. + */ + g_printerr (_("%s: %s: error closing: %s\n"), + g_get_prgname (), g_file_get_uri (file), error->message); + g_clear_error (&error); + res = FALSE; + } + + return res; +} + +int +main (int argc, + char *argv[]) +{ + GOptionContext *context = NULL; + GError *error = NULL; + const char *description; + const char *summary; + gchar *param; + JsonParser *parser; + gboolean res; + int i; + + setlocale (LC_ALL, ""); + + bindtextdomain (GETTEXT_PACKAGE, JSON_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + param = g_strdup_printf (("%s..."), _("FILE")); + /* Translators: this message will appear after the usage string */ + /* and before the list of options. */ + summary = _("Validate JSON files."); + description = _("json-glib-validate validates JSON data at the given URI."); + + context = g_option_context_new (param); + g_option_context_set_summary (context, summary); + g_option_context_set_description (context, description); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + g_option_context_parse (context, &argc, &argv, &error); + g_option_context_free (context); + + g_free (param); + + if (error != NULL) + { + /* Translators: the %s is the program name. This error message + * means the user is calling json-glib-validate without any + * argument. + */ + g_printerr (_("Error parsing commandline options: %s\n"), error->message); + g_printerr ("\n"); + g_printerr (_("Try \"%s --help\" for more information."), g_get_prgname ()); + g_printerr ("\n"); + g_error_free (error); + return 1; + } + + if (files == NULL) + { + /* Translators: the %s is the program name. This error message + * means the user is calling json-glib-validate without any + * argument. + */ + g_printerr (_("%s: missing files"), g_get_prgname ()); + g_printerr ("\n"); + g_printerr (_("Try \"%s --help\" for more information."), g_get_prgname ()); + g_printerr ("\n"); + return 1; + } + + parser = json_parser_new (); + res = TRUE; + i = 0; + + do + { + GFile *file = g_file_new_for_commandline_arg (files[i]); + + res = validate (parser, file) && res; + g_object_unref (file); + } + while (files[++i] != NULL); + + g_object_unref (parser); + + return res ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/json-glib/json-glib.h b/json-glib/json-glib.h index 794a8be..8a0e7f7 100644 --- a/json-glib/json-glib.h +++ b/json-glib/json-glib.h @@ -27,13 +27,21 @@ #define __JSON_GLIB_INSIDE__ #include + +#include #include #include +#include +#include #include +#include + #include #include +#include + #undef __JSON_GLIB_INSIDE__ #endif /* __JSON_GLIB_H__ */ diff --git a/json-glib/json-glib.pc.in b/json-glib/json-glib.pc.in new file mode 100644 index 0000000..1a86ead --- /dev/null +++ b/json-glib/json-glib.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: JSON-GLib +Description: JSON Parser for GLib +Version: @VERSION@ +Libs: -L${libdir} -ljson-glib-1.0 +Cflags: -I${includedir}/json-glib-1.0 +Requires: gobject-2.0 gio-2.0 diff --git a/json-glib/json-gobject.c b/json-glib/json-gobject.c index ae98b2b..3beb0e6 100644 --- a/json-glib/json-gobject.c +++ b/json-glib/json-gobject.c @@ -21,8 +21,8 @@ * SECTION:json-gobject * @short_description: Serialize and deserialize GObjects * - * JSON-GLib provides API for serializing and deserializing #GObjects - * to and from JSON data streams. + * JSON-GLib provides API for serializing and deserializing #GObject + * instances to and from JSON data streams. * * Simple #GObject classes can be (de)serialized into JSON objects, if the * properties have compatible types with the native JSON types (integers, @@ -32,16 +32,17 @@ * and its virtual functions. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include +#include + #include "json-types-private.h" #include "json-gobject-private.h" +#include "json-debug.h" #include "json-parser.h" #include "json-generator.h" @@ -179,7 +180,9 @@ json_gobject_new (GType gtype, { JsonSerializableIface *iface = NULL; JsonSerializable *serializable = NULL; + gboolean find_property; gboolean deserialize_property; + gboolean set_property; GList *members, *members_left, *l; guint n_members; GObjectClass *klass; @@ -193,13 +196,11 @@ json_gobject_new (GType gtype, members = json_object_get_members (object); members_left = NULL; - /* first pass: construct and construct-only properties; here - * we cannot use Serializable because we don't have an - * instance yet; we use the default implementation of - * json_deserialize_pspec() to deserialize known types + /* first pass: construct-only properties; here we cannot use Serializable + * because we don't have an instance yet; we use the default implementation + * of json_deserialize_pspec() to deserialize known types * - * FIXME - find a way to allow deserialization for these - * properties + * FIXME - find a way to allow deserialization for these properties */ construct_params = g_array_sized_new (FALSE, FALSE, sizeof (GParameter), n_members); @@ -215,8 +216,8 @@ json_gobject_new (GType gtype, if (!pspec) goto next_member; - if (!(pspec->flags & G_PARAM_CONSTRUCT_ONLY) || - !(pspec->flags & G_PARAM_CONSTRUCT_ONLY)) + /* we only apply construct-only properties here */ + if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) == 0) goto next_member; if (!(pspec->flags & G_PARAM_WRITABLE)) @@ -227,7 +228,12 @@ json_gobject_new (GType gtype, val = json_object_get_member (object, member_name); res = json_deserialize_pspec (¶m.value, pspec, val); if (!res) - g_value_unset (¶m.value); + { + g_warning ("Failed to deserialize \"%s\" property of type \"%s\" for an object of type \"%s\"", + pspec->name, G_VALUE_TYPE_NAME (¶m.value), g_type_name (gtype)); + + g_value_unset (¶m.value); + } else { param.name = g_strdup (pspec->name); @@ -267,10 +273,16 @@ json_gobject_new (GType gtype, { serializable = JSON_SERIALIZABLE (retval); iface = JSON_SERIALIZABLE_GET_IFACE (serializable); + find_property = (iface->find_property != NULL); deserialize_property = (iface->deserialize_property != NULL); + set_property = (iface->set_property != NULL); } else - deserialize_property = FALSE; + { + find_property = FALSE; + deserialize_property = FALSE; + set_property = FALSE; + } g_object_freeze_notify (retval); @@ -282,13 +294,16 @@ json_gobject_new (GType gtype, GValue value = { 0, }; gboolean res = FALSE; - pspec = g_object_class_find_property (klass, member_name); - if (!pspec) + if (find_property) + pspec = json_serializable_find_property (serializable, member_name); + else + pspec = g_object_class_find_property (klass, member_name); + + if (pspec == NULL) continue; /* we should have dealt with these above */ - if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) || - (pspec->flags & G_PARAM_CONSTRUCT)) + if (pspec->flags & G_PARAM_CONSTRUCT_ONLY) continue; if (!(pspec->flags & G_PARAM_WRITABLE)) @@ -300,20 +315,34 @@ json_gobject_new (GType gtype, if (deserialize_property) { - res = iface->deserialize_property (serializable, pspec->name, - &value, - pspec, - val); + JSON_NOTE (GOBJECT, "Using JsonSerializable for property '%s'", pspec->name); + res = json_serializable_deserialize_property (serializable, + pspec->name, + &value, + pspec, + val); } if (!res) - res = json_deserialize_pspec (&value, pspec, val); + { + JSON_NOTE (GOBJECT, "Using json_deserialize_pspec for property '%s'", pspec->name); + res = json_deserialize_pspec (&value, pspec, val); + } - /* FIXME - we probably want to be able to have a custom - * set_property() for Serializable implementations - */ if (res) - g_object_set_property (retval, pspec->name, &value); + { + JSON_NOTE (GOBJECT, "Calling set_property('%s', '%s')", + pspec->name, + g_type_name (G_VALUE_TYPE (&value))); + + if (set_property) + json_serializable_set_property (serializable, pspec, &value); + else + g_object_set_property (retval, pspec->name, &value); + } + else + g_warning ("Failed to deserialize \"%s\" property of type \"%s\" for an object of type \"%s\"", + pspec->name, g_type_name (G_VALUE_TYPE (&value)), g_type_name (gtype)); g_value_unset (&value); } @@ -332,7 +361,9 @@ json_gobject_dump (GObject *gobject) { JsonSerializableIface *iface = NULL; JsonSerializable *serializable = NULL; + gboolean list_properties = FALSE; gboolean serialize_property = FALSE; + gboolean get_property = FALSE; JsonObject *object; GParamSpec **pspecs; guint n_pspecs, i; @@ -341,12 +372,18 @@ json_gobject_dump (GObject *gobject) { serializable = JSON_SERIALIZABLE (gobject); iface = JSON_SERIALIZABLE_GET_IFACE (gobject); + list_properties = (iface->list_properties != NULL); serialize_property = (iface->serialize_property != NULL); + get_property = (iface->get_property != NULL); } object = json_object_new (); - pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (gobject), &n_pspecs); + if (list_properties) + pspecs = json_serializable_list_properties (serializable, &n_pspecs); + else + pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (gobject), &n_pspecs); + for (i = 0; i < n_pspecs; i++) { GParamSpec *pspec = pspecs[i]; @@ -358,7 +395,11 @@ json_gobject_dump (GObject *gobject) continue; g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - g_object_get_property (gobject, pspec->name, &value); + + if (get_property) + json_serializable_get_property (serializable, pspec, &value); + else + g_object_get_property (gobject, pspec->name, &value); /* if there is a serialization vfunc, then it is completely responsible * for serializing the property, possibly by calling the implementation @@ -366,11 +407,13 @@ json_gobject_dump (GObject *gobject) */ if (serialize_property) { - node = iface->serialize_property (serializable, pspec->name, - &value, - pspec); + node = json_serializable_serialize_property (serializable, + pspec->name, + &value, + pspec); } - else + /* skip if the value is the default for the property */ + else if (!g_param_value_defaults (pspec, &value)) node = json_serialize_pspec (&value, pspec); if (node) @@ -470,35 +513,73 @@ json_deserialize_pspec (GValue *value, { case G_TYPE_BOOLEAN: case G_TYPE_INT64: - case G_TYPE_DOUBLE: case G_TYPE_STRING: - g_value_copy (&node_value, value); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_VALUE_TYPE (value))) + { + g_value_copy (&node_value, value); + retval = TRUE; + } break; case G_TYPE_INT: - g_value_set_int (value, (gint) g_value_get_int64 (&node_value)); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_int (value, (gint) g_value_get_int64 (&node_value)); + retval = TRUE; + } break; case G_TYPE_CHAR: - g_value_set_char (value, (gchar) g_value_get_int64 (&node_value)); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_schar (value, (gchar) g_value_get_int64 (&node_value)); + retval = TRUE; + } break; case G_TYPE_UINT: - g_value_set_uint (value, (guint) g_value_get_int64 (&node_value)); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_uint (value, (guint) g_value_get_int64 (&node_value)); + retval = TRUE; + } break; case G_TYPE_UCHAR: - g_value_set_uchar (value, (guchar) g_value_get_int64 (&node_value)); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_uchar (value, (guchar) g_value_get_int64 (&node_value)); + retval = TRUE; + } + break; + + case G_TYPE_DOUBLE: + + if (G_VALUE_HOLDS (&node_value, G_TYPE_DOUBLE)) + { + g_value_set_double (value, g_value_get_double (&node_value)); + retval = TRUE; + } + else if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_double (value, (gdouble) g_value_get_int64 (&node_value)); + retval = TRUE; + } + break; case G_TYPE_FLOAT: - g_value_set_float (value, (gfloat) g_value_get_double (&node_value)); - retval = TRUE; + if (G_VALUE_HOLDS (&node_value, G_TYPE_DOUBLE)) + { + g_value_set_float (value, (gfloat) g_value_get_double (&node_value)); + retval = TRUE; + } + else if (G_VALUE_HOLDS (&node_value, G_TYPE_INT64)) + { + g_value_set_float (value, (gfloat) g_value_get_int64 (&node_value)); + retval = TRUE; + } + break; case G_TYPE_ENUM: @@ -552,7 +633,19 @@ json_deserialize_pspec (GValue *value, break; case JSON_NODE_NULL: - retval = FALSE; + if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_STRING) + { + g_value_set_string (value, NULL); + retval = TRUE; + } + else if (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value)) == G_TYPE_OBJECT) + { + g_value_set_object (value, NULL); + retval = TRUE; + } + else + retval = FALSE; + break; } @@ -564,44 +657,66 @@ json_serialize_pspec (const GValue *real_value, GParamSpec *pspec) { JsonNode *retval = NULL; - GValue value = { 0, }; JsonNodeType node_type; switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (real_value))) { + /* JSON native types */ case G_TYPE_INT64: + retval = json_node_init_int (json_node_alloc (), g_value_get_int64 (real_value)); + break; + case G_TYPE_BOOLEAN: + retval = json_node_init_boolean (json_node_alloc (), g_value_get_boolean (real_value)); + break; + case G_TYPE_DOUBLE: - /* JSON native types */ - retval = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_VALUE_TYPE (real_value)); - g_value_copy (real_value, &value); - json_node_set_value (retval, &value); - g_value_unset (&value); + retval = json_node_init_double (json_node_alloc (), g_value_get_double (real_value)); break; case G_TYPE_STRING: - /* strings might be NULL, so we handle it differently */ - if (!g_value_get_string (real_value)) - retval = json_node_new (JSON_NODE_NULL); - else - { - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_string (retval, g_value_get_string (real_value)); - break; - } + retval = json_node_init_string (json_node_alloc (), g_value_get_string (real_value)); break; + /* auto-promoted types */ case G_TYPE_INT: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_int (real_value)); + retval = json_node_init_int (json_node_alloc (), g_value_get_int (real_value)); + break; + + case G_TYPE_UINT: + retval = json_node_init_int (json_node_alloc (), g_value_get_uint (real_value)); + break; + + case G_TYPE_LONG: + retval = json_node_init_int (json_node_alloc (), g_value_get_long (real_value)); + break; + + case G_TYPE_ULONG: + retval = json_node_init_int (json_node_alloc (), g_value_get_ulong (real_value)); break; case G_TYPE_FLOAT: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_double (retval, g_value_get_float (real_value)); + retval = json_node_init_double (json_node_alloc (), g_value_get_float (real_value)); + break; + + case G_TYPE_CHAR: + retval = json_node_alloc (); + json_node_init_int (retval, g_value_get_schar (real_value)); + break; + + case G_TYPE_UCHAR: + retval = json_node_init_int (json_node_alloc (), g_value_get_uchar (real_value)); break; + case G_TYPE_ENUM: + retval = json_node_init_int (json_node_alloc (), g_value_get_enum (real_value)); + break; + + case G_TYPE_FLAGS: + retval = json_node_init_int (json_node_alloc (), g_value_get_flags (real_value)); + break; + + /* complex types */ case G_TYPE_BOXED: if (G_VALUE_HOLDS (real_value, G_TYPE_STRV)) { @@ -620,8 +735,8 @@ json_serialize_pspec (const GValue *real_value, json_array_add_element (array, str); } - retval = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (retval, array); + retval = json_node_init_array (json_node_alloc (), array); + json_array_unref (array); } else if (json_boxed_can_serialize (G_VALUE_TYPE (real_value), &node_type)) { @@ -634,52 +749,19 @@ json_serialize_pspec (const GValue *real_value, g_type_name (G_VALUE_TYPE (real_value))); break; - case G_TYPE_UINT: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_uint (real_value)); - break; - - case G_TYPE_LONG: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_long (real_value)); - break; - - case G_TYPE_ULONG: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_long (real_value)); - break; - - case G_TYPE_CHAR: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_char (real_value)); - break; - - case G_TYPE_UCHAR: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_uchar (real_value)); - break; - - case G_TYPE_ENUM: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_enum (real_value)); - break; - - case G_TYPE_FLAGS: - retval = json_node_new (JSON_NODE_VALUE); - json_node_set_int (retval, g_value_get_flags (real_value)); - break; - case G_TYPE_OBJECT: { GObject *object = g_value_get_object (real_value); + retval = json_node_alloc (); + if (object != NULL) { - retval = json_node_new (JSON_NODE_OBJECT); + json_node_init (retval, JSON_NODE_OBJECT); json_node_take_object (retval, json_gobject_dump (object)); } else - retval = json_node_new (JSON_NODE_NULL); + json_node_init_null (retval); } break; @@ -762,7 +844,7 @@ json_gobject_serialize (GObject *gobject) * * Note: the JSON data stream must be an object declaration. * - * Return value: a #GObject or %NULL + * Return value: (transfer full): a #GObject or %NULL * * Since: 0.4 * @@ -792,7 +874,7 @@ json_construct_gobject (GType gtype, * * Note: the JSON data stream must be an object declaration. * - * Return value: a #GObject or %NULL + * Return value: (transfer full): a #GObject or %NULL * * Since: 0.10 */ @@ -827,10 +909,10 @@ json_gobject_from_data (GType gtype, root = json_parser_get_root (parser); if (root == NULL || JSON_NODE_TYPE (root) != JSON_NODE_OBJECT) { + /* translators: the %s is the name of the data structure */ g_set_error (error, JSON_PARSER_ERROR, JSON_PARSER_ERROR_PARSE, - "Expecting a JSON object, but the root node " - "is of type `%s'", + _("Expecting a JSON object, but the root node is of type `%s'"), json_node_type_name (root)); g_object_unref (parser); return NULL; diff --git a/json-glib/json-gobject.h b/json-glib/json-gobject.h index 9eb6ac9..17aa2db 100644 --- a/json-glib/json-gobject.h +++ b/json-glib/json-gobject.h @@ -25,7 +25,6 @@ #define __JSON_GOBJECT_H__ #include -#include G_BEGIN_DECLS @@ -43,8 +42,14 @@ typedef struct _JsonSerializableIface JsonSerializableIface; * into a #JsonNode * @deserialize_property: virtual function for deserializing a #JsonNode * into a #GObject property + * @find_property: virtual function for finding a property definition using + * its name + * @list_properties: virtual function for listing the installed property + * definitions + * @set_property: virtual function for setting a property + * @get_property: virtual function for getting a property * - * Interface that allows serializing and deserializing #GObjects + * Interface that allows serializing and deserializing #GObject instances * with properties storing complex data types. The json_serialize_gobject() * function will check if the passed #GObject implements this interface, * so it can also be used to override the default property serialization @@ -65,24 +70,55 @@ struct _JsonSerializableIface GValue *value, GParamSpec *pspec, JsonNode *property_node); + + GParamSpec * (* find_property) (JsonSerializable *serializable, + const char *name); + GParamSpec **(* list_properties) (JsonSerializable *serializable, + guint *n_pspecs); + void (* set_property) (JsonSerializable *serializable, + GParamSpec *pspec, + const GValue *value); + void (* get_property) (JsonSerializable *serializable, + GParamSpec *pspec, + GValue *value); }; -GType json_serializable_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 +GType json_serializable_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 JsonNode *json_serializable_serialize_property (JsonSerializable *serializable, const gchar *property_name, const GValue *value, GParamSpec *pspec); +JSON_AVAILABLE_IN_1_0 gboolean json_serializable_deserialize_property (JsonSerializable *serializable, const gchar *property_name, GValue *value, GParamSpec *pspec, JsonNode *property_node); +JSON_AVAILABLE_IN_1_0 +GParamSpec * json_serializable_find_property (JsonSerializable *serializable, + const char *name); +JSON_AVAILABLE_IN_1_0 +GParamSpec ** json_serializable_list_properties (JsonSerializable *serializable, + guint *n_pspecs); +JSON_AVAILABLE_IN_1_0 +void json_serializable_set_property (JsonSerializable *serializable, + GParamSpec *pspec, + const GValue *value); +JSON_AVAILABLE_IN_1_0 +void json_serializable_get_property (JsonSerializable *serializable, + GParamSpec *pspec, + GValue *value); + +JSON_AVAILABLE_IN_1_0 JsonNode *json_serializable_default_serialize_property (JsonSerializable *serializable, const gchar *property_name, const GValue *value, GParamSpec *pspec); +JSON_AVAILABLE_IN_1_0 gboolean json_serializable_default_deserialize_property (JsonSerializable *serializable, const gchar *property_name, GValue *value, @@ -113,41 +149,50 @@ typedef JsonNode *(* JsonBoxedSerializeFunc) (gconstpointer boxed); */ typedef gpointer (* JsonBoxedDeserializeFunc) (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_boxed_register_serialize_func (GType gboxed_type, JsonNodeType node_type, JsonBoxedSerializeFunc serialize_func); +JSON_AVAILABLE_IN_1_0 void json_boxed_register_deserialize_func (GType gboxed_type, JsonNodeType node_type, JsonBoxedDeserializeFunc deserialize_func); +JSON_AVAILABLE_IN_1_0 gboolean json_boxed_can_serialize (GType gboxed_type, JsonNodeType *node_type); +JSON_AVAILABLE_IN_1_0 gboolean json_boxed_can_deserialize (GType gboxed_type, JsonNodeType node_type); +JSON_AVAILABLE_IN_1_0 JsonNode *json_boxed_serialize (GType gboxed_type, gconstpointer boxed); +JSON_AVAILABLE_IN_1_0 gpointer json_boxed_deserialize (GType gboxed_type, JsonNode *node); +JSON_AVAILABLE_IN_1_0 JsonNode *json_gobject_serialize (GObject *gobject); +JSON_AVAILABLE_IN_1_0 GObject * json_gobject_deserialize (GType gtype, JsonNode *node); +JSON_AVAILABLE_IN_1_0 GObject * json_gobject_from_data (GType gtype, const gchar *data, gssize length, GError **error); +JSON_AVAILABLE_IN_1_0 gchar * json_gobject_to_data (GObject *gobject, gsize *length); -#ifndef JSON_DISABLE_DEPRECATED +JSON_DEPRECATED_IN_1_0_FOR(json_gobject_from_data) GObject * json_construct_gobject (GType gtype, const gchar *data, gsize length, - GError **error) G_GNUC_DEPRECATED; + GError **error); +JSON_DEPRECATED_IN_1_0_FOR(json_gobject_to_data) gchar * json_serialize_gobject (GObject *gobject, - gsize *length) G_GNUC_MALLOC G_GNUC_DEPRECATED; -#endif /* JSON_DISABLE_DEPRECATED */ - + gsize *length) G_GNUC_MALLOC; G_END_DECLS diff --git a/json-glib/json-gvariant.c b/json-glib/json-gvariant.c new file mode 100644 index 0000000..9c4ce1a --- /dev/null +++ b/json-glib/json-gvariant.c @@ -0,0 +1,1351 @@ +/* json-gvariant.c - JSON GVariant integration + * + * This file is part of JSON-GLib + * Copyright (C) 2007 OpenedHand Ltd. + * + * 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 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. + * + * Author: + * Eduardo Lima Mitev + */ + +#include "config.h" + +#include +#include +#include + +#include + +#include + +#include "json-gvariant.h" + +#include "json-generator.h" +#include "json-parser.h" + +/** + * SECTION:json-gvariant + * @short_description: Serialize and deserialize GVariant types + * @Title: JSON GVariant Integration + * + * Use json_gvariant_serialize() and json_gvariant_serialize_data() to + * convert from any #GVariant value to a #JsonNode tree or its string + * representation. + * + * Use json_gvariant_deserialize() and json_gvariant_deserialize_data() to + * obtain the #GVariant value from a #JsonNode tree or directly from a JSON + * string. + * + * Since many #GVariant data types cannot be directly represented as + * JSON, a #GVariant type string (signature) should be provided to these + * methods in order to obtain a correct, type-contrained result. + * If no signature is provided, conversion can still be done, but the + * resulting #GVariant value will be "guessed" from the JSON data types + * using the following rules: + * + * ## Strings + * JSON strings map to GVariant `(s)`. + * + * ## Integers + * JSON integers map to GVariant int64 `(x)`. + * + * ## Booleans + * JSON booleans map to GVariant boolean `(b)`. + * + * ## Numbers + * JSON numbers map to GVariant double `(d)`. + * + * ## Arrays + * JSON arrays map to GVariant arrays of variants `(av)`. + * + * ## Objects + * JSON objects map to GVariant dictionaries of string to variants `(a{sv})`. + * + * ## Null values + * JSON null values map to GVariant maybe variants `(mv)`. + */ + +/* custom extension to the GVariantClass enumeration to differentiate + * a single dictionary entry from an array of dictionary entries + */ +#define JSON_G_VARIANT_CLASS_DICTIONARY 'c' + +typedef void (* GVariantForeachFunc) (GVariant *variant_child, + gpointer user_data); + +static GVariant * json_to_gvariant_recurse (JsonNode *json_node, + const gchar **signature, + GError **error); + +/* ========================================================================== */ +/* GVariant to JSON */ +/* ========================================================================== */ + +static void +gvariant_foreach (GVariant *variant, + GVariantForeachFunc func, + gpointer user_data) +{ + GVariantIter iter; + GVariant *variant_child; + + g_variant_iter_init (&iter, variant); + while ((variant_child = g_variant_iter_next_value (&iter)) != NULL) + { + func (variant_child, user_data); + g_variant_unref (variant_child); + } +} + +static void +gvariant_to_json_array_foreach (GVariant *variant_child, + gpointer user_data) +{ + JsonArray *array = user_data; + JsonNode *json_child; + + json_child = json_gvariant_serialize (variant_child); + json_array_add_element (array, json_child); +} + +static JsonNode * +gvariant_to_json_array (GVariant *variant) +{ + JsonArray *array; + JsonNode *json_node; + + array = json_array_new (); + json_node = json_node_new (JSON_NODE_ARRAY); + json_node_set_array (json_node, array); + json_array_unref (array); + + gvariant_foreach (variant, + gvariant_to_json_array_foreach, + array); + + return json_node; +} + +static gchar * +gvariant_simple_to_string (GVariant *variant) +{ + GVariantClass class; + gchar *str; + + class = g_variant_classify (variant); + switch (class) + { + case G_VARIANT_CLASS_BOOLEAN: + if (g_variant_get_boolean (variant)) + str = g_strdup ("true"); + else + str = g_strdup ("false"); + break; + + case G_VARIANT_CLASS_BYTE: + str = g_strdup_printf ("%u", g_variant_get_byte (variant)); + break; + case G_VARIANT_CLASS_INT16: + str = g_strdup_printf ("%d", g_variant_get_int16 (variant)); + break; + case G_VARIANT_CLASS_UINT16: + str = g_strdup_printf ("%u", g_variant_get_uint16 (variant)); + break; + case G_VARIANT_CLASS_INT32: + str = g_strdup_printf ("%d", g_variant_get_int32 (variant)); + break; + case G_VARIANT_CLASS_UINT32: + str = g_strdup_printf ("%u", g_variant_get_uint32 (variant)); + break; + case G_VARIANT_CLASS_INT64: + str = g_strdup_printf ("%" G_GINT64_FORMAT, + g_variant_get_int64 (variant)); + break; + case G_VARIANT_CLASS_UINT64: + str = g_strdup_printf ("%" G_GUINT64_FORMAT, + g_variant_get_uint64 (variant)); + break; + case G_VARIANT_CLASS_HANDLE: + str = g_strdup_printf ("%d", g_variant_get_handle (variant)); + break; + + case G_VARIANT_CLASS_DOUBLE: + { + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + + g_ascii_formatd (buf, + G_ASCII_DTOSTR_BUF_SIZE, + "%f", + g_variant_get_double (variant)); + + str = g_strdup (buf); + break; + } + + case G_VARIANT_CLASS_STRING: + case G_VARIANT_CLASS_OBJECT_PATH: + case G_VARIANT_CLASS_SIGNATURE: + str = g_strdup (g_variant_get_string (variant, NULL)); + break; + + default: + g_assert_not_reached (); + break; + } + + return str; +} + +static JsonNode * +gvariant_dict_entry_to_json (GVariant *variant, gchar **member_name) +{ + GVariant *member; + GVariant *value; + JsonNode *json_node; + + member = g_variant_get_child_value (variant, 0); + *member_name = gvariant_simple_to_string (member); + + value = g_variant_get_child_value (variant, 1); + json_node = json_gvariant_serialize (value); + + g_variant_unref (member); + g_variant_unref (value); + + return json_node; +} + +static void +gvariant_to_json_object_foreach (GVariant *variant_child, gpointer user_data) +{ + gchar *member_name; + JsonNode *json_child; + JsonObject *object = (JsonObject *) user_data; + + json_child = gvariant_dict_entry_to_json (variant_child, &member_name); + json_object_set_member (object, member_name, json_child); + g_free (member_name); +} + +static JsonNode * +gvariant_to_json_object (GVariant *variant) +{ + JsonNode *json_node; + JsonObject *object; + + json_node = json_node_new (JSON_NODE_OBJECT); + object = json_object_new (); + json_node_set_object (json_node, object); + json_object_unref (object); + + gvariant_foreach (variant, + gvariant_to_json_object_foreach, + object); + + return json_node; +} + +/** + * json_gvariant_serialize: + * @variant: A #GVariant to convert + * + * Converts @variant to a JSON tree. + * + * Return value: (transfer full): A #JsonNode representing the root of the + * JSON data structure obtained from @variant + * + * Since: 0.14 + */ +JsonNode * +json_gvariant_serialize (GVariant *variant) +{ + JsonNode *json_node = NULL; + GVariantClass class; + + g_return_val_if_fail (variant != NULL, NULL); + + class = g_variant_classify (variant); + + if (! g_variant_is_container (variant)) + { + json_node = json_node_new (JSON_NODE_VALUE); + + switch (class) + { + case G_VARIANT_CLASS_BOOLEAN: + json_node_set_boolean (json_node, g_variant_get_boolean (variant)); + break; + + case G_VARIANT_CLASS_BYTE: + json_node_set_int (json_node, g_variant_get_byte (variant)); + break; + case G_VARIANT_CLASS_INT16: + json_node_set_int (json_node, g_variant_get_int16 (variant)); + break; + case G_VARIANT_CLASS_UINT16: + json_node_set_int (json_node, g_variant_get_uint16 (variant)); + break; + case G_VARIANT_CLASS_INT32: + json_node_set_int (json_node, g_variant_get_int32 (variant)); + break; + case G_VARIANT_CLASS_UINT32: + json_node_set_int (json_node, g_variant_get_uint32 (variant)); + break; + case G_VARIANT_CLASS_INT64: + json_node_set_int (json_node, g_variant_get_int64 (variant)); + break; + case G_VARIANT_CLASS_UINT64: + json_node_set_int (json_node, g_variant_get_uint64 (variant)); + break; + case G_VARIANT_CLASS_HANDLE: + json_node_set_int (json_node, g_variant_get_handle (variant)); + break; + + case G_VARIANT_CLASS_DOUBLE: + json_node_set_double (json_node, g_variant_get_double (variant)); + break; + + case G_VARIANT_CLASS_STRING: + case G_VARIANT_CLASS_OBJECT_PATH: + case G_VARIANT_CLASS_SIGNATURE: + json_node_set_string (json_node, g_variant_get_string (variant, NULL)); + break; + + default: + break; + } + } + else + { + switch (class) + { + case G_VARIANT_CLASS_MAYBE: + { + GVariant *value; + + value = g_variant_get_maybe (variant); + if (value == NULL) + { + json_node = json_node_new (JSON_NODE_NULL); + } + else + { + json_node = json_gvariant_serialize (value); + g_variant_unref (value); + } + + break; + } + + case G_VARIANT_CLASS_VARIANT: + { + GVariant *value; + + value = g_variant_get_variant (variant); + json_node = json_gvariant_serialize (value); + g_variant_unref (value); + + break; + } + + case G_VARIANT_CLASS_ARRAY: + { + const gchar *type; + + type = g_variant_get_type_string (variant); + + if (type[1] == G_VARIANT_CLASS_DICT_ENTRY) + { + /* array of dictionary entries => JsonObject */ + json_node = gvariant_to_json_object (variant); + } + else + { + /* array of anything else => JsonArray */ + json_node = gvariant_to_json_array (variant); + } + + break; + } + + case G_VARIANT_CLASS_DICT_ENTRY: + { + gchar *member_name; + JsonObject *object; + JsonNode *child; + + /* a single dictionary entry => JsonObject */ + json_node = json_node_new (JSON_NODE_OBJECT); + object = json_object_new (); + json_node_set_object (json_node, object); + json_object_unref (object); + + child = gvariant_dict_entry_to_json (variant, &member_name); + + json_object_set_member (object, member_name, child); + g_free (member_name); + + break; + } + + case G_VARIANT_CLASS_TUPLE: + json_node = gvariant_to_json_array (variant); + break; + + default: + break; + } + } + + return json_node; +} + +/** + * json_gvariant_serialize_data: + * @variant: A #GVariant to convert + * @length: (out) (allow-none): Return location for the length of the returned + * string, or %NULL + * + * Converts @variant to its JSON encoded string representation. This method + * is actually a helper function. It uses json_gvariant_serialize() to obtain the + * JSON tree, and then #JsonGenerator to stringify it. + * + * Return value: (transfer full): The JSON encoded string corresponding to + * @variant + * + * Since: 0.14 + */ +gchar * +json_gvariant_serialize_data (GVariant *variant, gsize *length) +{ + JsonNode *json_node; + JsonGenerator *generator; + gchar *json; + + json_node = json_gvariant_serialize (variant); + + generator = json_generator_new (); + + json_generator_set_root (generator, json_node); + json = json_generator_to_data (generator, length); + + g_object_unref (generator); + + json_node_free (json_node); + + return json; +} + +/* ========================================================================== */ +/* JSON to GVariant */ +/* ========================================================================== */ + +static GVariantClass +json_to_gvariant_get_next_class (JsonNode *json_node, + const gchar **signature) +{ + if (signature == NULL) + { + GVariantClass class = 0; + + switch (json_node_get_node_type (json_node)) + { + case JSON_NODE_VALUE: + switch (json_node_get_value_type (json_node)) + { + case G_TYPE_BOOLEAN: + class = G_VARIANT_CLASS_BOOLEAN; + break; + + case G_TYPE_INT64: + class = G_VARIANT_CLASS_INT64; + break; + + case G_TYPE_DOUBLE: + class = G_VARIANT_CLASS_DOUBLE; + break; + + case G_TYPE_STRING: + class = G_VARIANT_CLASS_STRING; + break; + } + + break; + + case JSON_NODE_ARRAY: + class = G_VARIANT_CLASS_ARRAY; + break; + + case JSON_NODE_OBJECT: + class = JSON_G_VARIANT_CLASS_DICTIONARY; + break; + + case JSON_NODE_NULL: + class = G_VARIANT_CLASS_MAYBE; + break; + } + + return class; + } + else + { + if ((*signature)[0] == G_VARIANT_CLASS_ARRAY && + (*signature)[1] == G_VARIANT_CLASS_DICT_ENTRY) + return JSON_G_VARIANT_CLASS_DICTIONARY; + else + return (*signature)[0]; + } +} + +static gboolean +json_node_assert_type (JsonNode *json_node, + JsonNodeType type, + GType sub_type, + GError **error) +{ + if (JSON_NODE_TYPE (json_node) != type || + (type == JSON_NODE_VALUE && + (json_node_get_value_type (json_node) != sub_type))) + { + /* translators: the '%s' is the type name */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("Unexpected type '%s' in JSON node"), + g_type_name (json_node_get_value_type (json_node))); + return FALSE; + } + else + { + return TRUE; + } +} + +static void +json_to_gvariant_foreach_add (gpointer data, gpointer user_data) +{ + GVariantBuilder *builder = (GVariantBuilder *) user_data; + GVariant *child = (GVariant *) data; + + g_variant_builder_add_value (builder, child); +} + +static void +json_to_gvariant_foreach_free (gpointer data, gpointer user_data) +{ + GVariant *child = (GVariant *) data; + + g_variant_unref (child); +} + +static GVariant * +json_to_gvariant_build_from_glist (GList *list, const gchar *signature) +{ + GVariantBuilder *builder; + GVariant *result; + + builder = g_variant_builder_new (G_VARIANT_TYPE (signature)); + + g_list_foreach (list, json_to_gvariant_foreach_add, builder); + result = g_variant_builder_end (builder); + + g_variant_builder_unref (builder); + + return result; +} + +static GVariant * +json_to_gvariant_tuple (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + JsonArray *array; + gint i; + GList *children = NULL; + gboolean roll_back = FALSE; + const gchar *initial_signature; + + array = json_node_get_array (json_node); + + initial_signature = *signature; + (*signature)++; + i = 1; + while ((*signature)[0] != ')' && (*signature)[0] != '\0') + { + JsonNode *json_child; + GVariant *variant_child; + + if (i - 1 >= json_array_get_length (array)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("Missing elements in JSON array to conform to a tuple")); + roll_back = TRUE; + break; + } + + json_child = json_array_get_element (array, i - 1); + + variant_child = json_to_gvariant_recurse (json_child, signature, error); + if (variant_child != NULL) + { + children = g_list_append (children, variant_child); + } + else + { + roll_back = TRUE; + break; + } + + i++; + } + + if (! roll_back) + { + if ( (*signature)[0] != ')') + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("Missing closing symbol ')' in the GVariant tuple type")); + roll_back = TRUE; + } + else if (json_array_get_length (array) >= i) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("Unexpected extra elements in JSON array")); + roll_back = TRUE; + } + else + { + gchar *tuple_type; + + tuple_type = g_strndup (initial_signature, + (*signature) - initial_signature + 1); + + variant = json_to_gvariant_build_from_glist (children, tuple_type); + + g_free (tuple_type); + } + } + + if (roll_back) + g_list_foreach (children, json_to_gvariant_foreach_free, NULL); + + g_list_free (children); + + return variant; +} + +static gchar * +signature_get_next_complete_type (const gchar **signature) +{ + GVariantClass class; + const gchar *initial_signature; + gchar *result; + + /* here it is assumed that 'signature' is a valid type string */ + + initial_signature = *signature; + class = (*signature)[0]; + + if (class == G_VARIANT_CLASS_TUPLE || class == G_VARIANT_CLASS_DICT_ENTRY) + { + gchar stack[256] = {0}; + guint stack_len = 0; + + do + { + if ( (*signature)[0] == G_VARIANT_CLASS_TUPLE) + { + stack[stack_len] = ')'; + stack_len++; + } + else if ( (*signature)[0] == G_VARIANT_CLASS_DICT_ENTRY) + { + stack[stack_len] = '}'; + stack_len++; + } + + (*signature)++; + + if ( (*signature)[0] == stack[stack_len - 1]) + stack_len--; + } + while (stack_len > 0); + + (*signature)++; + } + else if (class == G_VARIANT_CLASS_ARRAY || class == G_VARIANT_CLASS_MAYBE) + { + gchar *tmp_sig; + + (*signature)++; + tmp_sig = signature_get_next_complete_type (signature); + g_free (tmp_sig); + } + else + { + (*signature)++; + } + + result = g_strndup (initial_signature, (*signature) - initial_signature); + + return result; +} + +static GVariant * +json_to_gvariant_maybe (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + GVariant *value; + gchar *maybe_signature; + + if (signature) + { + (*signature)++; + maybe_signature = signature_get_next_complete_type (signature); + } + else + { + maybe_signature = g_strdup ("v"); + } + + if (json_node_get_node_type (json_node) == JSON_NODE_NULL) + { + variant = g_variant_new_maybe (G_VARIANT_TYPE (maybe_signature), NULL); + } + else + { + const gchar *tmp_signature; + + tmp_signature = maybe_signature; + value = json_to_gvariant_recurse (json_node, + &tmp_signature, + error); + + if (value != NULL) + variant = g_variant_new_maybe (G_VARIANT_TYPE (maybe_signature), value); + } + + g_free (maybe_signature); + + /* compensate the (*signature)++ call at the end of 'recurse()' */ + if (signature) + (*signature)--; + + return variant; +} + +static GVariant * +json_to_gvariant_array (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + JsonArray *array; + GList *children = NULL; + gboolean roll_back = FALSE; + const gchar *orig_signature; + gchar *child_signature; + + array = json_node_get_array (json_node); + + if (signature != NULL) + { + orig_signature = *signature; + + (*signature)++; + child_signature = signature_get_next_complete_type (signature); + } + else + child_signature = g_strdup ("v"); + + if (json_array_get_length (array) > 0) + { + gint i; + guint len; + + len = json_array_get_length (array); + for (i = 0; i < len; i++) + { + JsonNode *json_child; + GVariant *variant_child; + const gchar *tmp_signature; + + json_child = json_array_get_element (array, i); + + tmp_signature = child_signature; + variant_child = json_to_gvariant_recurse (json_child, + &tmp_signature, + error); + if (variant_child != NULL) + { + children = g_list_append (children, variant_child); + } + else + { + roll_back = TRUE; + break; + } + } + } + + if (!roll_back) + { + gchar *array_signature; + + if (signature) + array_signature = g_strndup (orig_signature, (*signature) - orig_signature); + else + array_signature = g_strdup ("av"); + + variant = json_to_gvariant_build_from_glist (children, array_signature); + + g_free (array_signature); + + /* compensate the (*signature)++ call at the end of 'recurse()' */ + if (signature) + (*signature)--; + } + else + g_list_foreach (children, json_to_gvariant_foreach_free, NULL); + + g_list_free (children); + g_free (child_signature); + + return variant; +} + +static GVariant * +gvariant_simple_from_string (const gchar *st, + GVariantClass class, + GError **error) +{ + GVariant *variant = NULL; + gchar *nptr = NULL; + + errno = 0; + + switch (class) + { + case G_VARIANT_CLASS_BOOLEAN: + if (g_strcmp0 (st, "true") == 0) + variant = g_variant_new_boolean (TRUE); + else if (g_strcmp0 (st, "false") == 0) + variant = g_variant_new_boolean (FALSE); + else + errno = 1; + break; + + case G_VARIANT_CLASS_BYTE: + variant = g_variant_new_byte (g_ascii_strtoll (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_INT16: + variant = g_variant_new_int16 (g_ascii_strtoll (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_UINT16: + variant = g_variant_new_uint16 (g_ascii_strtoll (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_INT32: + variant = g_variant_new_int32 (g_ascii_strtoll (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_UINT32: + variant = g_variant_new_uint32 (g_ascii_strtoull (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_INT64: + variant = g_variant_new_int64 (g_ascii_strtoll (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_UINT64: + variant = g_variant_new_uint64 (g_ascii_strtoull (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_HANDLE: + variant = g_variant_new_handle (strtol (st, &nptr, 10)); + break; + + case G_VARIANT_CLASS_DOUBLE: + variant = g_variant_new_double (g_ascii_strtod (st, &nptr)); + break; + + case G_VARIANT_CLASS_STRING: + case G_VARIANT_CLASS_OBJECT_PATH: + case G_VARIANT_CLASS_SIGNATURE: + variant = g_variant_new_string (st); + break; + + default: + g_assert_not_reached (); + break; + } + + if (errno != 0 || nptr == st) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("Invalid string value converting to GVariant")); + if (variant != NULL) + { + g_variant_unref (variant); + variant = NULL; + } + } + + return variant; +} + +static void +parse_dict_entry_signature (const gchar **signature, + gchar **entry_signature, + gchar **key_signature, + gchar **value_signature) +{ + const gchar *tmp_sig; + + if (signature != NULL) + *entry_signature = signature_get_next_complete_type (signature); + else + *entry_signature = g_strdup ("{sv}"); + + tmp_sig = (*entry_signature) + 1; + *key_signature = signature_get_next_complete_type (&tmp_sig); + *value_signature = signature_get_next_complete_type (&tmp_sig); +} + +static GVariant * +json_to_gvariant_dict_entry (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + JsonObject *obj; + + gchar *entry_signature; + gchar *key_signature; + gchar *value_signature; + const gchar *tmp_signature; + + GList *member; + + const gchar *json_member; + JsonNode *json_value; + GVariant *variant_member; + GVariant *variant_value; + + obj = json_node_get_object (json_node); + + if (json_object_get_size (obj) != 1) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("A GVariant dictionary entry expects a JSON object with exactly one member")); + return NULL; + } + + parse_dict_entry_signature (signature, + &entry_signature, + &key_signature, + &value_signature); + + member = json_object_get_members (obj); + + json_member = (const gchar *) member->data; + variant_member = gvariant_simple_from_string (json_member, + key_signature[0], + error); + if (variant_member != NULL) + { + json_value = json_object_get_member (obj, json_member); + + tmp_signature = value_signature; + variant_value = json_to_gvariant_recurse (json_value, + &tmp_signature, + error); + + if (variant_value != NULL) + { + GVariantBuilder *builder; + + builder = g_variant_builder_new (G_VARIANT_TYPE (entry_signature)); + g_variant_builder_add_value (builder, variant_member); + g_variant_builder_add_value (builder, variant_value); + variant = g_variant_builder_end (builder); + + g_variant_builder_unref (builder); + } + } + + g_list_free (member); + g_free (value_signature); + g_free (key_signature); + g_free (entry_signature); + + /* compensate the (*signature)++ call at the end of 'recurse()' */ + if (signature) + (*signature)--; + + return variant; +} + +static GVariant * +json_to_gvariant_dictionary (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + JsonObject *obj; + gboolean roll_back = FALSE; + + gchar *dict_signature; + gchar *entry_signature; + gchar *key_signature; + gchar *value_signature; + const gchar *tmp_signature; + + GVariantBuilder *builder; + GList *members; + GList *member; + + obj = json_node_get_object (json_node); + + if (signature != NULL) + (*signature)++; + + parse_dict_entry_signature (signature, + &entry_signature, + &key_signature, + &value_signature); + + dict_signature = g_strdup_printf ("a%s", entry_signature); + + builder = g_variant_builder_new (G_VARIANT_TYPE (dict_signature)); + + members = json_object_get_members (obj); + + member = members; + while (member != NULL) + { + const gchar *json_member; + JsonNode *json_value; + GVariant *variant_member; + GVariant *variant_value; + + json_member = (const gchar *) member->data; + variant_member = gvariant_simple_from_string (json_member, + key_signature[0], + error); + if (variant_member == NULL) + { + roll_back = TRUE; + break; + } + + json_value = json_object_get_member (obj, json_member); + + tmp_signature = value_signature; + variant_value = json_to_gvariant_recurse (json_value, + &tmp_signature, + error); + + if (variant_value != NULL) + { + g_variant_builder_open (builder, G_VARIANT_TYPE (entry_signature)); + g_variant_builder_add_value (builder, variant_member); + g_variant_builder_add_value (builder, variant_value); + g_variant_builder_close (builder); + } + else + { + roll_back = TRUE; + break; + } + + member = member->next; + } + + if (! roll_back) + variant = g_variant_builder_end (builder); + + g_variant_builder_unref (builder); + g_list_free (members); + g_free (value_signature); + g_free (key_signature); + g_free (entry_signature); + g_free (dict_signature); + + /* compensate the (*signature)++ call at the end of 'recurse()' */ + if (signature != NULL) + (*signature)--; + + return variant; +} + +static GVariant * +json_to_gvariant_recurse (JsonNode *json_node, + const gchar **signature, + GError **error) +{ + GVariant *variant = NULL; + GVariantClass class; + + class = json_to_gvariant_get_next_class (json_node, signature); + + if (class == JSON_G_VARIANT_CLASS_DICTIONARY) + { + if (json_node_assert_type (json_node, JSON_NODE_OBJECT, 0, error)) + variant = json_to_gvariant_dictionary (json_node, signature, error); + + goto out; + } + + if (JSON_NODE_TYPE (json_node) == JSON_NODE_VALUE && + json_node_get_value_type (json_node) == G_TYPE_STRING) + { + const gchar* str = json_node_get_string (json_node); + switch (class) + { + case G_VARIANT_CLASS_BOOLEAN: + case G_VARIANT_CLASS_BYTE: + case G_VARIANT_CLASS_INT16: + case G_VARIANT_CLASS_UINT16: + case G_VARIANT_CLASS_INT32: + case G_VARIANT_CLASS_UINT32: + case G_VARIANT_CLASS_INT64: + case G_VARIANT_CLASS_UINT64: + case G_VARIANT_CLASS_HANDLE: + case G_VARIANT_CLASS_DOUBLE: + case G_VARIANT_CLASS_STRING: + variant = gvariant_simple_from_string (str, class, error); + goto out; + default: + break; + } + } + + switch (class) + { + case G_VARIANT_CLASS_BOOLEAN: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_BOOLEAN, error)) + variant = g_variant_new_boolean (json_node_get_boolean (json_node)); + break; + + case G_VARIANT_CLASS_BYTE: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_byte (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_INT16: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_int16 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_UINT16: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_uint16 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_INT32: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_int32 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_UINT32: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_uint32 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_INT64: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_int64 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_UINT64: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_uint64 (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_HANDLE: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_INT64, error)) + variant = g_variant_new_handle (json_node_get_int (json_node)); + break; + + case G_VARIANT_CLASS_DOUBLE: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_DOUBLE, error)) + variant = g_variant_new_double (json_node_get_double (json_node)); + break; + + case G_VARIANT_CLASS_STRING: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_STRING, error)) + variant = g_variant_new_string (json_node_get_string (json_node)); + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_STRING, error)) + variant = g_variant_new_object_path (json_node_get_string (json_node)); + break; + + case G_VARIANT_CLASS_SIGNATURE: + if (json_node_assert_type (json_node, JSON_NODE_VALUE, G_TYPE_STRING, error)) + variant = g_variant_new_signature (json_node_get_string (json_node)); + break; + + case G_VARIANT_CLASS_VARIANT: + variant = g_variant_new_variant (json_to_gvariant_recurse (json_node, + NULL, + error)); + break; + + case G_VARIANT_CLASS_MAYBE: + variant = json_to_gvariant_maybe (json_node, signature, error); + break; + + case G_VARIANT_CLASS_ARRAY: + if (json_node_assert_type (json_node, JSON_NODE_ARRAY, 0, error)) + variant = json_to_gvariant_array (json_node, signature, error); + break; + + case G_VARIANT_CLASS_TUPLE: + if (json_node_assert_type (json_node, JSON_NODE_ARRAY, 0, error)) + variant = json_to_gvariant_tuple (json_node, signature, error); + break; + + case G_VARIANT_CLASS_DICT_ENTRY: + if (json_node_assert_type (json_node, JSON_NODE_OBJECT, 0, error)) + variant = json_to_gvariant_dict_entry (json_node, signature, error); + break; + + default: + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("GVariant class '%c' not supported"), class); + break; + } + +out: + if (signature) + (*signature)++; + + return variant; +} + +/** + * json_gvariant_deserialize: + * @json_node: A #JsonNode to convert + * @signature: (allow-none): A valid #GVariant type string, or %NULL + * @error: A pointer to a #GError + * + * Converts a JSON data structure to a GVariant value using @signature to + * resolve ambiguous data types. If no error occurs, the resulting #GVariant + * is guaranteed to conform to @signature. + * + * If @signature is not %NULL but does not represent a valid GVariant type + * string, %NULL is returned and error is set to %G_IO_ERROR_INVALID_ARGUMENT. + * If a @signature is provided but the JSON structure cannot be mapped to it, + * %NULL is returned and error is set to %G_IO_ERROR_INVALID_DATA. + * If @signature is %NULL, the conversion is done based strictly on the types + * in the JSON nodes. + * + * The returned variant has a floating reference that will need to be sunk + * by the caller code. + * + * Return value: (transfer none): A newly created, floating #GVariant + * compliant with @signature, or %NULL on error + * + * Since: 0.14 + */ +GVariant * +json_gvariant_deserialize (JsonNode *json_node, + const gchar *signature, + GError **error) +{ + g_return_val_if_fail (json_node != NULL, NULL); + + if (signature != NULL && ! g_variant_type_string_is_valid (signature)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid GVariant signature")); + return NULL; + } + + return json_to_gvariant_recurse (json_node, signature ? &signature : NULL, error); +} + +/** + * json_gvariant_deserialize_data: + * @json: A JSON data string + * @length: The length of @json, or -1 if %NULL-terminated + * @signature: (allow-none): A valid #GVariant type string, or %NULL + * @error: A pointer to a #GError + * + * Converts a JSON string to a #GVariant value. This method works exactly + * like json_gvariant_deserialize(), but takes a JSON encoded string instead. + * The string is first converted to a #JsonNode using #JsonParser, and then + * json_gvariant_deserialize() is called. + * + * The returned variant has a floating reference that will need to be sunk + * by the caller code. + * + * Returns: (transfer none): A newly created, floating #GVariant compliant + * with @signature, or %NULL on error + * + * Since: 0.14 + */ +GVariant * +json_gvariant_deserialize_data (const gchar *json, + gssize length, + const gchar *signature, + GError **error) +{ + JsonParser *parser; + GVariant *variant = NULL; + JsonNode *root; + + parser = json_parser_new (); + + if (! json_parser_load_from_data (parser, json, length, error)) + return NULL; + + root = json_parser_get_root (parser); + if (root == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + _("JSON data is empty")); + } + else + { + variant = + json_gvariant_deserialize (json_parser_get_root (parser), signature, error); + } + + g_object_unref (parser); + + return variant; +} diff --git a/json-glib/json-gvariant.h b/json-glib/json-gvariant.h new file mode 100644 index 0000000..38cfc94 --- /dev/null +++ b/json-glib/json-gvariant.h @@ -0,0 +1,53 @@ +/* json-gvariant.h - JSON GVariant integration + * + * This file is part of JSON-GLib + * Copyright (C) 2007 OpenedHand Ltd. + * Copyright (C) 2009 Intel Corp. + * + * 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, see . + * + * Author: + * Eduardo Lima Mitev + */ + +#ifndef __JSON_GVARIANT_H__ +#define __JSON_GVARIANT_H__ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +JSON_AVAILABLE_IN_1_0 +JsonNode * json_gvariant_serialize (GVariant *variant); +JSON_AVAILABLE_IN_1_0 +gchar * json_gvariant_serialize_data (GVariant *variant, + gsize *length); + +JSON_AVAILABLE_IN_1_0 +GVariant * json_gvariant_deserialize (JsonNode *json_node, + const gchar *signature, + GError **error); +JSON_AVAILABLE_IN_1_0 +GVariant * json_gvariant_deserialize_data (const gchar *json, + gssize length, + const gchar *signature, + GError **error); + +G_END_DECLS + +#endif /* __JSON_GVARIANT_H__ */ diff --git a/json-glib/json-node.c b/json-glib/json-node.c index 8d0cf55..13968bc 100644 --- a/json-glib/json-node.c +++ b/json-glib/json-node.c @@ -21,9 +21,7 @@ * Emmanuele Bassi */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include @@ -48,18 +46,7 @@ * they contain. */ -GType -json_node_get_type (void) -{ - static GType node_type = 0; - - if (G_UNLIKELY (node_type == 0)) - node_type = g_boxed_type_register_static (g_intern_static_string ("JsonNode"), - (GBoxedCopyFunc) json_node_copy, - (GBoxedFreeFunc) json_node_free); - - return node_type; -} +G_DEFINE_BOXED_TYPE (JsonNode, json_node, json_node_copy, json_node_free); /** * json_node_get_value_type: @@ -88,7 +75,10 @@ json_node_get_value_type (JsonNode *node) return G_TYPE_INVALID; case JSON_NODE_VALUE: - return G_VALUE_TYPE (&(node->data.value)); + if (node->data.value) + return JSON_VALUE_TYPE (node->data.value); + else + return G_TYPE_INVALID; default: g_assert_not_reached (); @@ -97,25 +87,280 @@ json_node_get_value_type (JsonNode *node) } /** - * json_node_new: + * json_node_alloc: (constructor) + * + * Allocates a new #JsonNode. Use json_node_init() and its variants + * to initialize the returned value. + * + * Return value: (transfer full): the newly allocated #JsonNode. Use + * json_node_free() to free the resources allocated by this function + * + * Since: 0.16 + */ +JsonNode * +json_node_alloc (void) +{ + return g_slice_new0 (JsonNode); +} + +static void +json_node_unset (JsonNode *node) +{ + g_assert (node != NULL); + + switch (node->type) + { + case JSON_NODE_OBJECT: + if (node->data.object) + json_object_unref (node->data.object); + break; + + case JSON_NODE_ARRAY: + if (node->data.array) + json_array_unref (node->data.array); + break; + + case JSON_NODE_VALUE: + if (node->data.value) + json_value_unref (node->data.value); + break; + + case JSON_NODE_NULL: + break; + } +} + +/** + * json_node_init: + * @node: the #JsonNode to initialize + * @type: the type of JSON node to initialize @node to + * + * Initializes a @node to a specific @type. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init (JsonNode *node, + JsonNodeType type) +{ + g_return_val_if_fail (type >= JSON_NODE_OBJECT && + type <= JSON_NODE_NULL, NULL); + + json_node_unset (node); + + node->type = type; + + return node; +} + +/** + * json_node_init_object: + * @node: the #JsonNode to initialize + * @object: (allow-none): the #JsonObject to initialize @node with, or %NULL + * + * Initializes @node to %JSON_NODE_OBJECT and sets @object into it. + * + * This function will take a reference on @object. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_object (JsonNode *node, + JsonObject *object) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_OBJECT); + json_node_set_object (node, object); + + return node; +} + +/** + * json_node_init_array: + * @node: the #JsonNode to initialize + * @array: (allow-none): the #JsonArray to initialize @node with, or %NULL + * + * Initializes @node to %JSON_NODE_ARRAY and sets @array into it. + * + * This function will take a reference on @array. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_array (JsonNode *node, + JsonArray *array) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_ARRAY); + json_node_set_array (node, array); + + return node; +} + +/** + * json_node_init_int: + * @node: the #JsonNode to initialize + * @value: an integer + * + * Initializes @node to %JSON_NODE_VALUE and sets @value into it. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_int (JsonNode *node, + gint64 value) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_VALUE); + json_node_set_int (node, value); + + return node; +} + +/** + * json_node_init_double: + * @node: the #JsonNode to initialize + * @value: a floating point value + * + * Initializes @node to %JSON_NODE_VALUE and sets @value into it. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_double (JsonNode *node, + gdouble value) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_VALUE); + json_node_set_double (node, value); + + return node; +} + +/** + * json_node_init_boolean: + * @node: the #JsonNode to initialize + * @value: a boolean value + * + * Initializes @node to %JSON_NODE_VALUE and sets @value into it. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_boolean (JsonNode *node, + gboolean value) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_VALUE); + json_node_set_boolean (node, value); + + return node; +} + +/** + * json_node_init_string: + * @node: the #JsonNode to initialize + * @value: (allow-none): a string value + * + * Initializes @node to %JSON_NODE_VALUE and sets @value into it. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_string (JsonNode *node, + const char *value) +{ + g_return_val_if_fail (node != NULL, NULL); + + json_node_init (node, JSON_NODE_VALUE); + json_node_set_string (node, value); + + return node; +} + +/** + * json_node_init_null: + * @node: the #JsonNode to initialize + * + * Initializes @node to %JSON_NODE_NULL. + * + * If the node has already been initialized once, it will be reset to + * the given type, and any data contained will be cleared. + * + * Return value: (transfer none): the initialized #JsonNode + * + * Since: 0.16 + */ +JsonNode * +json_node_init_null (JsonNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + return json_node_init (node, JSON_NODE_NULL); +} + +/** + * json_node_new: (constructor) * @type: a #JsonNodeType * * Creates a new #JsonNode of @type. * - * Return value: the newly created #JsonNode + * This is a convenience function for json_node_alloc() and json_node_init(), + * and it's the equivalent of: + * + * |[ + json_node_init (json_node_alloc (), type); + * ]| + * + * Return value: (transfer full): the newly created #JsonNode */ JsonNode * json_node_new (JsonNodeType type) { - JsonNode *data; - g_return_val_if_fail (type >= JSON_NODE_OBJECT && type <= JSON_NODE_NULL, NULL); - data = g_slice_new0 (JsonNode); - data->type = type; - - return data; + return json_node_init (json_node_alloc (), type); } /** @@ -140,21 +385,16 @@ json_node_copy (JsonNode *node) switch (copy->type) { case JSON_NODE_OBJECT: - if (node->data.object) - copy->data.object = json_object_ref (node->data.object); + copy->data.object = json_node_dup_object (node); break; case JSON_NODE_ARRAY: - if (node->data.array) - copy->data.array = json_array_ref (node->data.array); + copy->data.array = json_node_dup_array (node); break; case JSON_NODE_VALUE: - if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID) - { - g_value_init (&(copy->data.value), G_VALUE_TYPE (&(node->data.value))); - g_value_copy (&(node->data.value), &(copy->data.value)); - } + if (node->data.value) + copy->data.value = json_value_ref (node->data.value); break; case JSON_NODE_NULL: @@ -169,7 +409,7 @@ json_node_copy (JsonNode *node) /** * json_node_set_object: - * @node: a #JsonNode + * @node: a #JsonNode initialized to %JSON_NODE_OBJECT * @object: a #JsonObject * * Sets @objects inside @node. The reference count of @object is increased. @@ -181,7 +421,7 @@ json_node_set_object (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT); - if (node->data.object) + if (node->data.object != NULL) json_object_unref (node->data.object); if (object) @@ -192,8 +432,8 @@ json_node_set_object (JsonNode *node, /** * json_node_take_object: - * @node: a #JsonNode - * @object: a #JsonObject + * @node: a #JsonNode initialized to %JSON_NODE_OBJECT + * @object: (transfer full): a #JsonObject * * Sets @object inside @node. The reference count of @object is not increased. */ @@ -254,7 +494,7 @@ json_node_dup_object (JsonNode *node) /** * json_node_set_array: - * @node: a #JsonNode + * @node: a #JsonNode initialized to %JSON_NODE_ARRAY * @array: a #JsonArray * * Sets @array inside @node and increases the #JsonArray reference count @@ -277,8 +517,8 @@ json_node_set_array (JsonNode *node, /** * json_node_take_array: - * @node: a #JsonNode - * @array: a #JsonArray + * @node: a #JsonNode initialized to %JSON_NODE_ARRAY + * @array: (transfer full): a #JsonArray * * Sets @array into @node without increasing the #JsonArray reference count. */ @@ -317,7 +557,7 @@ json_node_get_array (JsonNode *node) } /** - * json_node_dup_array + * json_node_dup_array: * @node: a #JsonNode * * Retrieves the #JsonArray stored inside a #JsonNode and returns it @@ -341,7 +581,7 @@ json_node_dup_array (JsonNode *node) /** * json_node_get_value: * @node: a #JsonNode - * @value: return location for an uninitialized value + * @value: (out caller-allocates): return location for an uninitialized value * * Retrieves a value from a #JsonNode and copies into @value. When done * using it, call g_value_unset() on the #GValue. @@ -353,23 +593,36 @@ json_node_get_value (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); - if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID) + if (node->data.value) { - g_value_init (value, G_VALUE_TYPE (&(node->data.value))); - g_value_copy (&(node->data.value), value); - } -} + g_value_init (value, JSON_VALUE_TYPE (node->data.value)); + switch (JSON_VALUE_TYPE (node->data.value)) + { + case G_TYPE_INT64: + g_value_set_int64 (value, json_value_get_int (node->data.value)); + break; -static void inline -node_value_unset (JsonNode *node) -{ - if (G_VALUE_TYPE (&(node->data.value)) != G_TYPE_INVALID) - g_value_unset (&(node->data.value)); + case G_TYPE_DOUBLE: + g_value_set_double (value, json_value_get_double (node->data.value)); + break; + + case G_TYPE_BOOLEAN: + g_value_set_boolean (value, json_value_get_boolean (node->data.value)); + break; + + case G_TYPE_STRING: + g_value_set_string (value, json_value_get_string (node->data.value)); + break; + + default: + break; + } + } } /** * json_node_set_value: - * @node: a #JsonNode + * @node: a #JsonNode initialized to %JSON_NODE_VALUE * @value: the #GValue to set * * Sets @value inside @node. The passed #GValue is copied into the #JsonNode @@ -382,32 +635,39 @@ json_node_set_value (JsonNode *node, g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); g_return_if_fail (G_VALUE_TYPE (value) != G_TYPE_INVALID); + if (node->data.value == NULL) + node->data.value = json_value_alloc (); + switch (G_VALUE_TYPE (value)) { - /* direct copy for the types we use */ + /* auto-promote machine integers to 64 bit integers */ case G_TYPE_INT64: - case G_TYPE_BOOLEAN: - case G_TYPE_DOUBLE: - case G_TYPE_STRING: - node_value_unset (node); - g_value_init (&(node->data.value), G_VALUE_TYPE (value)); - g_value_copy (value, &(node->data.value)); + case G_TYPE_INT: + json_value_init (node->data.value, JSON_VALUE_INT); + if (G_VALUE_TYPE (value) == G_TYPE_INT64) + json_value_set_int (node->data.value, g_value_get_int64 (value)); + else + json_value_set_int (node->data.value, g_value_get_int (value)); break; - /* auto-promote ints to long longs */ - case G_TYPE_INT: - node_value_unset (node); - g_value_init (&(node->data.value), G_TYPE_INT64); - g_value_set_int64 (&(node->data.value), - g_value_get_int (value)); + case G_TYPE_BOOLEAN: + json_value_init (node->data.value, JSON_VALUE_BOOLEAN); + json_value_set_boolean (node->data.value, g_value_get_boolean (value)); break; - /* auto-promote single precision to double precision */ + /* auto-promote single-precision floats to double precision floats */ + case G_TYPE_DOUBLE: case G_TYPE_FLOAT: - node_value_unset (node); - g_value_init (&(node->data.value), G_TYPE_DOUBLE); - g_value_set_double (&(node->data.value), - g_value_get_float (value)); + json_value_init (node->data.value, JSON_VALUE_DOUBLE); + if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE) + json_value_set_double (node->data.value, g_value_get_double (value)); + else + json_value_set_double (node->data.value, g_value_get_float (value)); + break; + + case G_TYPE_STRING: + json_value_init (node->data.value, JSON_VALUE_STRING); + json_value_set_string (node->data.value, g_value_get_string (value)); break; default: @@ -429,26 +689,7 @@ json_node_free (JsonNode *node) { if (G_LIKELY (node)) { - switch (node->type) - { - case JSON_NODE_OBJECT: - if (node->data.object) - json_object_unref (node->data.object); - break; - - case JSON_NODE_ARRAY: - if (node->data.array) - json_array_unref (node->data.array); - break; - - case JSON_NODE_VALUE: - g_value_unset (&(node->data.value)); - break; - - case JSON_NODE_NULL: - break; - } - + json_node_unset (node); g_slice_free (JsonNode, node); } } @@ -462,13 +703,8 @@ json_node_free (JsonNode *node) * Return value: a string containing the name of the type. The returned string * is owned by the node and should never be modified or freed */ -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar * -json_node_type_name (JsonNode *node) -#else const gchar * json_node_type_name (JsonNode *node) -#endif { g_return_val_if_fail (node != NULL, "(null)"); @@ -480,19 +716,15 @@ json_node_type_name (JsonNode *node) return json_node_type_get_name (node->type); case JSON_NODE_VALUE: - return g_type_name (G_VALUE_TYPE (&(node->data.value))); + if (node->data.value) + return json_value_type_get_name (node->data.value->type); } return "unknown"; } -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar * -json_node_type_get_name (JsonNodeType node_type) -#else const gchar * json_node_type_get_name (JsonNodeType node_type) -#endif { switch (node_type) { @@ -519,7 +751,7 @@ json_node_type_get_name (JsonNodeType node_type) /** * json_node_set_parent: * @node: a #JsonNode - * @parent: the parent #JsonNode of @node + * @parent: (transfer none): the parent #JsonNode of @node * * Sets the parent #JsonNode of @node * @@ -540,7 +772,8 @@ json_node_set_parent (JsonNode *node, * * Retrieves the parent #JsonNode of @node. * - * Return value: the parent node, or %NULL if @node is the root node + * Return value: (transfer none): the parent node, or %NULL if @node is + * the root node */ JsonNode * json_node_get_parent (JsonNode *node) @@ -552,7 +785,7 @@ json_node_get_parent (JsonNode *node) /** * json_node_set_string: - * @node: a #JsonNode of type %JSON_NODE_VALUE + * @node: a #JsonNode initialized to %JSON_NODE_VALUE * @value: a string value * * Sets @value as the string content of the @node, replacing any existing @@ -565,19 +798,12 @@ json_node_set_string (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING) - g_value_set_string (&(node->data.value), value); + if (node->data.value == NULL) + node->data.value = json_value_init (json_value_alloc (), JSON_VALUE_STRING); else - { - GValue copy = { 0, }; - - g_value_init (©, G_TYPE_STRING); - g_value_set_string (©, value); + json_value_init (node->data.value, JSON_VALUE_STRING); - json_node_set_value (node, ©); - - g_value_unset (©); - } + json_value_set_string (node->data.value, value); } /** @@ -588,21 +814,16 @@ json_node_set_string (JsonNode *node, * * Return value: a string value. */ -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar * -json_node_get_string (JsonNode *node) -#else const gchar * json_node_get_string (JsonNode *node) -#endif { g_return_val_if_fail (node != NULL, NULL); if (JSON_NODE_TYPE (node) == JSON_NODE_NULL) return NULL; - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING) - return g_value_get_string (&(node->data.value)); + if (JSON_VALUE_HOLDS_STRING (node->data.value)) + return json_value_get_string (node->data.value); return NULL; } @@ -621,13 +842,7 @@ json_node_dup_string (JsonNode *node) { g_return_val_if_fail (node != NULL, NULL); - if (JSON_NODE_TYPE (node) == JSON_NODE_NULL) - return NULL; - - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_STRING) - return g_value_dup_string (&(node->data.value)); - - return NULL; + return g_strdup (json_node_get_string (node)); } /** @@ -645,19 +860,12 @@ json_node_set_int (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_INT64) - g_value_set_int64 (&(node->data.value), value); + if (node->data.value == NULL) + node->data.value = json_value_init (json_value_alloc (), JSON_VALUE_INT); else - { - GValue copy = { 0, }; + json_value_init (node->data.value, JSON_VALUE_INT); - g_value_init (©, G_TYPE_INT64); - g_value_set_int64 (©, value); - - json_node_set_value (node, ©); - - g_value_unset (©); - } + json_value_set_int (node->data.value, value); } /** @@ -676,8 +884,14 @@ json_node_get_int (JsonNode *node) if (JSON_NODE_TYPE (node) == JSON_NODE_NULL) return 0; - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_INT64) - return g_value_get_int64 (&(node->data.value)); + if (JSON_VALUE_HOLDS_INT (node->data.value)) + return json_value_get_int (node->data.value); + + if (JSON_VALUE_HOLDS_DOUBLE (node->data.value)) + return json_value_get_double (node->data.value); + + if (JSON_VALUE_HOLDS_BOOLEAN (node->data.value)) + return json_value_get_boolean (node->data.value); return 0; } @@ -697,19 +911,12 @@ json_node_set_double (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_DOUBLE) - g_value_set_double (&(node->data.value), value); + if (node->data.value == NULL) + node->data.value = json_value_init (json_value_alloc (), JSON_VALUE_DOUBLE); else - { - GValue copy = { 0, }; - - g_value_init (©, G_TYPE_DOUBLE); - g_value_set_double (©, value); + json_value_init (node->data.value, JSON_VALUE_DOUBLE); - json_node_set_value (node, ©); - - g_value_unset (©); - } + json_value_set_double (node->data.value, value); } /** @@ -728,8 +935,14 @@ json_node_get_double (JsonNode *node) if (JSON_NODE_TYPE (node) == JSON_NODE_NULL) return 0; - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_DOUBLE) - return g_value_get_double (&(node->data.value)); + if (JSON_VALUE_HOLDS_DOUBLE (node->data.value)) + return json_value_get_double (node->data.value); + + if (JSON_VALUE_HOLDS_INT (node->data.value)) + return (gdouble) json_value_get_int (node->data.value); + + if (JSON_VALUE_HOLDS_BOOLEAN (node->data.value)) + return (gdouble) json_value_get_boolean (node->data.value); return 0.0; } @@ -749,19 +962,12 @@ json_node_set_boolean (JsonNode *node, g_return_if_fail (node != NULL); g_return_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE); - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_BOOLEAN) - g_value_set_boolean (&(node->data.value), value); + if (node->data.value == NULL) + node->data.value = json_value_init (json_value_alloc (), JSON_VALUE_BOOLEAN); else - { - GValue copy = { 0, }; - - g_value_init (©, G_TYPE_BOOLEAN); - g_value_set_boolean (©, value); - - json_node_set_value (node, ©); + json_value_init (node->data.value, JSON_VALUE_BOOLEAN); - g_value_unset (©); - } + json_value_set_boolean (node->data.value, value); } /** @@ -780,8 +986,14 @@ json_node_get_boolean (JsonNode *node) if (JSON_NODE_TYPE (node) == JSON_NODE_NULL) return FALSE; - if (G_VALUE_TYPE (&(node->data.value)) == G_TYPE_BOOLEAN) - return g_value_get_boolean (&(node->data.value)); + if (JSON_VALUE_HOLDS_BOOLEAN (node->data.value)) + return json_value_get_boolean (node->data.value); + + if (JSON_VALUE_HOLDS_INT (node->data.value)) + return json_value_get_int (node->data.value) != 0; + + if (JSON_VALUE_HOLDS_DOUBLE (node->data.value)) + return json_value_get_double (node->data.value) != 0.0; return FALSE; } @@ -808,9 +1020,10 @@ json_node_get_node_type (JsonNode *node) * json_node_is_null: * @node: a #JsonNode * - * Checks whether @node is a %JSON_NODE_NULL + * Checks whether @node is a %JSON_NODE_NULL. * - * A null node is not the same as a %NULL #JsonNode + * A %JSON_NODE_NULL node is not the same as a %NULL #JsonNode; a + * %JSON_NODE_NULL represents a 'null' value in the JSON tree. * * Return value: %TRUE if the node is null * diff --git a/json-glib/json-object.c b/json-glib/json-object.c index 43ff15b..6d203b2 100644 --- a/json-glib/json-object.c +++ b/json-glib/json-object.c @@ -21,10 +21,9 @@ * Emmanuele Bassi */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif +#include #include #include "json-types-private.h" @@ -33,9 +32,10 @@ * SECTION:json-object * @short_description: a JSON object representation * - * #JsonArray is the representation of the object type inside JSON. It contains - * #JsonNodes, which may contain fundamental types, arrays or other - * objects. Each member of an object is accessed using its name. + * #JsonObject is the representation of the object type inside JSON. It + * contains #JsonNodes, which may contain fundamental types, arrays or other + * objects; each node inside an object, or "member", is accessed using a + * unique string, or "name". * * Since objects can be expensive, they are reference counted. You can control * the lifetime of a #JsonObject using json_object_ref() and json_object_unref(). @@ -47,25 +47,14 @@ * use json_object_get_size(). */ -GType -json_object_get_type (void) -{ - static GType object_type = 0; - - if (G_UNLIKELY (!object_type)) - object_type = g_boxed_type_register_static (g_intern_static_string ("JsonObject"), - (GBoxedCopyFunc) json_object_ref, - (GBoxedFreeFunc) json_object_unref); - - return object_type; -} +G_DEFINE_BOXED_TYPE (JsonObject, json_object, json_object_ref, json_object_unref); /** - * json_object_new: + * json_object_new: (constructor) * * Creates a new #JsonObject, an JSON object type representation. * - * Return value: the newly created #JsonObject + * Return value: (transfer full): the newly created #JsonObject */ JsonObject * json_object_new (void) @@ -89,7 +78,7 @@ json_object_new (void) * * Increase by one the reference count of a #JsonObject. * - * Return value: the passed #JsonObject, with the reference count + * Return value: (transfer none): the passed #JsonObject, with the reference count * increased by one. */ JsonObject * @@ -98,11 +87,8 @@ json_object_ref (JsonObject *object) g_return_val_if_fail (object != NULL, NULL); g_return_val_if_fail (object->ref_count > 0, NULL); -#if !GLIB_CHECK_VERSION(2, 31, 0) - g_atomic_int_exchange_and_add (&object->ref_count, 1); -#else g_atomic_int_add (&object->ref_count, 1); -#endif + return object; } @@ -117,15 +103,10 @@ json_object_ref (JsonObject *object) void json_object_unref (JsonObject *object) { - gint old_ref; - g_return_if_fail (object != NULL); g_return_if_fail (object->ref_count > 0); - old_ref = g_atomic_int_get (&object->ref_count); - if (old_ref > 1) - g_atomic_int_compare_and_exchange (&object->ref_count, old_ref, old_ref - 1); - else + if (g_atomic_int_dec_and_test (&object->ref_count)) { g_list_free (object->members_ordered); g_hash_table_destroy (object->members); @@ -145,6 +126,18 @@ object_set_member_internal (JsonObject *object, if (g_hash_table_lookup (object->members, name) == NULL) object->members_ordered = g_list_prepend (object->members_ordered, name); + else + { + GList *l; + + /* if the member already exists then we need to replace the + * pointer to its name, to avoid keeping invalid pointers + * once we replace the key in the hash table + */ + l = g_list_find_custom (object->members_ordered, name, (GCompareFunc) strcmp); + if (l != NULL) + l->data = name; + } g_hash_table_replace (object->members, name, node); } @@ -153,7 +146,7 @@ object_set_member_internal (JsonObject *object, * json_object_add_member: * @object: a #JsonObject * @member_name: the name of the member - * @node: the value of the member + * @node: (transfer full): the value of the member * * Adds a member named @member_name and containing @node into a #JsonObject. * The object will take ownership of the #JsonNode. @@ -187,7 +180,7 @@ json_object_add_member (JsonObject *object, * json_object_set_member: * @object: a #JsonObject * @member_name: the name of the member - * @node: the value of the member + * @node: (transfer full): the value of the member * * Sets @node as the value of @member_name inside @object. * @@ -202,10 +195,20 @@ json_object_set_member (JsonObject *object, const gchar *member_name, JsonNode *node) { + JsonNode *old_node; + g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); g_return_if_fail (node != NULL); + old_node = g_hash_table_lookup (object->members, member_name); + if (old_node == NULL) + goto set_member; + + if (old_node == node) + return; + +set_member: object_set_member_internal (object, member_name, node); } @@ -227,14 +230,10 @@ json_object_set_int_member (JsonObject *object, const gchar *member_name, gint64 value) { - JsonNode *node; - g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_int (node, value); - object_set_member_internal (object, member_name, node); + object_set_member_internal (object, member_name, json_node_init_int (json_node_alloc (), value)); } /** @@ -255,14 +254,10 @@ json_object_set_double_member (JsonObject *object, const gchar *member_name, gdouble value) { - JsonNode *node; - g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_double (node, value); - object_set_member_internal (object, member_name, node); + object_set_member_internal (object, member_name, json_node_init_double (json_node_alloc (), value)); } /** @@ -283,14 +278,10 @@ json_object_set_boolean_member (JsonObject *object, const gchar *member_name, gboolean value) { - JsonNode *node; - g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (node, value); - object_set_member_internal (object, member_name, node); + object_set_member_internal (object, member_name, json_node_init_boolean (json_node_alloc (), value)); } /** @@ -316,8 +307,13 @@ json_object_set_string_member (JsonObject *object, g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_VALUE); - json_node_set_string (node, value); + node = json_node_alloc (); + + if (value != NULL) + json_node_init_string (node, value); + else + json_node_init_null (node); + object_set_member_internal (object, member_name, node); } @@ -337,20 +333,17 @@ void json_object_set_null_member (JsonObject *object, const gchar *member_name) { - JsonNode *node; - g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_NULL); - object_set_member_internal (object, member_name, node); + object_set_member_internal (object, member_name, json_node_init_null (json_node_alloc ())); } /** * json_object_set_array_member: * @object: a #JsonObject * @member_name: the name of the member - * @value: the value of the member + * @value: (transfer full): the value of the member * * Convenience function for setting an array @value of * @member_name inside @object. @@ -371,8 +364,16 @@ json_object_set_array_member (JsonObject *object, g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (node, value); + node = json_node_alloc (); + + if (value != NULL) + { + json_node_init_array (node, value); + json_array_unref (value); + } + else + json_node_init_null (node); + object_set_member_internal (object, member_name, node); } @@ -380,7 +381,7 @@ json_object_set_array_member (JsonObject *object, * json_object_set_object_member: * @object: a #JsonObject * @member_name: the name of the member - * @value: the value of the member + * @value: (transfer full): the value of the member * * Convenience function for setting an object @value of * @member_name inside @object. @@ -401,8 +402,16 @@ json_object_set_object_member (JsonObject *object, g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - node = json_node_new (JSON_NODE_OBJECT); - json_node_take_object (node, value); + node = json_node_alloc (); + + if (value != NULL) + { + json_node_init_object (node, value); + json_object_unref (value); + } + else + json_node_init_null (node); + object_set_member_internal (object, member_name, node); } @@ -438,7 +447,7 @@ json_object_get_members (JsonObject *object) * Retrieves all the values of the members of a #JsonObject. * * Return value: (element-type JsonNode) (transfer container): a #GList of - * #JsonNodes. The content of the list is owned by the #JsonObject + * #JsonNodes. The content of the list is owned by the #JsonObject * and should never be modified or freed. When you have finished using the * returned list, use g_list_free() to free the resources it has allocated. */ @@ -464,7 +473,7 @@ json_object_get_values (JsonObject *object) * Retrieves a copy of the #JsonNode containing the value of @member_name * inside a #JsonObject * - * Return value: (transfer full) a copy of the node for the requested + * Return value: (transfer full): a copy of the node for the requested * object member or %NULL. Use json_node_free() when done. * * Since: 0.6 @@ -500,7 +509,7 @@ object_get_member_internal (JsonObject *object, * Retrieves the #JsonNode containing the value of @member_name inside * a #JsonObject. * - * Return value: a pointer to the node for the requested object + * Return value: (transfer none): a pointer to the node for the requested object * member, or %NULL */ JsonNode * @@ -629,7 +638,16 @@ json_object_get_null_member (JsonObject *object, node = object_get_member_internal (object, member_name); g_return_val_if_fail (node != NULL, FALSE); - return JSON_NODE_TYPE (node) == JSON_NODE_NULL; + if (JSON_NODE_HOLDS_NULL (node)) + return TRUE; + + if (JSON_NODE_HOLDS_OBJECT (node)) + return json_node_get_object (node) == NULL; + + if (JSON_NODE_HOLDS_ARRAY (node)) + return json_node_get_array (node) == NULL; + + return FALSE; } /** @@ -646,15 +664,9 @@ json_object_get_null_member (JsonObject *object, * * Since: 0.8 */ -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar * -json_object_get_string_member (JsonObject *object, - const gchar *member_name) -#else const gchar * json_object_get_string_member (JsonObject *object, const gchar *member_name) -#endif { JsonNode *node; @@ -663,7 +675,10 @@ json_object_get_string_member (JsonObject *object, node = object_get_member_internal (object, member_name); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_VALUE (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_string (node); } @@ -693,7 +708,10 @@ json_object_get_array_member (JsonObject *object, node = object_get_member_internal (object, member_name); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_ARRAY, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_ARRAY (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_array (node); } @@ -723,7 +741,10 @@ json_object_get_object_member (JsonObject *object, node = object_get_member_internal (object, member_name); g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_OBJECT, NULL); + g_return_val_if_fail (JSON_NODE_HOLDS_OBJECT (node) || JSON_NODE_HOLDS_NULL (node), NULL); + + if (JSON_NODE_HOLDS_NULL (node)) + return NULL; return json_node_get_object (node); } @@ -796,8 +817,8 @@ json_object_remove_member (JsonObject *object, /** * json_object_foreach_member: * @object: a #JsonObject - * @func: the function to be called on each member - * @data: data to be passed to the function + * @func: (scope call): the function to be called on each member + * @data: (closure): data to be passed to the function * * Iterates over all members of @object and calls @func on * each one of them. diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c index 5d67d0c..e2343b6 100644 --- a/json-glib/json-parser.c +++ b/json-glib/json-parser.c @@ -1,8 +1,9 @@ /* json-parser.c - JSON streams parser * * This file is part of JSON-GLib - * Copyright (C) 2007 OpenedHand Ltd. - * Copyright (C) 2009 Intel Corp. + * + * Copyright © 2007, 2008, 2009 OpenedHand Ltd + * Copyright © 2009, 2010 Intel Corp. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,27 +30,19 @@ * inside a file or inside a static buffer. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include +#include + #include "json-types-private.h" +#include "json-debug.h" #include "json-marshal.h" #include "json-parser.h" #include "json-scanner.h" -GQuark -json_parser_error_quark (void) -{ - return g_quark_from_static_string ("json-parser-error"); -} - -#define JSON_PARSER_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((obj), JSON_TYPE_PARSER, JsonParserPrivate)) - struct _JsonParserPrivate { JsonNode *root; @@ -57,6 +50,7 @@ struct _JsonParserPrivate JsonScanner *scanner; + JsonParserError error_code; GError *last_error; gchar *variable_name; @@ -102,7 +96,9 @@ enum static guint parser_signals[LAST_SIGNAL] = { 0, }; -G_DEFINE_TYPE (JsonParser, json_parser, G_TYPE_OBJECT); +G_DEFINE_QUARK (json-parser-error-quark, json_parser_error) + +G_DEFINE_TYPE_WITH_PRIVATE (JsonParser, json_parser, G_TYPE_OBJECT) static guint json_parse_array (JsonParser *parser, JsonScanner *scanner, @@ -156,8 +152,6 @@ json_parser_class_init (JsonParserClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - g_type_class_add_private (klass, sizeof (JsonParserPrivate)); - gobject_class->dispose = json_parser_dispose; gobject_class->finalize = json_parser_finalize; @@ -281,7 +275,7 @@ json_parser_class_init (JsonParserClass *klass) /** * JsonParser::array-end: * @parser: the #JsonParser that received the signal - * @array: the parsed #JsonArrary + * @array: the parsed #JsonArray * * The ::array-end signal is emitted each time the #JsonParser * has successfully parsed an entire #JsonArray @@ -317,13 +311,16 @@ json_parser_class_init (JsonParserClass *klass) static void json_parser_init (JsonParser *parser) { - JsonParserPrivate *priv; + JsonParserPrivate *priv = json_parser_get_instance_private (parser); - parser->priv = priv = JSON_PARSER_GET_PRIVATE (parser); + parser->priv = priv; priv->root = NULL; priv->current_node = NULL; + priv->error_code = JSON_PARSER_ERROR_PARSE; + priv->last_error = NULL; + priv->has_assignment = FALSE; priv->variable_name = NULL; @@ -337,7 +334,8 @@ json_parse_value (JsonParser *parser, guint token, JsonNode **node) { - JsonNode *current_node = parser->priv->current_node; + JsonParserPrivate *priv = parser->priv; + JsonNode *current_node = priv->current_node; gboolean is_negative = FALSE; if (token == '-') @@ -357,46 +355,73 @@ json_parse_value (JsonParser *parser, switch (token) { case G_TOKEN_INT: - *node = json_node_new (JSON_NODE_VALUE); - json_node_set_int (*node, is_negative ? scanner->value.v_int64 * -1 - : scanner->value.v_int64); + JSON_NOTE (PARSER, "abs(node): %" G_GINT64_FORMAT " (sign: %s)", + scanner->value.v_int64, + is_negative ? "negative" : "positive"); + *node = json_node_init_int (json_node_alloc (), + is_negative ? scanner->value.v_int64 * -1 + : scanner->value.v_int64); break; case G_TOKEN_FLOAT: - *node = json_node_new (JSON_NODE_VALUE); - json_node_set_double (*node, is_negative ? scanner->value.v_float * -1.0 - : scanner->value.v_float); + JSON_NOTE (PARSER, "abs(node): %.6f (sign: %s)", + scanner->value.v_float, + is_negative ? "negative" : "positive"); + *node = json_node_init_double (json_node_alloc (), + is_negative ? scanner->value.v_float * -1.0 + : scanner->value.v_float); break; case G_TOKEN_STRING: - *node = json_node_new (JSON_NODE_VALUE); - json_node_set_string (*node, scanner->value.v_string); + JSON_NOTE (PARSER, "node: '%s'", + scanner->value.v_string); + *node = json_node_init_string (json_node_alloc (), scanner->value.v_string); break; case JSON_TOKEN_TRUE: case JSON_TOKEN_FALSE: - *node = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (*node, token == JSON_TOKEN_TRUE ? TRUE : FALSE); + JSON_NOTE (PARSER, "node: '%s'", + JSON_TOKEN_TRUE ? "" : ""); + *node = json_node_init_boolean (json_node_alloc (), token == JSON_TOKEN_TRUE ? TRUE : FALSE); break; case JSON_TOKEN_NULL: - *node = json_node_new (JSON_NODE_NULL); + JSON_NOTE (PARSER, "node: "); + *node = json_node_init_null (json_node_alloc ()); break; + case G_TOKEN_IDENTIFIER: + JSON_NOTE (PARSER, "node: identifier '%s'", scanner->value.v_identifier); + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; + *node = NULL; + return G_TOKEN_SYMBOL; + default: { JsonNodeType cur_type; *node = NULL; + JSON_NOTE (PARSER, "node: invalid token"); + cur_type = json_node_get_node_type (current_node); if (cur_type == JSON_NODE_ARRAY) - return G_TOKEN_RIGHT_BRACE; + { + priv->error_code = JSON_PARSER_ERROR_PARSE; + return G_TOKEN_RIGHT_BRACE; + } else if (cur_type == JSON_NODE_OBJECT) - return G_TOKEN_RIGHT_CURLY; + { + priv->error_code = JSON_PARSER_ERROR_PARSE; + return G_TOKEN_RIGHT_CURLY; + } else - return G_TOKEN_SYMBOL; + { + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; + return G_TOKEN_SYMBOL; + } } + break; } return G_TOKEN_NONE; @@ -414,7 +439,7 @@ json_parse_array (JsonParser *parser, gint idx; old_current = priv->current_node; - priv->current_node = json_node_new (JSON_NODE_ARRAY); + priv->current_node = json_node_init_array (json_node_alloc (), NULL); array = json_array_new (); @@ -433,30 +458,21 @@ json_parse_array (JsonParser *parser, switch (next_token) { case G_TOKEN_LEFT_BRACE: + JSON_NOTE (PARSER, "Nested array at index %d", idx); token = json_parse_array (parser, scanner, &element); break; case G_TOKEN_LEFT_CURLY: + JSON_NOTE (PARSER, "Nested object at index %d", idx); token = json_parse_object (parser, scanner, &element); break; - case G_TOKEN_INT: - case G_TOKEN_FLOAT: - case G_TOKEN_STRING: - case '-': - case JSON_TOKEN_TRUE: - case JSON_TOKEN_FALSE: - case JSON_TOKEN_NULL: - token = json_scanner_get_next_token (scanner); - token = json_parse_value (parser, scanner, token, &element); - break; - case G_TOKEN_RIGHT_BRACE: goto array_done; default: - if (next_token != G_TOKEN_RIGHT_BRACE) - token = G_TOKEN_RIGHT_BRACE; + token = json_scanner_get_next_token (scanner); + token = json_parse_value (parser, scanner, token, &element); break; } @@ -480,6 +496,8 @@ json_parse_array (JsonParser *parser, /* look for trailing commas */ if (next_token == G_TOKEN_RIGHT_BRACE) { + priv->error_code = JSON_PARSER_ERROR_TRAILING_COMMA; + json_array_unref (array); json_node_free (priv->current_node); json_node_free (element); @@ -489,6 +507,7 @@ json_parse_array (JsonParser *parser, } } + JSON_NOTE (PARSER, "Array element %d completed", idx + 1); json_node_set_parent (element, priv->current_node); json_array_add_element (array, element); @@ -526,7 +545,7 @@ json_parse_object (JsonParser *parser, guint token; old_current = priv->current_node; - priv->current_node = json_node_new (JSON_NODE_OBJECT); + priv->current_node = json_node_init_object (json_node_alloc (), NULL); object = json_object_new (); @@ -550,6 +569,10 @@ json_parse_object (JsonParser *parser, /* parse the member's name */ if (next_token != G_TOKEN_STRING) { + JSON_NOTE (PARSER, "Missing object member name"); + + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; + json_object_unref (object); json_node_free (priv->current_node); priv->current_node = old_current; @@ -560,11 +583,29 @@ json_parse_object (JsonParser *parser, /* member name */ token = json_scanner_get_next_token (scanner); name = g_strdup (scanner->value.v_string); + if (name == NULL || *name == '\0') + { + JSON_NOTE (PARSER, "Empty object member name"); + + priv->error_code = JSON_PARSER_ERROR_EMPTY_MEMBER_NAME; + + json_object_unref (object); + json_node_free (priv->current_node); + priv->current_node = old_current; + + return G_TOKEN_STRING; + } + + JSON_NOTE (PARSER, "Object member '%s'", name); /* a colon separates names from values */ next_token = json_scanner_peek_next_token (scanner); if (next_token != ':') { + JSON_NOTE (PARSER, "Missing object member name separator"); + + priv->error_code = JSON_PARSER_ERROR_MISSING_COLON; + g_free (name); json_object_unref (object); json_node_free (priv->current_node); @@ -582,27 +623,19 @@ json_parse_object (JsonParser *parser, switch (next_token) { case G_TOKEN_LEFT_BRACE: + JSON_NOTE (PARSER, "Nested array at member %s", name); token = json_parse_array (parser, scanner, &member); break; case G_TOKEN_LEFT_CURLY: + JSON_NOTE (PARSER, "Nested object at member %s", name); token = json_parse_object (parser, scanner, &member); break; - case G_TOKEN_INT: - case G_TOKEN_FLOAT: - case G_TOKEN_STRING: - case '-': - case JSON_TOKEN_TRUE: - case JSON_TOKEN_FALSE: - case JSON_TOKEN_NULL: - token = json_scanner_get_next_token (scanner); - token = json_parse_value (parser, scanner, token, &member); - break; - default: /* once a member name is defined we need a value */ - token = G_TOKEN_SYMBOL; + token = json_scanner_get_next_token (scanner); + token = json_parse_value (parser, scanner, token, &member); break; } @@ -626,6 +659,8 @@ json_parse_object (JsonParser *parser, /* look for trailing commas */ if (next_token == G_TOKEN_RIGHT_CURLY) { + priv->error_code = JSON_PARSER_ERROR_TRAILING_COMMA; + json_object_unref (object); json_node_free (member); json_node_free (priv->current_node); @@ -636,6 +671,8 @@ json_parse_object (JsonParser *parser, } else if (next_token == G_TOKEN_STRING) { + priv->error_code = JSON_PARSER_ERROR_MISSING_COMMA; + json_object_unref (object); json_node_free (member); json_node_free (priv->current_node); @@ -644,6 +681,7 @@ json_parse_object (JsonParser *parser, return G_TOKEN_COMMA; } + JSON_NOTE (PARSER, "Object member '%s' completed", name); json_node_set_parent (member, priv->current_node); json_object_set_member (object, name, member); @@ -682,9 +720,11 @@ json_parse_statement (JsonParser *parser, switch (token) { case G_TOKEN_LEFT_CURLY: + JSON_NOTE (PARSER, "Statement is object declaration"); return json_parse_object (parser, scanner, &priv->root); case G_TOKEN_LEFT_BRACE: + JSON_NOTE (PARSER, "Statement is array declaration"); return json_parse_array (parser, scanner, &priv->root); /* some web APIs are not only passing the data structures: they are @@ -697,20 +737,29 @@ json_parse_statement (JsonParser *parser, guint next_token; gchar *name; + JSON_NOTE (PARSER, "Statement is an assignment"); + /* swallow the 'var' token... */ token = json_scanner_get_next_token (scanner); /* ... swallow the variable name... */ next_token = json_scanner_get_next_token (scanner); if (next_token != G_TOKEN_IDENTIFIER) - return G_TOKEN_IDENTIFIER; + { + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; + return G_TOKEN_IDENTIFIER; + } name = g_strdup (scanner->value.v_identifier); /* ... and finally swallow the '=' */ next_token = json_scanner_get_next_token (scanner); if (next_token != '=') - return '='; + { + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; + g_free (name); + return '='; + } priv->has_assignment = TRUE; priv->variable_name = name; @@ -730,91 +779,47 @@ json_parse_statement (JsonParser *parser, break; case JSON_TOKEN_NULL: - priv->root = priv->current_node = json_node_new (JSON_NODE_NULL); - json_scanner_get_next_token (scanner); - return G_TOKEN_NONE; - case JSON_TOKEN_TRUE: case JSON_TOKEN_FALSE: - priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (priv->current_node, - token == JSON_TOKEN_TRUE ? TRUE : FALSE); - json_scanner_get_next_token (scanner); - return G_TOKEN_NONE; - case '-': - { - guint next_token; - - token = json_scanner_get_next_token (scanner); - next_token = json_scanner_peek_next_token (scanner); - - if (next_token == G_TOKEN_INT || next_token == G_TOKEN_FLOAT) - { - priv->root = priv->current_node = json_node_new (JSON_NODE_VALUE); - - token = json_scanner_get_next_token (scanner); - switch (token) - { - case G_TOKEN_INT: - json_node_set_int (priv->current_node, - scanner->value.v_int64 * -1); - break; - case G_TOKEN_FLOAT: - json_node_set_double (priv->current_node, - scanner->value.v_float * -1.0); - break; - default: - return G_TOKEN_INT; - } - - json_scanner_get_next_token (scanner); - return G_TOKEN_NONE; - } - else - return G_TOKEN_INT; - } - break; - case G_TOKEN_INT: case G_TOKEN_FLOAT: case G_TOKEN_STRING: + case G_TOKEN_IDENTIFIER: + JSON_NOTE (PARSER, "Statement is a value"); token = json_scanner_get_next_token (scanner); return json_parse_value (parser, scanner, token, &priv->root); default: + JSON_NOTE (PARSER, "Unknown statement"); json_scanner_get_next_token (scanner); + priv->error_code = JSON_PARSER_ERROR_INVALID_BAREWORD; return G_TOKEN_SYMBOL; } } static void json_scanner_msg_handler (JsonScanner *scanner, - gchar *message, - gboolean is_error) + gchar *message) { JsonParser *parser = scanner->user_data; JsonParserPrivate *priv = parser->priv; + GError *error = NULL; - if (is_error) - { - GError *error = NULL; - - g_set_error (&error, JSON_PARSER_ERROR, - JSON_PARSER_ERROR_PARSE, - "%s:%d: Parse error: %s", - priv->is_filename ? priv->filename : "", - scanner->line, - message); - - parser->priv->last_error = error; - g_signal_emit (parser, parser_signals[ERROR], 0, error); - } - else - g_warning ("%s:%d: Parse error: %s", - priv->is_filename ? priv->filename : "", + /* translators: %s: is the file name, the first %d is the line + * number, the second %d is the position on the line, and %s is + * the error message + */ + g_set_error (&error, JSON_PARSER_ERROR, + priv->error_code, + _("%s:%d:%d: Parse error: %s"), + priv->is_filename ? priv->filename : "", scanner->line, + scanner->position, message); + + parser->priv->last_error = error; + g_signal_emit (parser, parser_signals[ERROR], 0, error); } static JsonScanner * @@ -827,6 +832,10 @@ json_scanner_create (JsonParser *parser) scanner->msg_handler = json_scanner_msg_handler; scanner->user_data = parser; + /* XXX: this is eminently stupid, but we use the symbols later on, so + * we cannot move them into JsonScanner without moving a bunch of code + * as well + */ for (i = 0; i < n_symbols; i++) { json_scanner_scope_add_symbol (scanner, 0, @@ -867,6 +876,15 @@ json_parser_load (JsonParser *parser, json_parser_clear (parser); + if (!g_utf8_validate (data, length, NULL)) + { + g_set_error_literal (error, JSON_PARSER_ERROR, + JSON_PARSER_ERROR_INVALID_DATA, + _("JSON data must be UTF-8 encoded")); + g_signal_emit (parser, parser_signals[ERROR], 0, *error); + return FALSE; + } + scanner = json_scanner_create (parser); json_scanner_input_text (scanner, data, length); @@ -882,6 +900,7 @@ json_parser_load (JsonParser *parser, else { guint expected_token; + gint cur_token; /* we try to show the expected token, if possible */ expected_token = json_parse_statement (parser, scanner); @@ -890,8 +909,10 @@ json_parser_load (JsonParser *parser, const gchar *symbol_name; gchar *msg; + cur_token = scanner->token; msg = NULL; symbol_name = NULL; + if (scanner->scope_id == 0) { if (expected_token > JSON_TOKEN_INVALID && @@ -905,13 +926,13 @@ json_parser_load (JsonParser *parser, msg = g_strconcat ("e.g. '", symbol_name, "'", NULL); } - if (scanner->token > JSON_TOKEN_INVALID && - scanner->token < JSON_TOKEN_LAST) + if (cur_token > JSON_TOKEN_INVALID && + cur_token < JSON_TOKEN_LAST) { symbol_name = "???"; for (i = 0; i < n_symbols; i++) - if (symbols[i].token == scanner->token) + if (symbols[i].token == cur_token) symbol_name = symbol_names + symbols[i].name_offset; } } @@ -921,8 +942,7 @@ json_parser_load (JsonParser *parser, */ json_scanner_unexp_token (scanner, expected_token, NULL, "value", - symbol_name, msg, - TRUE); + symbol_name, msg); /* and this will propagate the error we create in the * same message handler @@ -1083,8 +1103,8 @@ json_parser_get_current_line (JsonParser *parser) { g_return_val_if_fail (JSON_IS_PARSER (parser), 0); - if (parser->priv->scanner) - return json_scanner_cur_line (parser->priv->scanner); + if (parser->priv->scanner != NULL) + return parser->priv->scanner->line; return 0; } @@ -1107,8 +1127,8 @@ json_parser_get_current_pos (JsonParser *parser) { g_return_val_if_fail (JSON_IS_PARSER (parser), 0); - if (parser->priv->scanner) - return json_scanner_cur_line (parser->priv->scanner); + if (parser->priv->scanner != NULL) + return parser->priv->scanner->position; return 0; } @@ -1116,7 +1136,7 @@ json_parser_get_current_pos (JsonParser *parser) /** * json_parser_has_assignment: * @parser: a #JsonParser - * @variable_name: (out) (allow-none): Return location for the variable + * @variable_name: (out) (allow-none) (transfer none): Return location for the variable * name, or %NULL * * A JSON data stream might sometimes contain an assignment, like: @@ -1154,3 +1174,274 @@ json_parser_has_assignment (JsonParser *parser, return priv->has_assignment; } + +#define GET_DATA_BLOCK_SIZE 8192 + +/** + * json_parser_load_from_stream: + * @parser: a #JsonParser + * @stream: an open #GInputStream + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: the return location for a #GError, or %NULL + * + * Loads the contents of an input stream and parses them. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the @cancellable object from another thread. If the + * operation was cancelled, the error %G_IO_ERROR_CANCELLED will be set + * on the passed @error. + * + * Return value: %TRUE if the data stream was successfully read and + * parsed, and %FALSE otherwise + * + * Since: 0.12 + */ +gboolean +json_parser_load_from_stream (JsonParser *parser, + GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GByteArray *content; + gsize pos; + gssize res; + gboolean retval = FALSE; + GError *internal_error; + + g_return_val_if_fail (JSON_IS_PARSER (parser), FALSE); + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + content = g_byte_array_new (); + pos = 0; + + g_byte_array_set_size (content, pos + GET_DATA_BLOCK_SIZE + 1); + while ((res = g_input_stream_read (stream, content->data + pos, + GET_DATA_BLOCK_SIZE, + cancellable, error)) > 0) + { + pos += res; + g_byte_array_set_size (content, pos + GET_DATA_BLOCK_SIZE + 1); + } + + if (res < 0) + { + /* error has already been set */ + retval = FALSE; + goto out; + } + + /* zero-terminate the content; we allocated an extra byte for this */ + content->data[pos] = 0; + + internal_error = NULL; + retval = json_parser_load (parser, (const gchar *) content->data, pos, &internal_error); + + if (internal_error != NULL) + g_propagate_error (error, internal_error); + +out: + g_byte_array_free (content, TRUE); + + return retval; +} + +typedef struct _LoadStreamData +{ + JsonParser *parser; + GError *error; + GCancellable *cancellable; + GAsyncReadyCallback callback; + gpointer user_data; + GByteArray *content; + gsize pos; +} LoadStreamData; + +static void +load_stream_data_free (gpointer data) +{ + LoadStreamData *closure; + + if (G_UNLIKELY (data == NULL)) + return; + + closure = data; + + if (closure->error) + g_error_free (closure->error); + + if (closure->cancellable) + g_object_unref (closure->cancellable); + + if (closure->content) + g_byte_array_free (closure->content, TRUE); + + g_object_unref (closure->parser); + + g_free (closure); +} + +static void +load_stream_data_read_callback (GObject *object, + GAsyncResult *read_res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (object); + LoadStreamData *data = user_data; + GError *error = NULL; + gssize read_size; + + read_size = g_input_stream_read_finish (stream, read_res, &error); + if (read_size < 0) + { + if (error != NULL) + data->error = error; + else + { + GSimpleAsyncResult *res; + + /* EOF */ + res = g_simple_async_result_new (G_OBJECT (data->parser), + data->callback, + data->user_data, + json_parser_load_from_stream_async); + g_simple_async_result_set_op_res_gpointer (res, data, load_stream_data_free); + g_simple_async_result_complete (res); + g_object_unref (res); + } + } + else if (read_size > 0) + { + data->pos += read_size; + + g_byte_array_set_size (data->content, data->pos + GET_DATA_BLOCK_SIZE); + + g_input_stream_read_async (stream, data->content->data + data->pos, + GET_DATA_BLOCK_SIZE, + 0, + data->cancellable, + load_stream_data_read_callback, + data); + } + else + { + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (data->parser), + data->callback, + data->user_data, + json_parser_load_from_stream_async); + g_simple_async_result_set_op_res_gpointer (res, data, load_stream_data_free); + g_simple_async_result_complete (res); + g_object_unref (res); + } +} + +/** + * json_parser_load_from_stream_finish: + * @parser: a #JsonParser + * @result: a #GAsyncResult + * @error: the return location for a #GError or %NULL + * + * Finishes an asynchronous stream loading started with + * json_parser_load_from_stream_async(). + * + * Return value: %TRUE if the content of the stream was successfully retrieves + * and parsed, and %FALSE otherwise. In case of error, the #GError will be + * filled accordingly. + * + * Since: 0.12 + */ +gboolean +json_parser_load_from_stream_finish (JsonParser *parser, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GError *internal_error; + LoadStreamData *data; + gboolean res; + + g_return_val_if_fail (JSON_IS_PARSER (parser), FALSE); + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == json_parser_load_from_stream_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + if (data->error) + { + g_propagate_error (error, data->error); + data->error = NULL; + return FALSE; + } + + g_byte_array_set_size (data->content, data->pos + 1); + data->content->data[data->pos] = 0; + + internal_error = NULL; + res = json_parser_load (parser, (const gchar *) data->content->data, data->pos, &internal_error); + + if (internal_error != NULL) + g_propagate_error (error, internal_error); + + return res; +} + +/** + * json_parser_load_from_stream_async: + * @parser: a #JsonParser + * @stream: a #GInputStream + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to @callback + * + * Asynchronously reads the contents of @stream. + * + * For more details, see json_parser_load_from_stream() which is the + * synchronous version of this call. + * + * When the operation is finished, @callback will be called. You should + * then call json_parser_load_from_stream_finish() to get the result + * of the operation. + * + * Since: 0.12 + */ +void +json_parser_load_from_stream_async (JsonParser *parser, + GInputStream *stream, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + LoadStreamData *data; + + g_return_if_fail (JSON_IS_PARSER (parser)); + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + data = g_new0 (LoadStreamData, 1); + + if (cancellable != NULL) + data->cancellable = g_object_ref (cancellable); + + data->callback = callback; + data->user_data = user_data; + data->content = g_byte_array_new (); + data->parser = g_object_ref (parser); + + g_byte_array_set_size (data->content, data->pos + GET_DATA_BLOCK_SIZE); + g_input_stream_read_async (stream, data->content->data + data->pos, + GET_DATA_BLOCK_SIZE, 0, + data->cancellable, + load_stream_data_read_callback, + data); +} diff --git a/json-glib/json-parser.h b/json-glib/json-parser.h index 7589464..8666548 100644 --- a/json-glib/json-parser.h +++ b/json-glib/json-parser.h @@ -21,15 +21,15 @@ * Emmanuele Bassi */ +#ifndef __JSON_PARSER_H__ +#define __JSON_PARSER_H__ + #if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) #error "Only can be included directly." #endif -#ifndef __JSON_PARSER_H__ -#define __JSON_PARSER_H__ - -#include -#include "json-types.h" +#include +#include G_BEGIN_DECLS @@ -49,13 +49,27 @@ typedef struct _JsonParserClass JsonParserClass; /** * JsonParserError: * @JSON_PARSER_ERROR_PARSE: parse error + * @JSON_PARSER_ERROR_TRAILING_COMMA: unexpected trailing comma + * @JSON_PARSER_ERROR_MISSING_COMMA: expected comma + * @JSON_PARSER_ERROR_MISSING_COLON: expected colon + * @JSON_PARSER_ERROR_INVALID_BAREWORD: invalid bareword + * @JSON_PARSER_ERROR_EMPTY_MEMBER_NAME: empty member name (Since: 0.16) + * @JSON_PARSER_ERROR_INVALID_DATA: invalid data (Since: 0.18) * @JSON_PARSER_ERROR_UNKNOWN: unknown error * * Error enumeration for #JsonParser + * + * This enumeration can be extended at later date */ typedef enum { JSON_PARSER_ERROR_PARSE, - + JSON_PARSER_ERROR_TRAILING_COMMA, + JSON_PARSER_ERROR_MISSING_COMMA, + JSON_PARSER_ERROR_MISSING_COLON, + JSON_PARSER_ERROR_INVALID_BAREWORD, + JSON_PARSER_ERROR_EMPTY_MEMBER_NAME, + JSON_PARSER_ERROR_INVALID_DATA, + JSON_PARSER_ERROR_UNKNOWN } JsonParserError; @@ -126,24 +140,48 @@ struct _JsonParserClass void (* _json_reserved8) (void); }; -GQuark json_parser_error_quark (void); -GType json_parser_get_type (void) G_GNUC_CONST; - -JsonParser *json_parser_new (void); -gboolean json_parser_load_from_file (JsonParser *parser, - const gchar *filename, - GError **error); -gboolean json_parser_load_from_data (JsonParser *parser, - const gchar *data, - gssize length, - GError **error); - -JsonNode * json_parser_get_root (JsonParser *parser); - -guint json_parser_get_current_line (JsonParser *parser); -guint json_parser_get_current_pos (JsonParser *parser); -gboolean json_parser_has_assignment (JsonParser *parser, - gchar **variable_name); +JSON_AVAILABLE_IN_1_0 +GQuark json_parser_error_quark (void); +JSON_AVAILABLE_IN_1_0 +GType json_parser_get_type (void) G_GNUC_CONST; + +JSON_AVAILABLE_IN_1_0 +JsonParser *json_parser_new (void); +JSON_AVAILABLE_IN_1_0 +gboolean json_parser_load_from_file (JsonParser *parser, + const gchar *filename, + GError **error); +JSON_AVAILABLE_IN_1_0 +gboolean json_parser_load_from_data (JsonParser *parser, + const gchar *data, + gssize length, + GError **error); +JSON_AVAILABLE_IN_1_0 +gboolean json_parser_load_from_stream (JsonParser *parser, + GInputStream *stream, + GCancellable *cancellable, + GError **error); +JSON_AVAILABLE_IN_1_0 +void json_parser_load_from_stream_async (JsonParser *parser, + GInputStream *stream, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +JSON_AVAILABLE_IN_1_0 +gboolean json_parser_load_from_stream_finish (JsonParser *parser, + GAsyncResult *result, + GError **error); + +JSON_AVAILABLE_IN_1_0 +JsonNode * json_parser_get_root (JsonParser *parser); + +JSON_AVAILABLE_IN_1_0 +guint json_parser_get_current_line (JsonParser *parser); +JSON_AVAILABLE_IN_1_0 +guint json_parser_get_current_pos (JsonParser *parser); +JSON_AVAILABLE_IN_1_0 +gboolean json_parser_has_assignment (JsonParser *parser, + gchar **variable_name); G_END_DECLS diff --git a/json-glib/json-path.c b/json-glib/json-path.c new file mode 100644 index 0000000..3ccf98f --- /dev/null +++ b/json-glib/json-path.c @@ -0,0 +1,1002 @@ +/* json-path.h - JSONPath implementation + * + * This file is part of JSON-GLib + * Copyright © 2011 Intel Corp. + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +/** + * SECTION:json-path + * @Title: JsonPath + * @short_description: JSONPath implementation + * + * #JsonPath is a simple class implementing the JSONPath syntax for extracting + * data out of a JSON tree. While the semantics of the JSONPath expressions are + * heavily borrowed by the XPath specification for XML, the syntax follows the + * ECMAScript origins of JSON. + * + * Once a #JsonPath instance has been created, it has to compile a JSONPath + * expression using json_path_compile() before being able to match it to a + * JSON tree; the same #JsonPath instance can be used to match multiple JSON + * trees. It it also possible to compile a new JSONPath expression using the + * same #JsonPath instance; the previous expression will be discarded only if + * the compilation of the new expression is successful. + * + * The simple convenience function json_path_query() can be used for one-off + * matching. + * + * ## Syntax of the JSONPath expressions ## + * + * A JSONPath expression is composed by path indices and operators. + * Each path index can either be a member name or an element index inside + * a JSON tree. A JSONPath expression must start with the '$' operator; each + * path index is separated using either the dot notation or the bracket + * notation, e.g.: + * + * |[ + * // dot notation + * $.store.book[0].title + * + * // bracket notation + * $['store']['book'][0]['title'] + * ]| + * + * The available operators are: + * + * * Root node + * The '$' character represents the root node of the JSON tree, and + * matches the entire document. + * + * * Child nodes can either be matched using '.' or '[]'. For instance, + * both `$.store.book` and `$['store']['book'] match the contents of + * the book member of the store object. + * + * * Child nodes can be reached without specifying the whole tree structure + * through the recursive descent operator, or '..'. For instance, + * `$..author` matches all author member in every object. + * + * * Child nodes can grouped through the wildcard operator, or '*'. For + * instance, `$.store.book[*].author` matches all author members of any + * object element contained in the book array of the store object. + * + * * Element nodes can be accessed using their index (starting from zero) + * in the subscript operator '[]'. For instance, `$.store.book[0]` matches + * the first element of the book array of the store object. + * + * * Subsets of element nodes can be accessed using the set notation + * operator '[start,end]'. For instance, `$.store.book[0,2]` matches the + * first, second, and third elements of the book array of the store + * object. + * + * * Slices of element nodes can be accessed using the slice notation + * operation '[start:end:step]'. If start is omitted, the starting index + * of the slice is implied to be zero; if end is omitted, the ending index + * of the slice is implied to be the length of the array; if step is + * omitted, the step of the slice is implied to be 1. For instance, + * `$.store.book[:2]` matches the first two elements of the book array + * of the store object. + * + * More information about JSONPath is available on Stefan Gössner's + * [JSONPath website](http://goessner.net/articles/JsonPath/). + * + * ## Example of JSONPath matches + * The following example shows some of the results of using #JsonPath + * on a JSON tree. We use the following JSON description of a bookstore: + * |[ + * { "store": { + * "book": [ + * { "category": "reference", "author": "Nigel Rees", + * "title": "Sayings of the Century", "price": "8.95" }, + * { "category": "fiction", "author": "Evelyn Waugh", + * "title": "Sword of Honour", "price": "12.99" }, + * { "category": "fiction", "author": "Herman Melville", + * "title": "Moby Dick", "isbn": "0-553-21311-3", + * "price": "8.99" }, + * { "category": "fiction", "author": "J. R. R. Tolkien", + * "title": "The Lord of the Rings", "isbn": "0-395-19395-8", + * "price": "22.99" } + * ], + * "bicycle": { "color": "red", "price": "19.95" } + * } + * } + * ]| + * + * We can parse the JSON using #JsonParser: + * + * |[ + * JsonParser *parser = json_parser_new (); + * json_parser_load_from_data (parser, json_data, -1, NULL); + * ]| + * + * If we run the following code: + * + * |[ + * JsonNode *result; + * JsonPath *path = json_path_new (); + * json_path_compile (path, "$.store..author", NULL); + * result = json_path_match (path, json_parser_get_root (parser)); + * ]| + * + * The result #JsonNode will contain an array with all values of the + * author member of the objects in the JSON tree. If we use a + * #JsonGenerator to convert the #JsonNode to a string and print it: + * + * |[ + * JsonGenerator *generator = json_generator_new (); + * json_generator_set_root (generator, result); + * char *str = json_generator_to_data (generator, NULL); + * g_print ("Results: %s\n", str); + * ]| + * + * The output will be: + * + * |[ + * ["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] + * ]| + * + * #JsonPath is available since JSON-GLib 0.14 + */ + +#include "config.h" + +#include + +#include + +#include "json-path.h" + +#include "json-debug.h" +#include "json-types-private.h" + +typedef enum { + JSON_PATH_NODE_ROOT, + JSON_PATH_NODE_CHILD_MEMBER, + JSON_PATH_NODE_CHILD_ELEMENT, + JSON_PATH_NODE_RECURSIVE_DESCENT, + JSON_PATH_NODE_WILDCARD_MEMBER, + JSON_PATH_NODE_WILDCARD_ELEMENT, + JSON_PATH_NODE_ELEMENT_SET, + JSON_PATH_NODE_ELEMENT_SLICE +} PathNodeType; + +typedef struct _PathNode PathNode; + +struct _JsonPath +{ + GObject parent_instance; + + /* the compiled path */ + GList *nodes; + + guint is_compiled : 1; +}; + +struct _JsonPathClass +{ + GObjectClass parent_class; +}; + +struct _PathNode +{ + PathNodeType node_type; + + union { + /* JSON_PATH_NODE_CHILD_ELEMENT */ + int element_index; + + /* JSON_PATH_NODE_CHILD_MEMBER */ + char *member_name; + + /* JSON_PATH_NODE_ELEMENT_SET */ + struct { int n_indices; int *indices; } set; + + /* JSON_PATH_NODE_ELEMENT_SLICE */ + struct { int start, end, step; } slice; + } data; +}; + +G_DEFINE_QUARK (json-path-error-quark, json_path_error) + +G_DEFINE_TYPE (JsonPath, json_path, G_TYPE_OBJECT) + +static void +path_node_free (gpointer data) +{ + if (data != NULL) + { + PathNode *node = data; + + switch (node->node_type) + { + case JSON_PATH_NODE_CHILD_MEMBER: + g_free (node->data.member_name); + break; + + case JSON_PATH_NODE_ELEMENT_SET: + g_free (node->data.set.indices); + break; + + default: + break; + } + + g_free (node); + } +} + +static void +json_path_finalize (GObject *gobject) +{ + JsonPath *self = JSON_PATH (gobject); + + g_list_free_full (self->nodes, path_node_free); + + G_OBJECT_CLASS (json_path_parent_class)->finalize (gobject); +} + +static void +json_path_class_init (JsonPathClass *klass) +{ + G_OBJECT_CLASS (klass)->finalize = json_path_finalize; +} + +static void +json_path_init (JsonPath *self) +{ +} + +/** + * json_path_new: + * + * Creates a new #JsonPath instance. + * + * Once created, the #JsonPath object should be used with json_path_compile() + * and json_path_match(). + * + * Return value: (transfer full): the newly created #JsonPath instance. Use + * g_object_unref() to free the allocated resources when done + * + * Since: 0.14 + */ +JsonPath * +json_path_new (void) +{ + return g_object_new (JSON_TYPE_PATH, NULL); +} + +#ifdef JSON_ENABLE_DEBUG +/* used as the function for a g_list_foreach() on a list of PathNode; needs + * a GString as the payload to build the output string + */ +static void +json_path_foreach_print (gpointer data, + gpointer user_data) +{ + PathNode *cur_node = data; + GString *buf = user_data; + + switch (cur_node->node_type) + { + case JSON_PATH_NODE_ROOT: + g_string_append (buf, "data.member_name); + break; + + case JSON_PATH_NODE_CHILD_ELEMENT: + g_string_append_printf (buf, "data.element_index); + break; + + case JSON_PATH_NODE_RECURSIVE_DESCENT: + g_string_append (buf, "data.set.n_indices - 1; i++) + g_string_append_printf (buf, "'%d', ", cur_node->data.set.indices[i]); + + g_string_append_printf (buf, "'%d'", cur_node->data.set.indices[i]); + } + break; + + case JSON_PATH_NODE_ELEMENT_SLICE: + g_string_append_printf (buf, "data.slice.start, + cur_node->data.slice.end, + cur_node->data.slice.step); + break; + + default: + g_string_append (buf, ""); +} +#endif /* JSON_ENABLE_DEBUG */ + +/** + * json_path_compile: + * @path: a #JsonPath + * @expression: a JSONPath expression + * @error: return location for a #GError, or %NULL + * + * Validates and decomposes @expression. + * + * A JSONPath expression must be compiled before calling json_path_match(). + * + * Return value: %TRUE on success; on error, @error will be set with + * the %JSON_PATH_ERROR domain and a code from the #JsonPathError + * enumeration, and %FALSE will be returned + * + * Since: 0.14 + */ +gboolean +json_path_compile (JsonPath *path, + const char *expression, + GError **error) +{ + const char *p, *end_p; + PathNode *root = NULL; + GList *nodes = NULL; + + g_return_val_if_fail (expression != NULL, FALSE); + + p = expression; + + while (*p != '\0') + { + switch (*p) + { + case '$': + { + PathNode *node; + + if (root != NULL) + { + g_set_error_literal (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Only one root node is allowed in a JSONPath expression")); + return FALSE; + } + + if (!(*(p + 1) == '.' || *(p + 1) == '[' || *(p + 1) == '\0')) + { + /* translators: the %c is the invalid character */ + g_set_error (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Root node followed by invalid character '%c'"), + *(p + 1)); + return FALSE; + } + + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_ROOT; + + root = node; + nodes = g_list_prepend (NULL, root); + } + break; + + case '.': + case '[': + { + PathNode *node = NULL; + + if (*p == '.' && *(p + 1) == '.') + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_RECURSIVE_DESCENT; + } + else if (*p == '.' && *(p + 1) == '*') + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_WILDCARD_MEMBER; + + p += 1; + } + else if (*p == '.') + { + end_p = p + 1; + while (!(*end_p == '.' || *end_p == '[' || *end_p == '\0')) + end_p += 1; + + if (end_p == p + 1) + { + g_set_error_literal (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Missing member name or wildcard after . character")); + goto fail; + } + + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_CHILD_MEMBER; + node->data.member_name = g_strndup (p + 1, end_p - p - 1); + + p = end_p - 1; + } + else if (*p == '[' && *(p + 1) == '\'') + { + if (*(p + 2) == '*' && *(p + 3) == '\'' && *(p + 4) == ']') + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_WILDCARD_MEMBER; + + p += 4; + } + else + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_CHILD_MEMBER; + + end_p = strchr (p + 2, '\''); + node->data.member_name = g_strndup (p + 2, end_p - p - 2); + + p = end_p + 1; + } + } + else if (*p == '[' && *(p + 1) == '*' && *(p + 2) == ']') + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_WILDCARD_ELEMENT; + + p += 1; + } + else if (*p == '[') + { + int sign = 1; + int idx; + + end_p = p + 1; + + if (*end_p == '-') + { + sign = -1; + end_p += 1; + } + + /* slice with missing start */ + if (*end_p == ':') + { + int slice_end = g_ascii_strtoll (end_p + 1, (char **) &end_p, 10) * sign; + int slice_step = 1; + + if (*end_p == ':') + { + end_p += 1; + + if (*end_p == '-') + { + sign = -1; + end_p += 1; + } + else + sign = 1; + + slice_step = g_ascii_strtoll (end_p, (char **) &end_p, 10) * sign; + + if (*end_p != ']') + { + g_set_error (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Malformed slice expression '%*s'"), + (int)(end_p - p), + p + 1); + goto fail; + } + } + + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_ELEMENT_SLICE; + node->data.slice.start = 0; + node->data.slice.end = slice_end; + node->data.slice.step = slice_step; + + nodes = g_list_prepend (nodes, node); + p = end_p; + break; + } + + idx = g_ascii_strtoll (end_p, (char **) &end_p, 10) * sign; + + if (*end_p == ',') + { + GArray *indices = g_array_new (FALSE, TRUE, sizeof (int)); + + g_array_append_val (indices, idx); + + while (*end_p != ']') + { + end_p += 1; + + if (*end_p == '-') + { + sign = -1; + end_p += 1; + } + else + sign = 1; + + idx = g_ascii_strtoll (end_p, (char **) &end_p, 10) * sign; + if (!(*end_p == ',' || *end_p == ']')) + { + g_array_unref (indices); + g_set_error (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Invalid set definition '%*s'"), + (int)(end_p - p), + p + 1); + goto fail; + } + + g_array_append_val (indices, idx); + } + + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_ELEMENT_SET; + node->data.set.n_indices = indices->len; + node->data.set.indices = (int *) g_array_free (indices, FALSE); + nodes = g_list_prepend (nodes, node); + p = end_p; + break; + } + else if (*end_p == ':') + { + int slice_start = idx; + int slice_end = 0; + int slice_step = 1; + + end_p += 1; + + if (*end_p == '-') + { + sign = -1; + end_p += 1; + } + else + sign = 1; + + slice_end = g_ascii_strtoll (end_p, (char **) &end_p, 10) * sign; + if (*end_p == ':') + { + end_p += 1; + + if (*end_p == '-') + { + sign = -1; + end_p += 1; + } + else + sign = 1; + + slice_step = g_ascii_strtoll (end_p + 1, (char **) &end_p, 10) * sign; + } + + if (*end_p != ']') + { + g_set_error (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Invalid slice definition '%*s'"), + (int)(end_p - p), + p + 1); + goto fail; + } + + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_ELEMENT_SLICE; + node->data.slice.start = slice_start; + node->data.slice.end = slice_end; + node->data.slice.step = slice_step; + nodes = g_list_prepend (nodes, node); + p = end_p; + break; + } + else if (*end_p == ']') + { + node = g_new0 (PathNode, 1); + node->node_type = JSON_PATH_NODE_CHILD_ELEMENT; + node->data.element_index = idx; + nodes = g_list_prepend (nodes, node); + p = end_p; + break; + } + else + { + g_set_error (error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Invalid array index definition '%*s'"), + (int)(end_p - p), + p + 1); + goto fail; + } + } + else + break; + + if (node != NULL) + nodes = g_list_prepend (nodes, node); + } + break; + + default: + if (nodes == NULL) + { + g_set_error(error, JSON_PATH_ERROR, + JSON_PATH_ERROR_INVALID_QUERY, + _("Invalid first character '%c'"), + *p); + return FALSE; + } + break; + } + + p += 1; + } + + nodes = g_list_reverse (nodes); + +#ifdef JSON_ENABLE_DEBUG + if (JSON_HAS_DEBUG (PATH)) + { + GString *buf = g_string_new (NULL); + + g_list_foreach (nodes, json_path_foreach_print, buf); + + g_message ("[PATH] " G_STRLOC ": expression '%s' => '%s'", expression, buf->str); + g_string_free (buf, TRUE); + } +#endif /* JSON_ENABLE_DEBUG */ + + g_list_free_full (path->nodes, path_node_free); + + path->nodes = nodes; + path->is_compiled = (path->nodes != NULL); + + return path->nodes != NULL; + +fail: + g_list_free_full (nodes, path_node_free); + + return FALSE; +} + +static void +walk_path_node (GList *path, + JsonNode *root, + JsonArray *results) +{ + PathNode *node = path->data; + + switch (node->node_type) + { + case JSON_PATH_NODE_ROOT: + if (path->next != NULL) + walk_path_node (path->next, root, results); + else + json_array_add_element (results, json_node_copy (root)); + break; + + case JSON_PATH_NODE_CHILD_MEMBER: + if (JSON_NODE_HOLDS_OBJECT (root)) + { + JsonObject *object = json_node_get_object (root); + + if (json_object_has_member (object, node->data.member_name)) + { + JsonNode *member = json_object_get_member (object, node->data.member_name); + + if (path->next == NULL) + { + JSON_NOTE (PATH, "end of path at member '%s'", node->data.member_name); + json_array_add_element (results, json_node_copy (member)); + } + else + walk_path_node (path->next, member, results); + } + } + break; + + case JSON_PATH_NODE_CHILD_ELEMENT: + if (JSON_NODE_HOLDS_ARRAY (root)) + { + JsonArray *array = json_node_get_array (root); + + if (json_array_get_length (array) >= node->data.element_index) + { + JsonNode *element = json_array_get_element (array, node->data.element_index); + + if (path->next == NULL) + { + JSON_NOTE (PATH, "end of path at element '%d'", node->data.element_index); + json_array_add_element (results, json_node_copy (element)); + } + else + walk_path_node (path->next, element, results); + } + } + break; + + case JSON_PATH_NODE_RECURSIVE_DESCENT: + { + PathNode *tmp = path->next->data; + + switch (json_node_get_node_type (root)) + { + case JSON_NODE_OBJECT: + { + JsonObject *object = json_node_get_object (root); + GList *members, *l; + + members = json_object_get_members (object); + for (l = members; l != NULL; l = l->next) + { + JsonNode *m = json_object_get_member (object, l->data); + + if (tmp->node_type == JSON_PATH_NODE_CHILD_MEMBER && + strcmp (tmp->data.member_name, l->data) == 0) + { + JSON_NOTE (PATH, "entering '%s'", tmp->data.member_name); + walk_path_node (path->next, root, results); + } + else + { + JSON_NOTE (PATH, "recursing into '%s'", (char *) l->data); + walk_path_node (path, m, results); + } + } + g_list_free (members); + } + break; + + case JSON_NODE_ARRAY: + { + JsonArray *array = json_node_get_array (root); + GList *members, *l; + int i; + + members = json_array_get_elements (array); + for (l = members, i = 0; l != NULL; l = l->next, i += 1) + { + JsonNode *m = l->data; + + if (tmp->node_type == JSON_PATH_NODE_CHILD_ELEMENT && + tmp->data.element_index == i) + { + JSON_NOTE (PATH, "entering '%d'", tmp->data.element_index); + walk_path_node (path->next, root, results); + } + else + { + JSON_NOTE (PATH, "recursing into '%d'", i); + walk_path_node (path, m, results); + } + } + g_list_free (members); + } + break; + + default: + break; + } + } + break; + + case JSON_PATH_NODE_WILDCARD_MEMBER: + if (JSON_NODE_HOLDS_OBJECT (root)) + { + JsonObject *object = json_node_get_object (root); + GList *members, *l; + + members = json_object_get_members (object); + for (l = members; l != NULL; l = l->next) + { + JsonNode *member = json_object_get_member (object, l->data); + + if (path->next != NULL) + walk_path_node (path->next, member, results); + else + { + JSON_NOTE (PATH, "glob match member '%s'", (char *) l->data); + json_array_add_element (results, json_node_copy (member)); + } + } + g_list_free (members); + } + else + json_array_add_element (results, json_node_copy (root)); + break; + + case JSON_PATH_NODE_WILDCARD_ELEMENT: + if (JSON_NODE_HOLDS_ARRAY (root)) + { + JsonArray *array = json_node_get_array (root); + GList *elements, *l; + int i; + + elements = json_array_get_elements (array); + for (l = elements, i = 0; l != NULL; l = l->next, i += 1) + { + JsonNode *element = l->data; + + if (path->next != NULL) + walk_path_node (path->next, element, results); + else + { + JSON_NOTE (PATH, "glob match element '%d'", i); + json_array_add_element (results, json_node_copy (element)); + } + } + g_list_free (elements); + } + else + json_array_add_element (results, json_node_copy (root)); + break; + + case JSON_PATH_NODE_ELEMENT_SET: + if (JSON_NODE_HOLDS_ARRAY (root)) + { + JsonArray *array = json_node_get_array (root); + int i; + + for (i = 0; i < node->data.set.n_indices; i += 1) + { + int idx = node->data.set.indices[i]; + JsonNode *element = json_array_get_element (array, idx); + + if (path->next != NULL) + walk_path_node (path->next, element, results); + else + { + JSON_NOTE (PATH, "set element '%d'", idx); + json_array_add_element (results, json_node_copy (element)); + } + } + } + break; + + case JSON_PATH_NODE_ELEMENT_SLICE: + if (JSON_NODE_HOLDS_ARRAY (root)) + { + JsonArray *array = json_node_get_array (root); + int i, start, end; + + if (node->data.slice.start < 0) + { + start = json_array_get_length (array) + + node->data.slice.start; + + end = json_array_get_length (array) + + node->data.slice.end; + } + else + { + start = node->data.slice.start; + end = node->data.slice.end; + } + + for (i = start; i < end; i += node->data.slice.step) + { + JsonNode *element = json_array_get_element (array, i); + + if (path->next != NULL) + walk_path_node (path->next, element, results); + else + { + JSON_NOTE (PATH, "slice element '%d'", i); + json_array_add_element (results, json_node_copy (element)); + } + } + } + break; + + default: + break; + } +} + +/** + * json_path_match: + * @path: a compiled #JsonPath + * @root: a #JsonNode + * + * Matches the JSON tree pointed by @root using the expression compiled + * into the #JsonPath. + * + * The matching #JsonNodes will be copied into a #JsonArray and + * returned wrapped in a #JsonNode. + * + * Return value: (transfer full): a newly-created #JsonNode of type + * %JSON_NODE_ARRAY containing an array of matching #JsonNodes. + * Use json_node_free() when done + * + * Since: 0.14 + */ +JsonNode * +json_path_match (JsonPath *path, + JsonNode *root) +{ + JsonArray *results; + JsonNode *retval; + + g_return_val_if_fail (JSON_IS_PATH (path), NULL); + g_return_val_if_fail (path->is_compiled, NULL); + g_return_val_if_fail (root != NULL, NULL); + + results = json_array_new (); + + walk_path_node (path->nodes, root, results); + + retval = json_node_new (JSON_NODE_ARRAY); + json_node_take_array (retval, results); + + return retval; +} + +/** + * json_path_query: + * @expression: a JSONPath expression + * @root: the root of a JSON tree + * @error: return location for a #GError, or %NULL + * + * Queries a JSON tree using a JSONPath expression. + * + * This function is a simple wrapper around json_path_new(), + * json_path_compile() and json_path_match(). It implicitly + * creates a #JsonPath instance, compiles @expression and + * matches it against the JSON tree pointed by @root. + * + * Return value: (transfer full): a newly-created #JsonNode of type + * %JSON_NODE_ARRAY containing an array of matching #JsonNodes. + * Use json_node_free() when done + * + * Since: 0.14 + */ +JsonNode * +json_path_query (const char *expression, + JsonNode *root, + GError **error) +{ + JsonPath *path = json_path_new (); + JsonNode *retval; + + if (!json_path_compile (path, expression, error)) + { + g_object_unref (path); + return NULL; + } + + retval = json_path_match (path, root); + + g_object_unref (path); + + return retval; +} diff --git a/json-glib/json-path.h b/json-glib/json-path.h new file mode 100644 index 0000000..b8ffb91 --- /dev/null +++ b/json-glib/json-path.h @@ -0,0 +1,102 @@ +/* json-path.h - JSONPath implementation + * + * This file is part of JSON-GLib + * Copyright © 2011 Intel Corp. + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +#ifndef __JSON_PATH_H__ +#define __JSON_PATH_H__ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define JSON_TYPE_PATH (json_path_get_type ()) +#define JSON_PATH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_PATH, JsonPath)) +#define JSON_IS_PATH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_PATH)) + +/** + * JSON_PATH_ERROR: + * + * Error domain for #JsonPath errors + * + * Since: 0.14 + */ +#define JSON_PATH_ERROR (json_path_error_quark ()) + +/** + * JsonPathError: + * @JSON_PATH_ERROR_INVALID_QUERY: Invalid query + * + * Error code enumeration for the %JSON_PATH_ERROR domain. + * + * Since: 0.14 + */ +typedef enum { + JSON_PATH_ERROR_INVALID_QUERY +} JsonPathError; + +/** + * JsonPath: + * + * The `JsonPath` structure is an opaque object whose members cannot be + * directly accessed except through the provided API. + * + * Since: 0.14 + */ +typedef struct _JsonPath JsonPath; + +/** + * JsonPathClass: + * + * The `JsonPathClass` structure is an opaque object class whose members + * cannot be directly accessed. + * + * Since: 0.14 + */ +typedef struct _JsonPathClass JsonPathClass; + +JSON_AVAILABLE_IN_1_0 +GType json_path_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 +GQuark json_path_error_quark (void); + +JSON_AVAILABLE_IN_1_0 +JsonPath * json_path_new (void); + +JSON_AVAILABLE_IN_1_0 +gboolean json_path_compile (JsonPath *path, + const char *expression, + GError **error); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_path_match (JsonPath *path, + JsonNode *root); + +JSON_AVAILABLE_IN_1_0 +JsonNode * json_path_query (const char *expression, + JsonNode *root, + GError **error); + +G_END_DECLS + +#endif /* __JSON_PATH_H__ */ diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c new file mode 100644 index 0000000..67b67a5 --- /dev/null +++ b/json-glib/json-reader.c @@ -0,0 +1,1039 @@ +/* json-reader.h - JSON cursor parser + * + * This file is part of JSON-GLib + * Copyright (C) 2010 Intel Corp. + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +/** + * SECTION:json-reader + * @Title: JsonReader + * @short_description: A cursor-based parser + * + * #JsonReader provides a simple, cursor-based API for parsing a JSON DOM. It + * is similar, in spirit, to the XML Reader API. + * + * In case of error, #JsonReader will be set in an error state; all subsequent + * calls will simply be ignored until a function that resets the error state is + * called, e.g.: + * + * |[ + * // ask for the 7th element; if the element does not exist, the + * // reader will be put in an error state + * json_reader_read_element (reader, 6); + * + * // in case of error, this will return NULL, otherwise it will + * // return the value of the element + * str = json_reader_get_string_value (value); + * + * // this function resets the error state if any was set + * json_reader_end_element (reader); + * ]| + * + * If you want to detect the error state as soon as possible, you can use + * json_reader_get_error(): + * + * |[ + * // like the example above, but in this case we print out the + * // error immediately + * if (!json_reader_read_element (reader, 6)) + * { + * const GError *error = json_reader_get_error (reader); + * g_print ("Unable to read the element: %s", error->message); + * } + * ]| + * + * #JsonReader is available since JSON-GLib 0.12. + */ + +#include "config.h" + +#include + +#include + +#include "json-reader.h" +#include "json-types-private.h" +#include "json-debug.h" + +#define json_reader_return_if_error_set(r) G_STMT_START { \ + if (((JsonReader *) (r))->priv->error != NULL) \ + return; } G_STMT_END + +#define json_reader_return_val_if_error_set(r,v) G_STMT_START { \ + if (((JsonReader *) (r))->priv->error != NULL) \ + return (v); } G_STMT_END + +struct _JsonReaderPrivate +{ + JsonNode *root; + + JsonNode *current_node; + JsonNode *previous_node; + + gchar *current_member; + + GError *error; +}; + +enum +{ + PROP_0, + + PROP_ROOT, + + PROP_LAST +}; + +static GParamSpec *reader_properties[PROP_LAST] = { NULL, }; + +G_DEFINE_TYPE_WITH_PRIVATE (JsonReader, json_reader, G_TYPE_OBJECT) + +G_DEFINE_QUARK (json-reader-error-quark, json_reader_error) + +static void +json_reader_finalize (GObject *gobject) +{ + JsonReaderPrivate *priv = JSON_READER (gobject)->priv; + + if (priv->root != NULL) + json_node_free (priv->root); + + if (priv->error != NULL) + g_clear_error (&priv->error); + + g_free (priv->current_member); + + G_OBJECT_CLASS (json_reader_parent_class)->finalize (gobject); +} + +static void +json_reader_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + case PROP_ROOT: + json_reader_set_root (JSON_READER (gobject), g_value_get_boxed (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +json_reader_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + case PROP_ROOT: + g_value_set_boxed (value, JSON_READER (gobject)->priv->root); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +json_reader_class_init (JsonReaderClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + /** + * JsonReader:root: + * + * The root of the JSON tree that the #JsonReader should read. + * + * Since: 0.12 + */ + reader_properties[PROP_ROOT] = + g_param_spec_boxed ("root", + "Root Node", + "The root of the tree to read", + JSON_TYPE_NODE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS); + + gobject_class->finalize = json_reader_finalize; + gobject_class->set_property = json_reader_set_property; + gobject_class->get_property = json_reader_get_property; + g_object_class_install_properties (gobject_class, PROP_LAST, reader_properties); +} + +static void +json_reader_init (JsonReader *self) +{ + self->priv = json_reader_get_instance_private (self); +} + +/** + * json_reader_new: + * @node: (allow-none): a #JsonNode, or %NULL + * + * Creates a new #JsonReader. You can use this object to read the contents of + * the JSON tree starting from @node + * + * Return value: the newly created #JsonReader. Use g_object_unref() to + * release the allocated resources when done + * + * Since: 0.12 + */ +JsonReader * +json_reader_new (JsonNode *node) +{ + return g_object_new (JSON_TYPE_READER, "root", node, NULL); +} + +/* + * json_reader_unset_error: + * @reader: a #JsonReader + * + * Unsets the error state of @reader, if set + * + * Return value: TRUE if an error was set. + */ +static inline gboolean +json_reader_unset_error (JsonReader *reader) +{ + if (reader->priv->error != NULL) + { + g_clear_error (&(reader->priv->error)); + return TRUE; + } + return FALSE; +} + +/** + * json_reader_set_root: + * @reader: a #JsonReader + * @root: (allow-none): a #JsonNode + * + * Sets the root #JsonNode to be read by @reader. The @reader will take + * a copy of @root + * + * If another #JsonNode is currently set as root, it will be replaced. + * + * Since: 0.12 + */ +void +json_reader_set_root (JsonReader *reader, + JsonNode *root) +{ + JsonReaderPrivate *priv; + + g_return_if_fail (JSON_IS_READER (reader)); + + priv = reader->priv; + + if (priv->root == root) + return; + + if (priv->root != NULL) + { + json_node_free (priv->root); + priv->root = NULL; + priv->current_node = NULL; + priv->previous_node = NULL; + } + + if (root != NULL) + { + priv->root = json_node_copy (root); + priv->current_node = priv->root; + priv->previous_node = NULL; + } + + g_object_notify_by_pspec (G_OBJECT (reader), reader_properties[PROP_ROOT]); +} + +/* + * json_reader_ser_error: + * @reader: a #JsonReader + * @error_code: the #JsonReaderError code for the error + * @error_fmt: format string + * @Varargs: list of arguments for the @error_fmt string + * + * Sets the error state of @reader using the given error code + * and string + * + * Return value: %FALSE, to be used to return immediately from + * the caller function + */ +static gboolean +json_reader_set_error (JsonReader *reader, + JsonReaderError error_code, + const gchar *error_fmt, + ...) +{ + JsonReaderPrivate *priv = reader->priv; + va_list args; + gchar *error_msg; + + if (priv->error != NULL) + g_clear_error (&priv->error); + + va_start (args, error_fmt); + error_msg = g_strdup_vprintf (error_fmt, args); + va_end (args); + + g_set_error_literal (&priv->error, JSON_READER_ERROR, + error_code, + error_msg); + + g_free (error_msg); + + return FALSE; +} + +/** + * json_reader_get_error: + * @reader: a #JsonReader + * + * Retrieves the #GError currently set on @reader, if the #JsonReader + * is in error state + * + * Return value: (transfer none): the pointer to the error, or %NULL + * + * Since: 0.12 + */ +const GError * +json_reader_get_error (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + + return reader->priv->error; +} + +/** + * json_reader_is_array: + * @reader: a #JsonReader + * + * Checks whether the @reader is currently on an array + * + * Return value: %TRUE if the #JsonReader is on an array, and %FALSE + * otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_is_array (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + if (reader->priv->current_node == NULL) + return FALSE; + + return JSON_NODE_HOLDS_ARRAY (reader->priv->current_node); +} + +/** + * json_reader_is_object: + * @reader: a #JsonReader + * + * Checks whether the @reader is currently on an object + * + * Return value: %TRUE if the #JsonReader is on an object, and %FALSE + * otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_is_object (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + if (reader->priv->current_node == NULL) + return FALSE; + + return JSON_NODE_HOLDS_OBJECT (reader->priv->current_node); +} + +/** + * json_reader_is_value: + * @reader: a #JsonReader + * + * Checks whether the @reader is currently on a value + * + * Return value: %TRUE if the #JsonReader is on a value, and %FALSE + * otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_is_value (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + if (reader->priv->current_node == NULL) + return FALSE; + + return JSON_NODE_HOLDS_VALUE (reader->priv->current_node) || + JSON_NODE_HOLDS_NULL (reader->priv->current_node); +} + +/** + * json_reader_read_element: + * @reader: a #JsonReader + * @index_: the index of the element + * + * Advances the cursor of @reader to the element @index_ of the array + * or the object at the current position. + * + * You can use the json_reader_get_value* family of functions to retrieve + * the value of the element; for instance: + * + * |[ + * json_reader_read_element (reader, 0); + * int_value = json_reader_get_int_value (reader); + * ]| + * + * After reading the value, json_reader_end_element() should be called to + * reposition the cursor inside the #JsonReader, e.g.: + * + * |[ + * json_reader_read_element (reader, 1); + * str_value = json_reader_get_string_value (reader); + * json_reader_end_element (reader); + * + * json_reader_read_element (reader, 2); + * str_value = json_reader_get_string_value (reader); + * json_reader_end_element (reader); + * ]| + * + * If @reader is not currently on an array or an object, or if the @index_ is + * bigger than the size of the array or the object, the #JsonReader will be + * put in an error state until json_reader_end_element() is called. + * + * Return value: %TRUE on success, and %FALSE otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_read_element (JsonReader *reader, + guint index_) +{ + JsonReaderPrivate *priv; + + g_return_val_if_fail (JSON_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + priv = reader->priv; + + if (priv->current_node == NULL) + priv->current_node = priv->root; + + if (!(JSON_NODE_HOLDS_ARRAY (priv->current_node) || + JSON_NODE_HOLDS_OBJECT (priv->current_node))) + return json_reader_set_error (reader, JSON_READER_ERROR_NO_ARRAY, + _("The current node is of type '%s', but " + "an array or an object was expected."), + json_node_type_name (priv->current_node)); + + switch (json_node_get_node_type (priv->current_node)) + { + case JSON_NODE_ARRAY: + { + JsonArray *array = json_node_get_array (priv->current_node); + + if (index_ >= json_array_get_length (array)) + return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_INDEX, + _("The index '%d' is greater than the size " + "of the array at the current position."), + index_); + + priv->previous_node = priv->current_node; + priv->current_node = json_array_get_element (array, index_); + } + break; + + case JSON_NODE_OBJECT: + { + JsonObject *object = json_node_get_object (priv->current_node); + GList *members; + const gchar *name; + + if (index_ >= json_object_get_size (object)) + return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_INDEX, + _("The index '%d' is greater than the size " + "of the object at the current position."), + index_); + + priv->previous_node = priv->current_node; + g_free (priv->current_member); + + members = json_object_get_members (object); + name = g_list_nth_data (members, index_); + + priv->current_node = json_object_get_member (object, name); + priv->current_member = g_strdup (name); + + g_list_free (members); + } + break; + + default: + g_assert_not_reached (); + return FALSE; + } + + return TRUE; +} + +/** + * json_reader_end_element: + * @reader: a #JsonReader + * + * Moves the cursor back to the previous node after being positioned + * inside an array + * + * This function resets the error state of @reader, if any was set + * + * Since: 0.12 + */ +void +json_reader_end_element (JsonReader *reader) +{ + JsonReaderPrivate *priv; + JsonNode *tmp; + + g_return_if_fail (JSON_IS_READER (reader)); + + if (json_reader_unset_error (reader)) + return; + + priv = reader->priv; + + if (priv->previous_node != NULL) + tmp = json_node_get_parent (priv->previous_node); + else + tmp = NULL; + + g_free (priv->current_member); + priv->current_member = NULL; + + priv->current_node = priv->previous_node; + priv->previous_node = tmp; +} + +/** + * json_reader_count_elements: + * @reader: a #JsonReader + * + * Counts the elements of the current position, if @reader is + * positioned on an array + * + * Return value: the number of elements, or -1. In case of failure + * the #JsonReader is set in an error state + * + * Since: 0.12 + */ +gint +json_reader_count_elements (JsonReader *reader) +{ + JsonReaderPrivate *priv; + + g_return_val_if_fail (JSON_IS_READER (reader), -1); + + priv = reader->priv; + + if (priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return -1; + } + + if (!JSON_NODE_HOLDS_ARRAY (priv->current_node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_ARRAY, + _("The current position holds a '%s' and not an array"), + json_node_type_get_name (JSON_NODE_TYPE (priv->current_node))); + return -1; + } + + return json_array_get_length (json_node_get_array (priv->current_node)); +} + +/** + * json_reader_read_member: + * @reader: a #JsonReader + * @member_name: the name of the member to read + * + * Advances the cursor of @reader to the @member_name of the object at the + * current position. + * + * You can use the json_reader_get_value* family of functions to retrieve + * the value of the member; for instance: + * + * |[ + * json_reader_read_member (reader, "width"); + * width = json_reader_get_int_value (reader); + * ]| + * + * After reading the value, json_reader_end_member() should be called to + * reposition the cursor inside the #JsonReader, e.g.: + * + * |[ + * json_reader_read_member (reader, "author"); + * author = json_reader_get_string_value (reader); + * json_reader_end_member (reader); + * + * json_reader_read_member (reader, "title"); + * title = json_reader_get_string_value (reader); + * json_reader_end_member (reader); + * ]| + * + * If @reader is not currently on an object, or if the @member_name is not + * defined in the object, the #JsonReader will be put in an error state until + * json_reader_end_member() is called. + * + * Return value: %TRUE on success, and %FALSE otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_read_member (JsonReader *reader, + const gchar *member_name) +{ + JsonReaderPrivate *priv; + JsonObject *object; + + g_return_val_if_fail (JSON_READER (reader), FALSE); + g_return_val_if_fail (member_name != NULL, FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + priv = reader->priv; + + if (priv->current_node == NULL) + priv->current_node = priv->root; + + if (!JSON_NODE_HOLDS_OBJECT (priv->current_node)) + return json_reader_set_error (reader, JSON_READER_ERROR_NO_OBJECT, + _("The current node is of type '%s', but " + "an object was expected."), + json_node_type_name (priv->current_node)); + + object = json_node_get_object (priv->current_node); + if (!json_object_has_member (object, member_name)) + return json_reader_set_error (reader, JSON_READER_ERROR_INVALID_MEMBER, + _("The member '%s' is not defined in the " + "object at the current position."), + member_name); + + g_free (priv->current_member); + + priv->previous_node = priv->current_node; + priv->current_node = json_object_get_member (object, member_name); + priv->current_member = g_strdup (member_name); + + return TRUE; +} + +/** + * json_reader_end_member: + * @reader: a #JsonReader + * + * Moves the cursor back to the previous node after being positioned + * inside an object + * + * This function resets the error state of @reader, if any was set + * + * Since: 0.12 + */ +void +json_reader_end_member (JsonReader *reader) +{ + JsonReaderPrivate *priv; + JsonNode *tmp; + + g_return_if_fail (JSON_IS_READER (reader)); + + if (json_reader_unset_error (reader)) + return; + + priv = reader->priv; + + if (priv->previous_node != NULL) + tmp = json_node_get_parent (priv->previous_node); + else + tmp = NULL; + + g_free (priv->current_member); + priv->current_member = NULL; + + priv->current_node = priv->previous_node; + priv->previous_node = tmp; +} + +/** + * json_reader_list_members: + * @reader: a #JsonReader + * + * Retrieves a list of member names from the current position, if @reader + * is positioned on an object. + * + * Return value: (transfer full): a newly allocated, %NULL-terminated + * array of strings holding the members name. Use g_strfreev() when + * done. + * + * Since: 0.14 + */ +gchar ** +json_reader_list_members (JsonReader *reader) +{ + JsonReaderPrivate *priv; + GList *members, *l; + gchar **retval; + gint i; + + g_return_val_if_fail (JSON_IS_READER (reader), NULL); + + priv = reader->priv; + + if (priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return NULL; + } + + if (!JSON_NODE_HOLDS_OBJECT (priv->current_node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_OBJECT, + _("The current position holds a '%s' and not an object"), + json_node_type_get_name (JSON_NODE_TYPE (priv->current_node))); + return NULL; + } + + members = json_object_get_members (json_node_get_object (priv->current_node)); + if (members == NULL) + return NULL; + + retval = g_new (gchar*, g_list_length (members) + 1); + for (l = members, i = 0; l != NULL; l = l->next, i += 1) + retval[i] = g_strdup (l->data); + + retval[i] = NULL; + + g_list_free (members); + + return retval; +} + +/** + * json_reader_count_members: + * @reader: a #JsonReader + * + * Counts the members of the current position, if @reader is + * positioned on an object + * + * Return value: the number of members, or -1. In case of failure + * the #JsonReader is set in an error state + * + * Since: 0.12 + */ +gint +json_reader_count_members (JsonReader *reader) +{ + JsonReaderPrivate *priv; + + g_return_val_if_fail (JSON_IS_READER (reader), -1); + + priv = reader->priv; + + if (priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return -1; + } + + if (!JSON_NODE_HOLDS_OBJECT (priv->current_node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_OBJECT, + _("The current position holds a '%s' and not an object"), + json_node_type_get_name (JSON_NODE_TYPE (priv->current_node))); + return -1; + } + + return json_object_get_size (json_node_get_object (priv->current_node)); +} + +/** + * json_reader_get_value: + * @reader: a #JsonReader + * + * Retrieves the #JsonNode of the current position of @reader + * + * Return value: (transfer none): a #JsonNode, or %NULL. The returned node + * is owned by the #JsonReader and it should not be modified or freed + * directly + * + * Since: 0.12 + */ +JsonNode * +json_reader_get_value (JsonReader *reader) +{ + JsonNode *node; + + g_return_val_if_fail (JSON_IS_READER (reader), NULL); + json_reader_return_val_if_error_set (reader, NULL); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return NULL; + } + + node = reader->priv->current_node; + + if (!JSON_NODE_HOLDS_VALUE (node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE, + _("The current position holds a '%s' and not a value"), + json_node_type_get_name (JSON_NODE_TYPE (node))); + return NULL; + } + + return reader->priv->current_node; +} + +/** + * json_reader_get_int_value: + * @reader: a #JsonReader + * + * Retrieves the integer value of the current position of @reader + * + * Return value: the integer value + * + * Since: 0.12 + */ +gint64 +json_reader_get_int_value (JsonReader *reader) +{ + JsonNode *node; + + g_return_val_if_fail (JSON_IS_READER (reader), 0); + json_reader_return_val_if_error_set (reader, 0); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return 0; + } + + node = reader->priv->current_node; + + if (!JSON_NODE_HOLDS_VALUE (node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE, + _("The current position holds a '%s' and not a value"), + json_node_type_get_name (JSON_NODE_TYPE (node))); + return 0; + } + + return json_node_get_int (reader->priv->current_node); +} + +/** + * json_reader_get_double_value: + * @reader: a #JsonReader + * + * Retrieves the floating point value of the current position of @reader + * + * Return value: the floating point value + * + * Since: 0.12 + */ +gdouble +json_reader_get_double_value (JsonReader *reader) +{ + JsonNode *node; + + g_return_val_if_fail (JSON_IS_READER (reader), 0.0); + json_reader_return_val_if_error_set (reader, 0.0); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return 0.0; + } + + node = reader->priv->current_node; + + if (!JSON_NODE_HOLDS_VALUE (node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE, + _("The current position holds a '%s' and not a value"), + json_node_type_get_name (JSON_NODE_TYPE (node))); + return 0.0; + } + + return json_node_get_double (reader->priv->current_node); +} + +/** + * json_reader_get_string_value: + * @reader: a #JsonReader + * + * Retrieves the string value of the current position of @reader + * + * Return value: the string value + * + * Since: 0.12 + */ +const gchar * +json_reader_get_string_value (JsonReader *reader) +{ + JsonNode *node; + + g_return_val_if_fail (JSON_IS_READER (reader), NULL); + json_reader_return_val_if_error_set (reader, NULL); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return NULL; + } + + node = reader->priv->current_node; + + if (!JSON_NODE_HOLDS_VALUE (node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE, + _("The current position holds a '%s' and not a value"), + json_node_type_get_name (JSON_NODE_TYPE (node))); + return NULL; + } + + if (json_node_get_value_type (node) != G_TYPE_STRING) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_TYPE, + _("The current position does not hold a string type")); + return NULL; + } + + return json_node_get_string (reader->priv->current_node); +} + +/** + * json_reader_get_boolean_value: + * @reader: a #JsonReader + * + * Retrieves the boolean value of the current position of @reader + * + * Return value: the boolean value + * + * Since: 0.12 + */ +gboolean +json_reader_get_boolean_value (JsonReader *reader) +{ + JsonNode *node; + + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return FALSE; + } + + node = reader->priv->current_node; + + if (!JSON_NODE_HOLDS_VALUE (node)) + { + json_reader_set_error (reader, JSON_READER_ERROR_NO_VALUE, + _("The current position holds a '%s' and not a value"), + json_node_type_get_name (JSON_NODE_TYPE (node))); + return FALSE; + } + + return json_node_get_boolean (node); +} + +/** + * json_reader_get_null_value: + * @reader: a #JsonReader + * + * Checks whether the value of the current position of @reader is 'null' + * + * Return value: %TRUE if 'null' is set, and %FALSE otherwise + * + * Since: 0.12 + */ +gboolean +json_reader_get_null_value (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), FALSE); + json_reader_return_val_if_error_set (reader, FALSE); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return FALSE; + } + + return JSON_NODE_HOLDS_NULL (reader->priv->current_node); +} + +/** + * json_reader_get_member_name: + * @reader: a #JsonReader + * + * Retrieves the name of the current member. + * + * Return value: (transfer none): the name of the member, or %NULL + * + * Since: 0.14 + */ +const gchar * +json_reader_get_member_name (JsonReader *reader) +{ + g_return_val_if_fail (JSON_IS_READER (reader), NULL); + json_reader_return_val_if_error_set (reader, NULL); + + if (reader->priv->current_node == NULL) + { + json_reader_set_error (reader, JSON_READER_ERROR_INVALID_NODE, + _("No node available at the current position")); + return FALSE; + } + + return reader->priv->current_member; +} diff --git a/json-glib/json-reader.h b/json-glib/json-reader.h new file mode 100644 index 0000000..32e90da --- /dev/null +++ b/json-glib/json-reader.h @@ -0,0 +1,171 @@ +/* json-reader.h - JSON cursor parser + * + * This file is part of JSON-GLib + * Copyright (C) 2010 Intel Corp. + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +#ifndef __JSON_READER_H__ +#define __JSON_READER_H__ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define JSON_TYPE_READER (json_reader_get_type ()) +#define JSON_READER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JSON_TYPE_READER, JsonReader)) +#define JSON_IS_READER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JSON_TYPE_READER)) +#define JSON_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), JSON_TYPE_READER, JsonReaderClass)) +#define JSON_IS_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), JSON_TYPE_READER)) +#define JSON_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), JSON_TYPE_READER, JsonReaderClass)) + +/** + * JSON_READER_ERROR: + * + * Error domain for #JsonReader errors + * + * Since: 0.12 + */ +#define JSON_READER_ERROR (json_reader_error_quark ()) + +typedef struct _JsonReader JsonReader; +typedef struct _JsonReaderPrivate JsonReaderPrivate; +typedef struct _JsonReaderClass JsonReaderClass; + +/** + * JsonReaderError: + * @JSON_READER_ERROR_NO_ARRAY: No array found at the current position + * @JSON_READER_ERROR_INVALID_INDEX: Index out of bounds + * @JSON_READER_ERROR_NO_OBJECT: No object found at the current position + * @JSON_READER_ERROR_INVALID_MEMBER: Member not found + * @JSON_READER_ERROR_INVALID_NODE: No valid node found at the current position + * @JSON_READER_ERROR_NO_VALUE: The node at the current position does not + * hold a value + * @JSON_READER_ERROR_INVALID_TYPE: The node at the current position does not + * hold a value of the desired type + * + * Error codes enumeration for #JsonReader errors + * + * Since: 0.12 + */ +typedef enum { + JSON_READER_ERROR_NO_ARRAY, + JSON_READER_ERROR_INVALID_INDEX, + JSON_READER_ERROR_NO_OBJECT, + JSON_READER_ERROR_INVALID_MEMBER, + JSON_READER_ERROR_INVALID_NODE, + JSON_READER_ERROR_NO_VALUE, + JSON_READER_ERROR_INVALID_TYPE +} JsonReaderError; + +/** + * JsonReader: + * + * The `JsonReader` structure contains only private data and should + * be accessed using the provided API + * + * Since: 0.12 + */ +struct _JsonReader +{ + /*< private >*/ + GObject parent_instance; + + JsonReaderPrivate *priv; +}; + +/** + * JsonReaderClass: + * + * The `JsonReaderClass` structure contains only private data + * + * Since: 0.12 + */ +struct _JsonReaderClass +{ + /*< private >*/ + GObjectClass parent_class; + + void (*_json_padding0) (void); + void (*_json_padding1) (void); + void (*_json_padding2) (void); + void (*_json_padding3) (void); + void (*_json_padding4) (void); +}; + +JSON_AVAILABLE_IN_1_0 +GQuark json_reader_error_quark (void); +JSON_AVAILABLE_IN_1_0 +GType json_reader_get_type (void) G_GNUC_CONST; + +JSON_AVAILABLE_IN_1_0 +JsonReader * json_reader_new (JsonNode *node); + +JSON_AVAILABLE_IN_1_0 +void json_reader_set_root (JsonReader *reader, + JsonNode *root); + +JSON_AVAILABLE_IN_1_0 +const GError * json_reader_get_error (JsonReader *reader); + +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_is_array (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_read_element (JsonReader *reader, + guint index_); +JSON_AVAILABLE_IN_1_0 +void json_reader_end_element (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gint json_reader_count_elements (JsonReader *reader); + +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_is_object (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_read_member (JsonReader *reader, + const gchar *member_name); +JSON_AVAILABLE_IN_1_0 +void json_reader_end_member (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gint json_reader_count_members (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gchar ** json_reader_list_members (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +const gchar * json_reader_get_member_name (JsonReader *reader); + +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_is_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_reader_get_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gint64 json_reader_get_int_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gdouble json_reader_get_double_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +const gchar * json_reader_get_string_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_get_boolean_value (JsonReader *reader); +JSON_AVAILABLE_IN_1_0 +gboolean json_reader_get_null_value (JsonReader *reader); + +G_END_DECLS + +#endif /* __JSON_READER_H__ */ diff --git a/json-glib/json-scanner.c b/json-glib/json-scanner.c index 9cd0938..daf9ead 100644 --- a/json-glib/json-scanner.c +++ b/json-glib/json-scanner.c @@ -17,14 +17,10 @@ * 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include @@ -190,9 +186,6 @@ static guchar json_scanner_get_char (JsonScanner *scanner, static gunichar json_scanner_get_unichar (JsonScanner *scanner, guint *line_p, guint *position_p); -static void json_scanner_msg_handler (JsonScanner *scanner, - gchar *message, - gboolean is_error); /* --- functions --- */ static inline gint @@ -273,14 +266,11 @@ json_scanner_new (void) scanner->symbol_table = g_hash_table_new (json_scanner_key_hash, json_scanner_key_equal); - scanner->input_fd = -1; scanner->text = NULL; scanner->text_end = NULL; scanner->buffer = NULL; scanner->scope_id = 0; - scanner->msg_handler = json_scanner_msg_handler; - return scanner; } @@ -333,22 +323,6 @@ json_scanner_destroy (JsonScanner *scanner) g_free (scanner); } -static void -json_scanner_msg_handler (JsonScanner *scanner, - gchar *message, - gboolean is_error) -{ - g_return_if_fail (scanner != NULL); - - g_fprintf (stderr, "%s:%d: ", - scanner->input_name ? scanner->input_name : "", - scanner->line); - if (is_error) - g_fprintf (stderr, "error: "); - - g_fprintf (stderr, "%s\n", message); -} - void json_scanner_error (JsonScanner *scanner, const gchar *format, @@ -368,30 +342,7 @@ json_scanner_error (JsonScanner *scanner, string = g_strdup_vprintf (format, args); va_end (args); - scanner->msg_handler (scanner, string, TRUE); - - g_free (string); - } -} - -void -json_scanner_warn (JsonScanner *scanner, - const gchar *format, - ...) -{ - g_return_if_fail (scanner != NULL); - g_return_if_fail (format != NULL); - - if (scanner->msg_handler) - { - va_list args; - gchar *string; - - va_start (args, format); - string = g_strdup_vprintf (format, args); - va_end (args); - - scanner->msg_handler (scanner, string, FALSE); + scanner->msg_handler (scanner, string); g_free (string); } @@ -489,120 +440,6 @@ json_scanner_scope_add_symbol (JsonScanner *scanner, key->value = value; } -void -json_scanner_scope_remove_symbol (JsonScanner *scanner, - guint scope_id, - const gchar *symbol) -{ - JsonScannerKey *key; - - g_return_if_fail (scanner != NULL); - g_return_if_fail (symbol != NULL); - - key = json_scanner_lookup_internal (scanner, scope_id, symbol); - if (key) - { - g_hash_table_remove (scanner->symbol_table, key); - g_free (key->symbol); - g_slice_free (JsonScannerKey, key); - } -} - -gpointer -json_scanner_lookup_symbol (JsonScanner *scanner, - const gchar *symbol) -{ - JsonScannerKey *key; - guint scope_id; - - g_return_val_if_fail (scanner != NULL, NULL); - - if (!symbol) - return NULL; - - scope_id = scanner->scope_id; - key = json_scanner_lookup_internal (scanner, scope_id, symbol); - if (!key && scope_id && scanner->config->scope_0_fallback) - key = json_scanner_lookup_internal (scanner, 0, symbol); - - if (key) - return key->value; - else - return NULL; -} - -gpointer -json_scanner_scope_lookup_symbol (JsonScanner *scanner, - guint scope_id, - const gchar *symbol) -{ - JsonScannerKey *key; - - g_return_val_if_fail (scanner != NULL, NULL); - - if (!symbol) - return NULL; - - key = json_scanner_lookup_internal (scanner, scope_id, symbol); - - if (key) - return key->value; - else - return NULL; -} - -guint -json_scanner_set_scope (JsonScanner *scanner, - guint scope_id) -{ - guint old_scope_id; - - g_return_val_if_fail (scanner != NULL, 0); - - old_scope_id = scanner->scope_id; - scanner->scope_id = scope_id; - - return old_scope_id; -} - -typedef struct { - GHFunc func; - gpointer data; - guint scope_id; -} ForeachClosure; - -static void -json_scanner_foreach_internal (gpointer _key, - gpointer _value, - gpointer _user_data) -{ - JsonScannerKey *key = _value; - ForeachClosure *closure = _user_data; - - if (key->scope_id == closure->scope_id) - closure->func (key->symbol, key->value, closure->data); -} - -void -json_scanner_scope_foreach_symbol (JsonScanner *scanner, - guint scope_id, - GHFunc func, - gpointer user_data) -{ - ForeachClosure closure; - - g_return_if_fail (scanner != NULL); - g_return_if_fail (func != NULL); - - closure.func = func; - closure.data = user_data; - closure.scope_id = scope_id; - - g_hash_table_foreach (scanner->symbol_table, - json_scanner_foreach_internal, - &closure); -} - GTokenType json_scanner_peek_next_token (JsonScanner *scanner) { @@ -647,78 +484,6 @@ json_scanner_get_next_token (JsonScanner *scanner) return scanner->token; } -GTokenType -json_scanner_cur_token (JsonScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); - - return scanner->token; -} - -GTokenValue -json_scanner_cur_value (JsonScanner *scanner) -{ - GTokenValue v; - - v.v_int64 = 0; - - g_return_val_if_fail (scanner != NULL, v); - - /* MSC isn't capable of handling return scanner->value; ? */ - - v = scanner->value; - - return v; -} - -guint -json_scanner_cur_line (JsonScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, 0); - - return scanner->line; -} - -guint -json_scanner_cur_position (JsonScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, 0); - - return scanner->position; -} - -gboolean -json_scanner_eof (JsonScanner *scanner) -{ - g_return_val_if_fail (scanner != NULL, TRUE); - - return scanner->token == G_TOKEN_EOF || scanner->token == G_TOKEN_ERROR; -} - -void -json_scanner_input_file (JsonScanner *scanner, - gint input_fd) -{ - g_return_if_fail (scanner != NULL); - g_return_if_fail (input_fd >= 0); - - if (scanner->input_fd >= 0) - json_scanner_sync_file_offset (scanner); - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int64 = 0; - scanner->line = 1; - scanner->position = 0; - scanner->next_token = G_TOKEN_NONE; - - scanner->input_fd = input_fd; - scanner->text = NULL; - scanner->text_end = NULL; - - if (!scanner->buffer) - scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1); -} - void json_scanner_input_text (JsonScanner *scanner, const gchar *text, @@ -730,16 +495,12 @@ json_scanner_input_text (JsonScanner *scanner, else text = NULL; - if (scanner->input_fd >= 0) - json_scanner_sync_file_offset (scanner); - scanner->token = G_TOKEN_NONE; scanner->value.v_int64 = 0; scanner->line = 1; scanner->position = 0; scanner->next_token = G_TOKEN_NONE; - scanner->input_fd = -1; scanner->text = text; scanner->text_end = text + text_len; @@ -755,63 +516,10 @@ json_scanner_peek_next_char (JsonScanner *scanner) { if (scanner->text < scanner->text_end) return *scanner->text; - else if (scanner->input_fd >= 0) - { - gint count; - gchar *buffer; - - buffer = scanner->buffer; - do - { - count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); - } - while (count == -1 && (errno == EINTR || errno == EAGAIN)); - - if (count < 1) - { - scanner->input_fd = -1; - - return 0; - } - else - { - scanner->text = buffer; - scanner->text_end = buffer + count; - - return *buffer; - } - } else return 0; } -void -json_scanner_sync_file_offset (JsonScanner *scanner) -{ - g_return_if_fail (scanner != NULL); - - /* for file input, rewind the filedescriptor to the current - * buffer position and blow the file read ahead buffer. useful - * for third party uses of our file descriptor, which hooks - * onto the current scanning position. - */ - - if (scanner->input_fd >= 0 && scanner->text_end > scanner->text) - { - gint buffered; - - buffered = scanner->text_end - scanner->text; - if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0) - { - /* we succeeded, blow our buffer's contents now */ - scanner->text = NULL; - scanner->text_end = NULL; - } - else - errno = 0; - } -} - static guchar json_scanner_get_char (JsonScanner *scanner, guint *line_p, @@ -821,36 +529,6 @@ json_scanner_get_char (JsonScanner *scanner, if (scanner->text < scanner->text_end) fchar = *(scanner->text++); - else if (scanner->input_fd >= 0) - { - gint count; - gchar *buffer; - - buffer = scanner->buffer; - do - { - count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); - } - while (count == -1 && (errno == EINTR || errno == EAGAIN)); - - if (count < 1) - { - scanner->input_fd = -1; - fchar = 0; - } - else - { - scanner->text = buffer + 1; - scanner->text_end = buffer + count; - fchar = *buffer; - if (!fchar) - { - json_scanner_sync_file_offset (scanner); - scanner->text_end = scanner->text; - scanner->input_fd = -1; - } - } - } else fchar = 0; @@ -892,19 +570,42 @@ json_scanner_get_unichar (JsonScanner *scanner, break; } - g_assert (g_unichar_validate (uchar)); + g_assert (g_unichar_validate (uchar) || g_unichar_type (uchar) == G_UNICODE_SURROGATE); return uchar; } +/* + * decode_utf16_surrogate_pair: + * @units: (array length=2): a pair of UTF-16 code points + * + * Decodes a surrogate pair of UTF-16 code points into the equivalent + * Unicode code point. + * + * Returns: the Unicode code point equivalent to the surrogate pair + */ +static inline gunichar +decode_utf16_surrogate_pair (const gunichar units[2]) +{ + gunichar ucs; + + g_assert (0xd800 <= units[0] && units[0] <= 0xdbff); + g_assert (0xdc00 <= units[1] && units[1] <= 0xdfff); + + ucs = 0x10000; + ucs += (units[0] & 0x3ff) << 10; + ucs += (units[1] & 0x3ff); + + return ucs; +} + void json_scanner_unexp_token (JsonScanner *scanner, GTokenType expected_token, const gchar *identifier_spec, const gchar *symbol_spec, const gchar *symbol_name, - const gchar *message, - gint is_error) + const gchar *message) { gchar *token_string; guint token_string_len; @@ -912,15 +613,9 @@ json_scanner_unexp_token (JsonScanner *scanner, guint expected_string_len; gchar *message_prefix; gboolean print_unexp; - void (*msg_handler) (JsonScanner*, const gchar*, ...); g_return_if_fail (scanner != NULL); - if (is_error) - msg_handler = json_scanner_error; - else - msg_handler = json_scanner_warn; - if (!identifier_spec) identifier_spec = "identifier"; if (!symbol_spec) @@ -1176,43 +871,43 @@ json_scanner_unexp_token (JsonScanner *scanner, } if (expected_token == G_TOKEN_ERROR) { - msg_handler (scanner, - "failure around %s%s%s", - token_string, - message_prefix, - message); + json_scanner_error (scanner, + "failure around %s%s%s", + token_string, + message_prefix, + message); } else if (expected_token == G_TOKEN_NONE) { if (print_unexp) - msg_handler (scanner, - "unexpected %s%s%s", - token_string, - message_prefix, - message); + json_scanner_error (scanner, + "unexpected %s%s%s", + token_string, + message_prefix, + message); else - msg_handler (scanner, - "%s%s%s", - token_string, - message_prefix, - message); + json_scanner_error (scanner, + "%s%s%s", + token_string, + message_prefix, + message); } else { if (print_unexp) - msg_handler (scanner, - "unexpected %s, expected %s%s%s", - token_string, - expected_string, - message_prefix, - message); + json_scanner_error (scanner, + "unexpected %s, expected %s%s%s", + token_string, + expected_string, + message_prefix, + message); else - msg_handler (scanner, - "%s, expected %s%s%s", - token_string, - expected_string, - message_prefix, - message); + json_scanner_error (scanner, + "%s, expected %s%s%s", + token_string, + expected_string, + message_prefix, + message); } g_free (token_string); @@ -1221,10 +916,10 @@ json_scanner_unexp_token (JsonScanner *scanner, static void json_scanner_get_token_i (JsonScanner *scanner, - GTokenType *token_p, - GTokenValue *value_p, - guint *line_p, - guint *position_p) + GTokenType *token_p, + GTokenValue *value_p, + guint *line_p, + guint *position_p) { do { @@ -1303,7 +998,7 @@ json_scanner_get_token_ll (JsonScanner *scanner, config = scanner->config; (*value_p).v_int64 = 0; - if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || + if (scanner->text >= scanner->text_end || scanner->token == G_TOKEN_EOF) { *token_p = G_TOKEN_EOF; @@ -1439,6 +1134,26 @@ json_scanner_get_token_ll (JsonScanner *scanner, gunichar ucs; ucs = json_scanner_get_unichar (scanner, line_p, position_p); + + /* resolve UTF-16 surrogates for Unicode characters not in the BMP, + * as per ECMA 404, § 9, "String" + */ + if (g_unichar_type (ucs) == G_UNICODE_SURROGATE) + { + /* read next surrogate */ + if ('\\' == json_scanner_get_char (scanner, line_p, position_p) && + 'u' == json_scanner_get_char (scanner, line_p, position_p)) + { + gunichar units[2]; + + units[0] = ucs; + units[1] = json_scanner_get_unichar (scanner, line_p, position_p); + + ucs = decode_utf16_surrogate_pair (units); + g_assert (g_unichar_validate (ucs)); + } + } + gstring = g_string_append_unichar (gstring, ucs); } break; diff --git a/json-glib/json-scanner.h b/json-glib/json-scanner.h index cd76ea4..4d1f982 100644 --- a/json-glib/json-scanner.h +++ b/json-glib/json-scanner.h @@ -14,9 +14,7 @@ * 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . */ /* @@ -34,21 +32,15 @@ #ifndef __JSON_SCANNER_H__ #define __JSON_SCANNER_H__ -#if !GLIB_CHECK_VERSION(2, 31, 0) -#include -#include -#include -#else #include -#endif + G_BEGIN_DECLS typedef struct _JsonScanner JsonScanner; typedef struct _JsonScannerConfig JsonScannerConfig; typedef void (* JsonScannerMsgFunc) (JsonScanner *scanner, - gchar *message, - gboolean is_error); + gchar *message); /** * JsonTokenType: @@ -112,7 +104,6 @@ struct _JsonScanner /* to be considered private */ GHashTable *symbol_table; - gint input_fd; const gchar *text; const gchar *text_end; gchar *buffer; @@ -122,52 +113,34 @@ struct _JsonScanner JsonScannerMsgFunc msg_handler; }; +G_GNUC_INTERNAL JsonScanner *json_scanner_new (void); +G_GNUC_INTERNAL void json_scanner_destroy (JsonScanner *scanner); -void json_scanner_input_file (JsonScanner *scanner, - gint input_fd); -void json_scanner_sync_file_offset (JsonScanner *scanner); +G_GNUC_INTERNAL void json_scanner_input_text (JsonScanner *scanner, const gchar *text, guint text_len); +G_GNUC_INTERNAL GTokenType json_scanner_get_next_token (JsonScanner *scanner); +G_GNUC_INTERNAL GTokenType json_scanner_peek_next_token (JsonScanner *scanner); -GTokenType json_scanner_cur_token (JsonScanner *scanner); -GTokenValue json_scanner_cur_value (JsonScanner *scanner); -guint json_scanner_cur_line (JsonScanner *scanner); -guint json_scanner_cur_position (JsonScanner *scanner); -gboolean json_scanner_eof (JsonScanner *scanner); -guint json_scanner_set_scope (JsonScanner *scanner, - guint scope_id); +G_GNUC_INTERNAL void json_scanner_scope_add_symbol (JsonScanner *scanner, guint scope_id, const gchar *symbol, gpointer value); -void json_scanner_scope_remove_symbol (JsonScanner *scanner, - guint scope_id, - const gchar *symbol); -gpointer json_scanner_scope_lookup_symbol (JsonScanner *scanner, - guint scope_id, - const gchar *symbol); -void json_scanner_scope_foreach_symbol (JsonScanner *scanner, - guint scope_id, - GHFunc func, - gpointer user_data); -gpointer json_scanner_lookup_symbol (JsonScanner *scanner, - const gchar *symbol); +G_GNUC_INTERNAL void json_scanner_unexp_token (JsonScanner *scanner, GTokenType expected_token, const gchar *identifier_spec, const gchar *symbol_spec, const gchar *symbol_name, - const gchar *message, - gint is_error); + const gchar *message); +G_GNUC_INTERNAL void json_scanner_error (JsonScanner *scanner, const gchar *format, ...) G_GNUC_PRINTF (2,3); -void json_scanner_warn (JsonScanner *scanner, - const gchar *format, - ...) G_GNUC_PRINTF (2,3); G_END_DECLS diff --git a/json-glib/json-serializable.c b/json-glib/json-serializable.c index 43ada37..08327a9 100644 --- a/json-glib/json-serializable.c +++ b/json-glib/json-serializable.c @@ -27,15 +27,14 @@ * json_serialize_gobject() respectively. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include #include "json-types-private.h" #include "json-gobject-private.h" +#include "json-debug.h" /** * json_serializable_serialize_property: @@ -71,7 +70,7 @@ json_serializable_serialize_property (JsonSerializable *serializable, * json_serializable_deserialize_property: * @serializable: a #JsonSerializable * @property_name: the name of the property - * @value: a pointer to an uninitialized #GValue + * @value: (out): a pointer to an uninitialized #GValue * @pspec: a #GParamSpec * @property_node: a #JsonNode containing the serialized property * @@ -111,6 +110,7 @@ json_serializable_real_deserialize (JsonSerializable *serializable, GParamSpec *pspec, JsonNode *node) { + JSON_NOTE (GOBJECT, "Default deserialization for property '%s'", pspec->name); return json_deserialize_pspec (value, pspec, node); } @@ -120,42 +120,60 @@ json_serializable_real_serialize (JsonSerializable *serializable, const GValue *value, GParamSpec *pspec) { + JSON_NOTE (GOBJECT, "Default serialization for property '%s'", pspec->name); + + if (g_param_value_defaults (pspec, (GValue *)value)) + return NULL; + return json_serialize_pspec (value, pspec); } -static void -json_serializable_base_init (gpointer g_class, - gpointer data) +static GParamSpec * +json_serializable_real_find_property (JsonSerializable *serializable, + const char *name) { - static gboolean is_initialized = FALSE; - - if (G_UNLIKELY (!is_initialized)) - { - JsonSerializableIface *iface = g_class; + return g_object_class_find_property (G_OBJECT_GET_CLASS (serializable), name); +} - iface->serialize_property = json_serializable_real_serialize; - iface->deserialize_property = json_serializable_real_deserialize; +static GParamSpec ** +json_serializable_real_list_properties (JsonSerializable *serializable, + guint *n_pspecs) +{ + return g_object_class_list_properties (G_OBJECT_GET_CLASS (serializable), n_pspecs); +} - is_initialized = TRUE; - } +static void +json_serializable_real_set_property (JsonSerializable *serializable, + GParamSpec *pspec, + const GValue *value) +{ + g_object_set_property (G_OBJECT (serializable), pspec->name, value); } -GType -json_serializable_get_type (void) +static void +json_serializable_real_get_property (JsonSerializable *serializable, + GParamSpec *pspec, + GValue *value) { - static GType iface_type = 0; + g_object_get_property (G_OBJECT (serializable), pspec->name, value); +} - if (!iface_type) - iface_type = - g_type_register_static_simple (G_TYPE_INTERFACE, - g_intern_static_string ("JsonSerializable"), - sizeof (JsonSerializableIface), - json_serializable_base_init, - 0, NULL, 0); +/* typedef to satisfy G_DEFINE_INTERFACE's naming */ +typedef JsonSerializableIface JsonSerializableInterface; - return iface_type; +static void +json_serializable_default_init (JsonSerializableInterface *iface) +{ + iface->serialize_property = json_serializable_real_serialize; + iface->deserialize_property = json_serializable_real_deserialize; + iface->find_property = json_serializable_real_find_property; + iface->list_properties = json_serializable_real_list_properties; + iface->set_property = json_serializable_real_set_property; + iface->get_property = json_serializable_real_get_property; } +G_DEFINE_INTERFACE (JsonSerializable, json_serializable, G_TYPE_OBJECT); + /** * json_serializable_default_serialize_property: * @serializable: a #JsonSerializable object @@ -164,12 +182,14 @@ json_serializable_get_type (void) * @pspec: a #GParamSpec * * Calls the default implementation of the #JsonSerializable - * serialize_property() virtual function + * #JsonSerializableIface.serialize_property() virtual function. * * This function can be used inside a custom implementation - * of the serialize_property() virtual function in lieu of: + * of the #JsonSerializableIface.serialize_property() virtual + * function in lieu of calling the default implementation + * through g_type_default_interface_peek(): * - * |[ + * |[ * JsonSerializable *iface; * JsonNode *node; * @@ -214,7 +234,7 @@ json_serializable_default_serialize_property (JsonSerializable *serializable, * This function can be used inside a custom implementation * of the deserialize_property() virtual function in lieu of: * - * |[ + * |[ * JsonSerializable *iface; * gboolean res; * @@ -247,3 +267,75 @@ json_serializable_default_deserialize_property (JsonSerializable *serializable, value, pspec, property_node); } + +/** + * json_serializable_find_property: + * @serializable: a #JsonSerializable + * @name: the name of the property + * + * FIXME + * + * Return value: (transfer none): the #GParamSpec for the property + * or %NULL if no property was found + * + * Since: 0.14 + */ +GParamSpec * +json_serializable_find_property (JsonSerializable *serializable, + const char *name) +{ + g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), NULL); + g_return_val_if_fail (name != NULL, NULL); + + return JSON_SERIALIZABLE_GET_IFACE (serializable)->find_property (serializable, name); +} + +/** + * json_serializable_list_properties: + * @serializable: a #JsonSerializable + * @n_pspecs: (out): return location for the length of the array + * of #GParamSpec returned by the function + * + * FIXME + * + * Return value: (array length=n_pspecs) (transfer container): an array + * of #GParamSpec. Use g_free() to free the array when done. + * + * Since: 0.14 + */ +GParamSpec ** +json_serializable_list_properties (JsonSerializable *serializable, + guint *n_pspecs) +{ + g_return_val_if_fail (JSON_IS_SERIALIZABLE (serializable), NULL); + + return JSON_SERIALIZABLE_GET_IFACE (serializable)->list_properties (serializable, n_pspecs); +} + +void +json_serializable_set_property (JsonSerializable *serializable, + GParamSpec *pspec, + const GValue *value) +{ + g_return_if_fail (JSON_IS_SERIALIZABLE (serializable)); + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (value != NULL); + + JSON_SERIALIZABLE_GET_IFACE (serializable)->set_property (serializable, + pspec, + value); +} + +void +json_serializable_get_property (JsonSerializable *serializable, + GParamSpec *pspec, + GValue *value) +{ + g_return_if_fail (JSON_IS_SERIALIZABLE (serializable)); + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (value != NULL); + + JSON_SERIALIZABLE_GET_IFACE (serializable)->get_property (serializable, + pspec, + value); +} diff --git a/json-glib/json-types-private.h b/json-glib/json-types-private.h index 2b708cc..efce6a9 100644 --- a/json-glib/json-types-private.h +++ b/json-glib/json-types-private.h @@ -28,6 +28,17 @@ G_BEGIN_DECLS +typedef struct _JsonValue JsonValue; + +typedef enum { + JSON_VALUE_INVALID = 0, + JSON_VALUE_INT, + JSON_VALUE_DOUBLE, + JSON_VALUE_BOOLEAN, + JSON_VALUE_STRING, + JSON_VALUE_NULL +} JsonValueType; + struct _JsonNode { /*< private >*/ @@ -36,12 +47,37 @@ struct _JsonNode union { JsonObject *object; JsonArray *array; - GValue value; + JsonValue *value; } data; JsonNode *parent; }; +#define JSON_VALUE_INIT { JSON_VALUE_INVALID, 1, { 0 } } +#define JSON_VALUE_INIT_TYPE(t) { (t), 1, { 0 } } +#define JSON_VALUE_IS_VALID(v) ((v) != NULL && (v)->type != JSON_VALUE_INVALID) +#define JSON_VALUE_HOLDS(v,t) ((v) != NULL && (v)->type == (t)) +#define JSON_VALUE_HOLDS_INT(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_INT)) +#define JSON_VALUE_HOLDS_DOUBLE(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_DOUBLE)) +#define JSON_VALUE_HOLDS_BOOLEAN(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_BOOLEAN)) +#define JSON_VALUE_HOLDS_STRING(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_STRING)) +#define JSON_VALUE_HOLDS_NULL(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_NULL)) +#define JSON_VALUE_TYPE(v) (json_value_type((v))) + +struct _JsonValue +{ + JsonValueType type; + + volatile gint ref_count; + + union { + gint64 v_int; + gdouble v_double; + gboolean v_bool; + gchar *v_str; + } data; +}; + struct _JsonArray { GPtrArray *elements; @@ -59,11 +95,47 @@ struct _JsonObject volatile gint ref_count; }; -#if !GLIB_CHECK_VERSION(2, 31, 0) -G_CONST_RETURN gchar *json_node_type_get_name (JsonNodeType node_type); -#else -const gchar *json_node_type_get_name (JsonNodeType node_type); -#endif +G_GNUC_INTERNAL +const gchar * json_node_type_get_name (JsonNodeType node_type); +G_GNUC_INTERNAL +const gchar * json_value_type_get_name (JsonValueType value_type); + +G_GNUC_INTERNAL +GType json_value_type (const JsonValue *value); + +G_GNUC_INTERNAL +JsonValue * json_value_alloc (void); +G_GNUC_INTERNAL +JsonValue * json_value_init (JsonValue *value, + JsonValueType value_type); +G_GNUC_INTERNAL +JsonValue * json_value_ref (JsonValue *value); +G_GNUC_INTERNAL +void json_value_unref (JsonValue *value); +G_GNUC_INTERNAL +void json_value_unset (JsonValue *value); +G_GNUC_INTERNAL +void json_value_free (JsonValue *value); +G_GNUC_INTERNAL +void json_value_set_int (JsonValue *value, + gint64 v_int); +G_GNUC_INTERNAL +gint64 json_value_get_int (const JsonValue *value); +G_GNUC_INTERNAL +void json_value_set_double (JsonValue *value, + gdouble v_double); +G_GNUC_INTERNAL +gdouble json_value_get_double (const JsonValue *value); +G_GNUC_INTERNAL +void json_value_set_boolean (JsonValue *value, + gboolean v_bool); +G_GNUC_INTERNAL +gboolean json_value_get_boolean (const JsonValue *value); +G_GNUC_INTERNAL +void json_value_set_string (JsonValue *value, + const gchar *v_str); +G_GNUC_INTERNAL +const gchar * json_value_get_string (const JsonValue *value); G_END_DECLS diff --git a/json-glib/json-types.h b/json-glib/json-types.h index 35e276f..9acc23b 100644 --- a/json-glib/json-types.h +++ b/json-glib/json-types.h @@ -21,14 +21,15 @@ * Emmanuele Bassi */ +#ifndef __JSON_TYPES_H__ +#define __JSON_TYPES_H__ + #if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) #error "Only can be included directly." #endif -#ifndef __JSON_TYPES_H__ -#define __JSON_TYPES_H__ - #include +#include G_BEGIN_DECLS @@ -97,7 +98,6 @@ G_BEGIN_DECLS /** * JsonNode: - * @type: the type of node * * A generic container of JSON data types. The contents of the #JsonNode * structure are private and should only be accessed via the provided @@ -173,178 +173,269 @@ typedef void (* JsonArrayForeach) (JsonArray *array, JsonNode *element_node, gpointer user_data); - - /* * JsonNode */ + +JSON_AVAILABLE_IN_1_0 GType json_node_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 JsonNode * json_node_new (JsonNodeType type); + +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_alloc (void); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init (JsonNode *node, + JsonNodeType type); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_object (JsonNode *node, + JsonObject *object); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_array (JsonNode *node, + JsonArray *array); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_int (JsonNode *node, + gint64 value); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_double (JsonNode *node, + gdouble value); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_boolean (JsonNode *node, + gboolean value); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_string (JsonNode *node, + const char *value); +JSON_AVAILABLE_IN_1_0 +JsonNode * json_node_init_null (JsonNode *node); + +JSON_AVAILABLE_IN_1_0 JsonNode * json_node_copy (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_free (JsonNode *node); + +JSON_AVAILABLE_IN_1_0 JsonNodeType json_node_get_node_type (JsonNode *node); +JSON_AVAILABLE_IN_1_0 GType json_node_get_value_type (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_parent (JsonNode *node, JsonNode *parent); +JSON_AVAILABLE_IN_1_0 JsonNode * json_node_get_parent (JsonNode *node); -#if !GLIB_CHECK_VERSION(2,31,0) -G_CONST_RETURN gchar *json_node_type_name (JsonNode *node); -#else -const gchar *json_node_type_name (JsonNode *node); -#endif +JSON_AVAILABLE_IN_1_0 +const gchar * json_node_type_name (JsonNode *node); + +JSON_AVAILABLE_IN_1_0 void json_node_set_object (JsonNode *node, JsonObject *object); +JSON_AVAILABLE_IN_1_0 void json_node_take_object (JsonNode *node, JsonObject *object); +JSON_AVAILABLE_IN_1_0 JsonObject * json_node_get_object (JsonNode *node); +JSON_AVAILABLE_IN_1_0 JsonObject * json_node_dup_object (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_array (JsonNode *node, JsonArray *array); +JSON_AVAILABLE_IN_1_0 void json_node_take_array (JsonNode *node, JsonArray *array); +JSON_AVAILABLE_IN_1_0 JsonArray * json_node_get_array (JsonNode *node); +JSON_AVAILABLE_IN_1_0 JsonArray * json_node_dup_array (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_value (JsonNode *node, const GValue *value); +JSON_AVAILABLE_IN_1_0 void json_node_get_value (JsonNode *node, GValue *value); +JSON_AVAILABLE_IN_1_0 void json_node_set_string (JsonNode *node, const gchar *value); -#if !GLIB_CHECK_VERSION(2,31,0) -G_CONST_RETURN gchar *json_node_get_string (JsonNode *node); -#else -const gchar *json_node_get_string (JsonNode *node); -#endif +JSON_AVAILABLE_IN_1_0 +const gchar * json_node_get_string (JsonNode *node); +JSON_AVAILABLE_IN_1_0 gchar * json_node_dup_string (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_int (JsonNode *node, gint64 value); +JSON_AVAILABLE_IN_1_0 gint64 json_node_get_int (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_double (JsonNode *node, gdouble value); +JSON_AVAILABLE_IN_1_0 gdouble json_node_get_double (JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_node_set_boolean (JsonNode *node, gboolean value); +JSON_AVAILABLE_IN_1_0 gboolean json_node_get_boolean (JsonNode *node); +JSON_AVAILABLE_IN_1_0 gboolean json_node_is_null (JsonNode *node); /* * JsonObject */ +JSON_AVAILABLE_IN_1_0 GType json_object_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 JsonObject * json_object_new (void); +JSON_AVAILABLE_IN_1_0 JsonObject * json_object_ref (JsonObject *object); +JSON_AVAILABLE_IN_1_0 void json_object_unref (JsonObject *object); -#ifndef JSON_DISABLE_DEPRECATED +JSON_DEPRECATED_IN_1_0_FOR(json_object_set_member) void json_object_add_member (JsonObject *object, const gchar *member_name, - JsonNode *node) G_GNUC_DEPRECATED; -#endif /* JSON_DISABLE_DEPRECATED */ + JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_object_set_member (JsonObject *object, const gchar *member_name, JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_object_set_int_member (JsonObject *object, const gchar *member_name, gint64 value); +JSON_AVAILABLE_IN_1_0 void json_object_set_double_member (JsonObject *object, const gchar *member_name, gdouble value); +JSON_AVAILABLE_IN_1_0 void json_object_set_boolean_member (JsonObject *object, const gchar *member_name, gboolean value); +JSON_AVAILABLE_IN_1_0 void json_object_set_string_member (JsonObject *object, const gchar *member_name, const gchar *value); +JSON_AVAILABLE_IN_1_0 void json_object_set_null_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 void json_object_set_array_member (JsonObject *object, const gchar *member_name, JsonArray *value); +JSON_AVAILABLE_IN_1_0 void json_object_set_object_member (JsonObject *object, const gchar *member_name, JsonObject *value); +JSON_AVAILABLE_IN_1_0 GList * json_object_get_members (JsonObject *object); +JSON_AVAILABLE_IN_1_0 JsonNode * json_object_get_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 JsonNode * json_object_dup_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 gint64 json_object_get_int_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 gdouble json_object_get_double_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 gboolean json_object_get_boolean_member (JsonObject *object, const gchar *member_name); -#if !GLIB_CHECK_VERSION(2,31,0) -G_CONST_RETURN gchar *json_object_get_string_member (JsonObject *object, - const gchar *member_name); -#else -const gchar *json_object_get_string_member (JsonObject *object, +JSON_AVAILABLE_IN_1_0 +const gchar * json_object_get_string_member (JsonObject *object, const gchar *member_name); -#endif +JSON_AVAILABLE_IN_1_0 gboolean json_object_get_null_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 JsonArray * json_object_get_array_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 JsonObject * json_object_get_object_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 gboolean json_object_has_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 void json_object_remove_member (JsonObject *object, const gchar *member_name); +JSON_AVAILABLE_IN_1_0 GList * json_object_get_values (JsonObject *object); +JSON_AVAILABLE_IN_1_0 guint json_object_get_size (JsonObject *object); +JSON_AVAILABLE_IN_1_0 void json_object_foreach_member (JsonObject *object, JsonObjectForeach func, gpointer data); +JSON_AVAILABLE_IN_1_0 GType json_array_get_type (void) G_GNUC_CONST; +JSON_AVAILABLE_IN_1_0 JsonArray * json_array_new (void); +JSON_AVAILABLE_IN_1_0 JsonArray * json_array_sized_new (guint n_elements); +JSON_AVAILABLE_IN_1_0 JsonArray * json_array_ref (JsonArray *array); +JSON_AVAILABLE_IN_1_0 void json_array_unref (JsonArray *array); +JSON_AVAILABLE_IN_1_0 void json_array_add_element (JsonArray *array, JsonNode *node); +JSON_AVAILABLE_IN_1_0 void json_array_add_int_element (JsonArray *array, gint64 value); +JSON_AVAILABLE_IN_1_0 void json_array_add_double_element (JsonArray *array, gdouble value); +JSON_AVAILABLE_IN_1_0 void json_array_add_boolean_element (JsonArray *array, gboolean value); +JSON_AVAILABLE_IN_1_0 void json_array_add_string_element (JsonArray *array, const gchar *value); +JSON_AVAILABLE_IN_1_0 void json_array_add_null_element (JsonArray *array); +JSON_AVAILABLE_IN_1_0 void json_array_add_array_element (JsonArray *array, JsonArray *value); +JSON_AVAILABLE_IN_1_0 void json_array_add_object_element (JsonArray *array, JsonObject *value); +JSON_AVAILABLE_IN_1_0 GList * json_array_get_elements (JsonArray *array); +JSON_AVAILABLE_IN_1_0 JsonNode * json_array_get_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 gint64 json_array_get_int_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 gdouble json_array_get_double_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 gboolean json_array_get_boolean_element (JsonArray *array, guint index_); -#if !GLIB_CHECK_VERSION(2,31,0) -G_CONST_RETURN gchar *json_array_get_string_element (JsonArray *array, - guint index_); -#else -const gchar *json_array_get_string_element (JsonArray *array, +JSON_AVAILABLE_IN_1_0 +const gchar * json_array_get_string_element (JsonArray *array, guint index_); -#endif +JSON_AVAILABLE_IN_1_0 gboolean json_array_get_null_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 JsonArray * json_array_get_array_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 JsonObject * json_array_get_object_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 JsonNode * json_array_dup_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 void json_array_remove_element (JsonArray *array, guint index_); +JSON_AVAILABLE_IN_1_0 guint json_array_get_length (JsonArray *array); +JSON_AVAILABLE_IN_1_0 void json_array_foreach_element (JsonArray *array, JsonArrayForeach func, gpointer data); diff --git a/json-glib/json-value.c b/json-glib/json-value.c new file mode 100644 index 0000000..43ea4dd --- /dev/null +++ b/json-glib/json-value.c @@ -0,0 +1,214 @@ +/* json-value.c - JSON value container + * + * This file is part of JSON-GLib + * Copyright (C) 2012 Emmanuele Bassi + * + * 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, see . + * + * Author: + * Emmanuele Bassi + */ + +#include "config.h" + +#include + +#include "json-types-private.h" + +const gchar * +json_value_type_get_name (JsonValueType value_type) +{ + switch (value_type) + { + case JSON_VALUE_INVALID: + return "Unset"; + + case JSON_VALUE_INT: + return "Integer"; + + case JSON_VALUE_DOUBLE: + return "Floating Point"; + + case JSON_VALUE_BOOLEAN: + return "Boolean"; + + case JSON_VALUE_STRING: + return "String"; + + case JSON_VALUE_NULL: + return "Null"; + } + + return "Undefined"; +} + +GType +json_value_type (const JsonValue *value) +{ + switch (value->type) + { + case JSON_VALUE_INVALID: + return G_TYPE_INVALID; + + case JSON_VALUE_INT: + return G_TYPE_INT64; + + case JSON_VALUE_DOUBLE: + return G_TYPE_DOUBLE; + + case JSON_VALUE_BOOLEAN: + return G_TYPE_BOOLEAN; + + case JSON_VALUE_STRING: + return G_TYPE_STRING; + + case JSON_VALUE_NULL: + return G_TYPE_INVALID; + } + + return G_TYPE_INVALID; +} + +JsonValue * +json_value_alloc (void) +{ + JsonValue *res = g_slice_new0 (JsonValue); + + res->ref_count = 1; + + return res; +} + +JsonValue * +json_value_init (JsonValue *value, + JsonValueType value_type) +{ + g_return_val_if_fail (value != NULL, NULL); + + if (value->type != JSON_VALUE_INVALID) + json_value_unset (value); + + value->type = value_type; + + return value; +} + +JsonValue * +json_value_ref (JsonValue *value) +{ + g_return_val_if_fail (value != NULL, NULL); + + g_atomic_int_add (&value->ref_count, 1); + + return value; +} + +void +json_value_unref (JsonValue *value) +{ + g_return_if_fail (value != NULL); + + if (g_atomic_int_dec_and_test (&value->ref_count)) + json_value_free (value); +} + +void +json_value_unset (JsonValue *value) +{ + g_return_if_fail (value != NULL); + + switch (value->type) + { + case JSON_VALUE_INVALID: + break; + + case JSON_VALUE_INT: + value->data.v_int = 0; + break; + + case JSON_VALUE_DOUBLE: + value->data.v_double = 0.0; + break; + + case JSON_VALUE_BOOLEAN: + value->data.v_bool = FALSE; + break; + + case JSON_VALUE_STRING: + g_free (value->data.v_str); + value->data.v_str = NULL; + break; + + case JSON_VALUE_NULL: + break; + } +} + +void +json_value_free (JsonValue *value) +{ + if (G_LIKELY (value != NULL)) + { + json_value_unset (value); + g_slice_free (JsonValue, value); + } +} + +#define _JSON_VALUE_DEFINE_SET(Type,EType,CType,VField) \ +void \ +json_value_set_##Type (JsonValue *value, CType VField) \ +{ \ + g_return_if_fail (JSON_VALUE_IS_VALID (value)); \ + g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \ +\ + value->data.VField = VField; \ +\ +} + +#define _JSON_VALUE_DEFINE_GET(Type,EType,CType,VField) \ +CType \ +json_value_get_##Type (const JsonValue *value) \ +{ \ + g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \ + g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \ +\ + return value->data.VField; \ +} + +#define _JSON_VALUE_DEFINE_SET_GET(Type,EType,CType,VField) \ +_JSON_VALUE_DEFINE_SET(Type,EType,CType,VField) \ +_JSON_VALUE_DEFINE_GET(Type,EType,CType,VField) + +_JSON_VALUE_DEFINE_SET_GET(int, INT, gint64, v_int) + +_JSON_VALUE_DEFINE_SET_GET(double, DOUBLE, gdouble, v_double) + +_JSON_VALUE_DEFINE_SET_GET(boolean, BOOLEAN, gboolean, v_bool) + +void +json_value_set_string (JsonValue *value, + const gchar *v_str) +{ + g_return_if_fail (JSON_VALUE_IS_VALID (value)); + g_return_if_fail (JSON_VALUE_HOLDS_STRING (value)); + + g_free (value->data.v_str); + value->data.v_str = g_strdup (v_str); +} + +_JSON_VALUE_DEFINE_GET(string, STRING, const gchar *, v_str) + +#undef _JSON_VALUE_DEFINE_SET_GET +#undef _JSON_VALUE_DEFINE_GET +#undef _JSON_VALUE_DEFINE_SET diff --git a/json-glib/json-version-macros.h b/json-glib/json-version-macros.h new file mode 100644 index 0000000..dd2ae1c --- /dev/null +++ b/json-glib/json-version-macros.h @@ -0,0 +1,135 @@ +/* json-version-macros.h - JSON-GLib symbol versioning macros + * + * This file is part of JSON-GLib + * Copyright © 2014 Emmanuele Bassi + * + * 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, see . + */ + +#ifndef __JSON_VERSION_MACROS_H__ +#define __JSON_VERSION_MACROS_H__ + +#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) +#error "Only can be included directly." +#endif + +#include "json-version.h" + +#ifndef _JSON_EXTERN +#define _JSON_EXTERN extern +#endif + +#ifdef JSON_DISABLE_DEPRECATION_WARNINGS +#define JSON_DEPRECATED _JSON_EXTERN +#define JSON_DEPRECATED_FOR(f) _JSON_EXTERN +#define JSON_UNAVAILABLE(maj,min) _JSON_EXTERN +#else +#define JSON_DEPRECATED G_DEPRECATED _JSON_EXTERN +#define JSON_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _JSON_EXTERN +#define JSON_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _JSON_EXTERN +#endif + +/* XXX: Each new cycle should add a new version symbol here */ +#define JSON_VERSION_1_0 (G_ENCODE_VERSION (1, 0)) + +/* evaluates to the current stable version; for development cycles, + * this means the next stable target + */ +#if (JSON_MINOR_VERSION == 99) +#define JSON_VERSION_CUR_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION + 1, 0)) +#elif (JSON_MINOR_VERSION % 2) +#define JSON_VERSION_CUR_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION + 1)) +#else +#define JSON_VERSION_CUR_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION)) +#endif + +/* evaluates to the previous stable version */ +#if (JSON_MINOR_VERSION == 99) +#define JSON_VERSION_PREV_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION + 1, 0)) +#elif (JSON_MINOR_VERSION % 2) +#define JSON_VERSION_PREV_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION - 1)) +#else +#define JSON_VERSION_PREV_STABLE (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION - 2)) +#endif + +/** + * JSON_VERSION_MIN_REQUIRED: + * + * A macro that should be defined by the user prior to including + * the gdk.h header. + * The definition should be one of the predefined JSON version + * macros: %JSON_VERSION_1_0, %JSON_VERSION_1_2,... + * + * This macro defines the lower bound for the JSON-GLib API to use. + * + * If a function has been deprecated in a newer version of JSON-GLib, + * it is possible to use this symbol to avoid the compiler warnings + * without disabling warning for every deprecated function. + * + * Since: 1.0 + */ +#ifndef JSON_VERSION_MIN_REQUIRED +# define JSON_VERSION_MIN_REQUIRED (JSON_VERSION_CUR_STABLE) +#endif + +/** + * JSON_VERSION_MAX_ALLOWED: + * + * A macro that should be defined by the user prior to including + * the json-glib.h header. + + * The definition should be one of the predefined JSON-GLib version + * macros: %JSON_VERSION_1_0, %JSON_VERSION_1_2,... + * + * This macro defines the upper bound for the JSON API-GLib to use. + * + * If a function has been introduced in a newer version of JSON-GLib, + * it is possible to use this symbol to get compiler warnings when + * trying to use that function. + * + * Since: 1.0 + */ +#ifndef JSON_VERSION_MAX_ALLOWED +# if JSON_VERSION_MIN_REQUIRED > JSON_VERSION_PREV_STABLE +# define JSON_VERSION_MAX_ALLOWED (JSON_VERSION_MIN_REQUIRED) +# else +# define JSON_VERSION_MAX_ALLOWED (JSON_VERSION_CUR_STABLE) +# endif +#endif + +/* sanity checks */ +#if JSON_VERSION_MAX_ALLOWED < JSON_VERSION_MIN_REQUIRED +#error "JSON_VERSION_MAX_ALLOWED must be >= JSON_VERSION_MIN_REQUIRED" +#endif +#if JSON_VERSION_MIN_REQUIRED < JSON_VERSION_1_0 +#error "JSON_VERSION_MIN_REQUIRED must be >= JSON_VERSION_1_0" +#endif + +/* XXX: Every new stable minor release should add a set of macros here */ + +#if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_0 +# define JSON_DEPRECATED_IN_1_0 JSON_DEPRECATED +# define JSON_DEPRECATED_IN_1_0_FOR(f) JSON_DEPRECATED_FOR(f) +#else +# define JSON_DEPRECATED_IN_1_0 _JSON_EXTERN +# define JSON_DEPRECATED_IN_1_0_FOR(f) _JSON_EXTERN +#endif + +#if JSON_VERSION_MAX_ALLOWED < JSON_VERSION_1_0 +# define JSON_AVAILABLE_IN_1_0 JSON_UNAVAILABLE(1, 0) +#else +# define JSON_AVAILABLE_IN_1_0 _JSON_EXTERN +#endif + +#endif /* __JSON_VERSION_MACROS_H__ */ diff --git a/json-glib/json-version.h.in b/json-glib/json-version.h.in index bc05f1b..d18caa2 100644 --- a/json-glib/json-version.h.in +++ b/json-glib/json-version.h.in @@ -21,13 +21,13 @@ * Emmanuele Bassi */ +#ifndef __JSON_VERSION_H__ +#define __JSON_VERSION_H__ + #if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION) #error "Only can be included directly." #endif -#ifndef __JSON_VERSION_H__ -#define __JSON_VERSION_H__ - /** * SECTION:json-version * @short_description: JSON-GLib version checking @@ -67,20 +67,22 @@ /** * JSON_VERSION_S: * - * Json version, encoded as a string, useful for printing and + * JSON-GLib version, encoded as a string, useful for printing and * concatenation. */ #define JSON_VERSION_S "@JSON_VERSION@" +#define JSON_ENCODE_VERSION(major,minor,micro) \ + ((major) << 24 | (minor) << 16 | (micro) << 8) + /** * JSON_VERSION_HEX: * - * Json version, encoded as an hexadecimal number, useful for + * JSON-GLib version, encoded as an hexadecimal number, useful for * integer comparisons. */ -#define JSON_VERSION_HEX (JSON_MAJOR_VERSION << 24 | \ - JSON_MINOR_VERSION << 16 | \ - JSON_MICRO_VERSION << 8) +#define JSON_VERSION_HEX \ + (JSON_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION, JSON_MICRO_VERSION)) /** * JSON_CHECK_VERSION: diff --git a/json-glib/tests/Makefile.am b/json-glib/tests/Makefile.am index dc139d4..8f379ca 100644 --- a/json-glib/tests/Makefile.am +++ b/json-glib/tests/Makefile.am @@ -1,29 +1,35 @@ -include $(top_srcdir)/build/autotools/Makefile.am.gtest -include $(top_srcdir)/build/autotools/Makefile.am.silent - -NULL = - -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/json-glib \ +include $(top_srcdir)/build/autotools/glib-tap.mk + +AM_CFLAGS = -g $(JSON_CFLAGS) $(MAINTAINER_CFLAGS) +LDADD = $(top_builddir)/json-glib//libjson-glib-1.0.la $(JSON_LIBS) +AM_CPPFLAGS = \ + $(JSON_DEBUG_CFLAGS) \ + -DG_LOG_DOMAIN=\"Json\" \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_srcdir)/json-glib \ + -I$(top_builddir)/json-glib \ $(NULL) -AM_CPPFLAGS = $(JSON_DEBUG_CFLAGS) -AM_CFLAGS = -g $(JSON_CFLAGS) -AM_LDFLAGS = $(JSON_LIBS) - -noinst_PROGRAMS = $(TEST_PROGS) -progs_ldadd = $(top_builddir)/json-glib/libjson-glib-1.0.la - -TEST_PROGS += array-test -array_test_SOURCES = array-test.c -array_test_LDADD = $(progs_ldadd) - -TEST_PROGS += object-test -object_test_SOURCES = object-test.c -object_test_LDADD = $(progs_ldadd) +dist_test_data = \ + stream-load.json \ + $(NULL) -TEST_PROGS += node-test -node_test_SOURCES = node-test.c -node_test_LDADD = $(progs_ldadd) +test_programs = \ + array \ + boxed \ + builder \ + generator \ + gvariant \ + invalid \ + node \ + object \ + parser \ + path \ + reader \ + serialize-simple \ + serialize-complex \ + serialize-full \ + $(NULL) +include $(top_srcdir)/build/autotools/Makefile.am.gitignore diff --git a/json-glib/tests/array-test.c b/json-glib/tests/array.c similarity index 54% rename from json-glib/tests/array-test.c rename to json-glib/tests/array.c index 7c29cdf..98afeab 100644 --- a/json-glib/tests/array-test.c +++ b/json-glib/tests/array.c @@ -29,6 +29,40 @@ test_add_element (void) node = json_array_get_element (array, 0); g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_NULL); + g_assert (json_array_get_null_element (array, 0)); + + json_array_add_int_element (array, 42); + g_assert_cmpint (json_array_get_length (array), ==, 2); + g_assert_cmpint (json_array_get_int_element (array, 1), ==, 42); + + json_array_add_double_element (array, 3.14); + g_assert_cmpint (json_array_get_length (array), ==, 3); + g_assert_cmpfloat (json_array_get_double_element (array, 2), ==, 3.14); + + json_array_add_boolean_element (array, TRUE); + g_assert_cmpint (json_array_get_length (array), ==, 4); + g_assert (json_array_get_boolean_element (array, 3)); + + json_array_add_string_element (array, "Hello"); + g_assert_cmpint (json_array_get_length (array), ==, 5); + g_assert_cmpstr (json_array_get_string_element (array, 4), ==, "Hello"); + + json_array_add_string_element (array, NULL); + g_assert_cmpint (json_array_get_length (array), ==, 6); + g_assert (json_array_get_string_element (array, 5) == NULL); + g_assert (json_array_get_element (array, 5) != NULL); + g_assert (json_array_get_null_element (array, 5)); + + json_array_add_array_element (array, NULL); + g_assert (json_array_get_array_element (array, 6) == NULL); + g_assert (json_array_get_null_element (array, 6)); + + json_array_add_object_element (array, json_object_new ()); + g_assert (json_array_get_object_element (array, 7) != NULL); + + json_array_add_object_element (array, NULL); + g_assert (json_array_get_object_element (array, 8) == NULL); + g_assert (json_array_get_null_element (array, 8)); json_array_unref (array); } @@ -49,17 +83,19 @@ test_remove_element (void) typedef struct _TestForeachFixture { + GList *elements; gint n_elements; + gint iterations; } TestForeachFixture; static const struct { JsonNodeType element_type; GType element_gtype; } type_verify[] = { - { JSON_NODE_VALUE, G_TYPE_INT64 }, + { JSON_NODE_VALUE, G_TYPE_INT64 }, { JSON_NODE_VALUE, G_TYPE_BOOLEAN }, - { JSON_NODE_VALUE, G_TYPE_STRING }, - { JSON_NODE_NULL, G_TYPE_INVALID } + { JSON_NODE_VALUE, G_TYPE_STRING }, + { JSON_NODE_NULL, G_TYPE_INVALID } }; static void @@ -70,10 +106,11 @@ verify_foreach (JsonArray *array, { TestForeachFixture *fixture = user_data; + g_assert (g_list_find (fixture->elements, element_node)); g_assert (json_node_get_node_type (element_node) == type_verify[index_].element_type); g_assert (json_node_get_value_type (element_node) == type_verify[index_].element_gtype); - fixture->n_elements += 1; + fixture->iterations += 1; } static void @@ -87,10 +124,19 @@ test_foreach_element (void) json_array_add_string_element (array, "hello"); json_array_add_null_element (array); + fixture.elements = json_array_get_elements (array); + g_assert (fixture.elements != NULL); + + fixture.n_elements = json_array_get_length (array); + g_assert_cmpint (fixture.n_elements, ==, g_list_length (fixture.elements)); + + fixture.iterations = 0; + json_array_foreach_element (array, verify_foreach, &fixture); - g_assert_cmpint (fixture.n_elements, ==, json_array_get_length (array)); + g_assert_cmpint (fixture.iterations, ==, fixture.n_elements); + g_list_free (fixture.elements); json_array_unref (array); } @@ -98,7 +144,6 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/array/empty-array", test_empty_array); diff --git a/tests/test-serialize-boxed.c b/json-glib/tests/boxed.c similarity index 99% rename from tests/test-serialize-boxed.c rename to json-glib/tests/boxed.c index deeef13..6e52e2a 100644 --- a/tests/test-serialize-boxed.c +++ b/json-glib/tests/boxed.c @@ -254,7 +254,6 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/boxed/serialize-property", test_serialize_boxed); diff --git a/json-glib/tests/builder.c b/json-glib/tests/builder.c new file mode 100644 index 0000000..0183381 --- /dev/null +++ b/json-glib/tests/builder.c @@ -0,0 +1,167 @@ +#include +#include +#include + +#include + +#include + +static const gchar *complex_object = "{\"depth1\":[1,{\"depth2\":[3,[null,false],\"after array\"],\"value2\":true}],\"object1\":{},\"value3\":null,\"value4\":42}"; + +static const gchar *empty_object = "{\"a\":{}}"; + +static const gchar *reset_object = "{\"test\":\"reset\"}"; +static const gchar *reset_array = "[\"reset\"]"; + +static void +test_builder_complex (void) +{ + JsonBuilder *builder = json_builder_new (); + JsonNode *node; + JsonGenerator *generator; + gsize length; + gchar *data; + + json_builder_begin_object (builder); + + json_builder_set_member_name (builder, "depth1"); + json_builder_begin_array (builder); + json_builder_add_int_value (builder, 1); + + json_builder_begin_object (builder); + + json_builder_set_member_name (builder, "depth2"); + json_builder_begin_array (builder); + json_builder_add_int_value (builder, 3); + + json_builder_begin_array (builder); + json_builder_add_null_value (builder); + json_builder_add_boolean_value (builder, FALSE); + json_builder_end_array (builder); + + json_builder_add_string_value (builder, "after array"); + json_builder_end_array (builder); /* depth2 */ + + json_builder_set_member_name (builder, "value2"); + json_builder_add_boolean_value (builder, TRUE); + json_builder_end_object (builder); + + json_builder_end_array (builder); /* depth1 */ + + json_builder_set_member_name (builder, "object1"); + json_builder_begin_object (builder); + json_builder_end_object (builder); + + json_builder_set_member_name (builder, "value3"); + json_builder_add_null_value (builder); + + json_builder_set_member_name (builder, "value4"); + json_builder_add_int_value (builder, 42); + + json_builder_end_object (builder); + + node = json_builder_get_root (builder); + g_object_unref (builder); + + generator = json_generator_new (); + json_generator_set_root (generator, node); + data = json_generator_to_data (generator, &length); + + if (g_test_verbose ()) + g_print ("Builder complex: '%*s'\n", (int)length, data); + + g_assert_cmpint (length, ==, strlen (complex_object)); + g_assert_cmpstr (data, ==, complex_object); + + g_free (data); + json_node_free (node); + g_object_unref (generator); +} + +static void +test_builder_empty (void) +{ + JsonBuilder *builder = json_builder_new (); + JsonNode *node; + JsonGenerator *generator; + gsize length; + gchar *data; + + json_builder_begin_object (builder); + + json_builder_set_member_name (builder, "a"); + + json_builder_begin_object (builder); + json_builder_end_object (builder); + + json_builder_end_object (builder); + + node = json_builder_get_root (builder); + g_object_unref (builder); + + generator = json_generator_new (); + json_generator_set_root (generator, node); + data = json_generator_to_data (generator, &length); + + if (g_test_verbose ()) + g_print ("Builder empty: '%*s'\n", (int)length, data); + + g_assert_cmpint (length, ==, strlen (empty_object)); + g_assert_cmpstr (data, ==, empty_object); + + g_free (data); + json_node_free (node); + g_object_unref (generator); +} + +static void +test_builder_reset (void) +{ + JsonBuilder *builder = json_builder_new (); + JsonGenerator *generator = json_generator_new (); + JsonNode *node; + gsize length; + gchar *data; + + json_builder_begin_object (builder); + json_builder_set_member_name (builder, "test"); + json_builder_add_string_value (builder, "reset"); + json_builder_end_object (builder); + + node = json_builder_get_root (builder); + json_generator_set_root (generator, node); + data = json_generator_to_data (generator, &length); + g_assert (strncmp (data, reset_object, length) == 0); + + g_free (data); + json_node_free (node); + + json_builder_reset (builder); + + json_builder_begin_array (builder); + json_builder_add_string_value (builder, "reset"); + json_builder_end_array (builder); + + node = json_builder_get_root (builder); + json_generator_set_root (generator, node); + data = json_generator_to_data (generator, &length); + g_assert (strncmp (data, reset_array, length) == 0); + + g_free (data); + json_node_free (node); + g_object_unref (builder); + g_object_unref (generator); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/builder/complex", test_builder_complex); + g_test_add_func ("/builder/complex", test_builder_empty); + g_test_add_func ("/builder/reset", test_builder_reset); + + return g_test_run (); +} diff --git a/json-glib/tests/generator.c b/json-glib/tests/generator.c new file mode 100644 index 0000000..f156fde --- /dev/null +++ b/json-glib/tests/generator.c @@ -0,0 +1,441 @@ +#include "config.h" + +#include +#include +#include + +#include + +#include + +#include + +static const gchar *empty_array = "[]"; +static const gchar *empty_object = "{}"; + +static const gchar *simple_array = "[true,false,null,42,\"foo\"]"; +static const gchar *nested_array = "[true,[false,null],42]"; + +static const gchar *simple_object = "{\"Bool1\":true,\"Bool2\":false,\"Null\":null,\"Int\":42,\"String\":\"foo\"}"; +/* taken from the RFC 4627, Examples section */ +static const gchar *nested_object = +"{" + "\"Image\":{" + "\"Width\":800," + "\"Height\":600," + "\"Title\":\"View from 15th Floor\"," + "\"Thumbnail\":{" + "\"Url\":\"http://www.example.com/image/481989943\"," + "\"Height\":125," + "\"Width\":\"100\"" + "}," + "\"IDs\":[116,943,234,38793]" + "}" +"}"; + +static const char *pretty_examples[] = { + "[\n]", + + "{\n}", + + "[\n" + "\ttrue,\n" + "\tfalse,\n" + "\tnull,\n" + "\t\"hello\"\n" + "]", + + "{\n" + "\t\"foo\" : 42,\n" + "\t\"bar\" : true,\n" + "\t\"baz\" : null\n" + "}", +}; + +static const int n_pretty_examples = G_N_ELEMENTS (pretty_examples); + +static const struct { + const gchar *lang; + const gchar *sep; + guint matches : 1; +} decimal_separator[] = { + { "C", ".", TRUE }, + { "de", ",", FALSE }, + { "en", ".", TRUE }, + { "fr", ",", FALSE } +}; + +static void +test_empty_array (void) +{ + JsonGenerator *gen = json_generator_new (); + JsonNode *root; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_ARRAY); + json_node_take_array (root, json_array_new ()); + + json_generator_set_root (gen, root); + g_object_set (gen, "pretty", FALSE, "indent", 0, "indent-char", ' ', NULL); + + data = json_generator_to_data (gen, &len); + + g_assert_cmpint (len, ==, strlen (empty_array)); + g_assert_cmpstr (data, ==, empty_array); + + g_assert (json_generator_get_pretty (gen) == FALSE); + g_assert_cmpint (json_generator_get_indent (gen), ==, 0); + g_assert_cmpint (json_generator_get_indent_char (gen), ==, ' '); + + g_free (data); + json_node_free (root); + g_object_unref (gen); +} + +static void +test_empty_object (void) +{ + JsonGenerator *gen = json_generator_new (); + JsonNode *root; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_OBJECT); + json_node_take_object (root, json_object_new ()); + + json_generator_set_root (gen, root); + g_object_set (gen, "pretty", FALSE, NULL); + + data = json_generator_to_data (gen, &len); + + g_assert_cmpint (len, ==, strlen (empty_object)); + g_assert_cmpstr (data, ==, empty_object); + + g_free (data); + json_node_free (root); + g_object_unref (gen); +} + +static void +test_simple_array (void) +{ + JsonGenerator *generator = json_generator_new (); + JsonNode *root; + JsonArray *array; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_ARRAY); + array = json_array_sized_new (5); + + json_array_add_boolean_element (array, TRUE); + json_array_add_boolean_element (array, FALSE); + json_array_add_null_element (array); + json_array_add_int_element (array, 42); + json_array_add_string_element (array, "foo"); + + json_node_take_array (root, array); + json_generator_set_root (generator, root); + + g_object_set (generator, "pretty", FALSE, NULL); + data = json_generator_to_data (generator, &len); + + if (g_test_verbose ()) + g_print ("checking simple array `%s' (expected: %s)\n", + data, + simple_array); + + g_assert_cmpint (len, ==, strlen (simple_array)); + g_assert_cmpstr (data, ==, simple_array); + + g_free (data); + json_node_free (root); + g_object_unref (generator); +} + +static void +test_nested_array (void) +{ + JsonGenerator *generator = json_generator_new (); + JsonNode *root; + JsonArray *array, *nested; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_ARRAY); + array = json_array_sized_new (3); + + json_array_add_boolean_element (array, TRUE); + + { + nested = json_array_sized_new (2); + + json_array_add_boolean_element (nested, FALSE); + json_array_add_null_element (nested); + + json_array_add_array_element (array, nested); + } + + json_array_add_int_element (array, 42); + + json_node_take_array (root, array); + json_generator_set_root (generator, root); + + g_object_set (generator, "pretty", FALSE, NULL); + data = json_generator_to_data (generator, &len); + + g_assert_cmpint (len, ==, strlen (nested_array)); + g_assert_cmpstr (data, ==, nested_array); + + g_free (data); + json_node_free (root); + g_object_unref (generator); +} + +static void +test_simple_object (void) +{ + JsonGenerator *generator = json_generator_new (); + JsonNode *root; + JsonObject *object; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_OBJECT); + object = json_object_new (); + + json_object_set_boolean_member (object, "Bool1", TRUE); + json_object_set_boolean_member (object, "Bool2", FALSE); + json_object_set_null_member (object, "Null"); + json_object_set_int_member (object, "Int", 42); + json_object_set_string_member (object, "String", "foo"); + + json_node_take_object (root, object); + json_generator_set_root (generator, root); + + g_object_set (generator, "pretty", FALSE, NULL); + data = json_generator_to_data (generator, &len); + + if (g_test_verbose ()) + g_print ("checking simple object `%s' (expected: %s)\n", + data, + simple_object); + + g_assert_cmpint (len, ==, strlen (simple_object)); + g_assert_cmpstr (data, ==, simple_object); + + g_free (data); + json_node_free (root); + g_object_unref (generator); +} + +static void +test_nested_object (void) +{ + JsonGenerator *generator = json_generator_new (); + JsonNode *root; + JsonObject *object, *nested; + JsonArray *array; + gchar *data; + gsize len; + + root = json_node_new (JSON_NODE_OBJECT); + object = json_object_new (); + + json_object_set_int_member (object, "Width", 800); + json_object_set_int_member (object, "Height", 600); + json_object_set_string_member (object, "Title", "View from 15th Floor"); + + { + nested = json_object_new (); + + json_object_set_string_member (nested, "Url", "http://www.example.com/image/481989943"); + json_object_set_int_member (nested, "Height", 125); + json_object_set_string_member (nested, "Width", "100"); + + json_object_set_object_member (object, "Thumbnail", nested); + } + + { + array = json_array_new (); + + json_array_add_int_element (array, 116); + json_array_add_int_element (array, 943); + json_array_add_int_element (array, 234); + json_array_add_int_element (array, 38793); + + json_object_set_array_member (object, "IDs", array); + } + + nested = json_object_new (); + json_object_set_object_member (nested, "Image", object); + + json_node_take_object (root, nested); + json_generator_set_root (generator, root); + + g_object_set (generator, "pretty", FALSE, NULL); + data = json_generator_to_data (generator, &len); + + if (g_test_verbose ()) + g_print ("checking nested object `%s' (expected: %s)\n", + data, + nested_object); + + g_assert_cmpint (len, ==, strlen (nested_object)); + g_assert_cmpstr (data, ==, nested_object); + + g_free (data); + json_node_free (root); + g_object_unref (generator); +} + +static void +test_decimal_separator (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + JsonGenerator *generator = json_generator_new (); + gchar *old_locale; + gint i; + + json_node_set_double (node, 3.14); + + json_generator_set_root (generator, node); + + old_locale = setlocale (LC_NUMERIC, NULL); + + for (i = 0; i < G_N_ELEMENTS (decimal_separator); i++) + { + gchar *str, *expected; + + setlocale (LC_NUMERIC, decimal_separator[i].lang); + + str = json_generator_to_data (generator, NULL); + + if (g_test_verbose ()) + g_print ("%s: value: %.2f - string: '%s'\n", + G_STRFUNC, + json_node_get_double (node), + str); + + g_assert (str != NULL); + expected = strstr (str, decimal_separator[i].sep); + if (decimal_separator[i].matches) + g_assert (expected != NULL); + else + g_assert (expected == NULL); + + g_free (str); + } + + setlocale (LC_NUMERIC, old_locale); + + g_object_unref (generator); + json_node_free (node); +} + +static void +test_pretty (void) +{ + JsonParser *parser = json_parser_new (); + JsonGenerator *generator = json_generator_new (); + int i; + + json_generator_set_pretty (generator, TRUE); + json_generator_set_indent (generator, 1); + json_generator_set_indent_char (generator, '\t'); + + for (i = 0; i < n_pretty_examples; i++) + { + JsonNode *root; + char *data; + gsize len; + + g_assert (json_parser_load_from_data (parser, pretty_examples[i], -1, NULL)); + + root = json_parser_get_root (parser); + g_assert (root != NULL); + + json_generator_set_root (generator, root); + + data = json_generator_to_data (generator, &len); + + if (g_test_verbose ()) + g_print ("** checking pretty printing:\n%s\n** expected:\n%s\n", + data, + pretty_examples[i]); + + g_assert_cmpint (len, ==, strlen (pretty_examples[i])); + g_assert_cmpstr (data, ==, pretty_examples[i]); + + g_free (data); + } + + g_object_unref (generator); + g_object_unref (parser); +} + +typedef struct { + const gchar *str; + const gchar *expect; +} FixtureString; + +static const FixtureString string_fixtures[] = { + { "abc", "\"abc\"" }, + { "a\x7fxc", "\"a\\u007fxc\"" }, + { "a\033xc", "\"a\\u001bxc\"" }, + { "a\nxc", "\"a\\nxc\"" }, + { "a\\xc", "\"a\\\\xc\"" }, + { "Barney B\303\244r", "\"Barney B\303\244r\"" }, +}; + +static void +test_string_encode (gconstpointer data) +{ + const FixtureString *fixture = data; + JsonGenerator *generator = json_generator_new (); + JsonNode *node; + gsize length; + gchar *output; + + node = json_node_init_string (json_node_alloc (), fixture->str);\ + json_generator_set_root (generator, node); + + output = json_generator_to_data (generator, &length); + g_assert_cmpstr (output, ==, fixture->expect); + g_assert_cmpuint (length, ==, strlen (fixture->expect)); + g_free (output); + json_node_free (node); + + g_object_unref (generator); +} +int +main (int argc, + char *argv[]) +{ + gchar *escaped; + gchar *name; + gint i; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/generator/empty-array", test_empty_array); + g_test_add_func ("/generator/empty-object", test_empty_object); + g_test_add_func ("/generator/simple-array", test_simple_array); + g_test_add_func ("/generator/nested-array", test_nested_array); + g_test_add_func ("/generator/simple-object", test_simple_object); + g_test_add_func ("/generator/nested-object", test_nested_object); + g_test_add_func ("/generator/decimal-separator", test_decimal_separator); + g_test_add_func ("/generator/pretty", test_pretty); + + for (i = 0; i < G_N_ELEMENTS (string_fixtures); i++) + { + escaped = g_strescape (string_fixtures[i].str, NULL); + name = g_strdup_printf ("/generator/string/%s", escaped); + g_test_add_data_func (name, string_fixtures + i, test_string_encode); + g_free (escaped); + g_free (name); + } + + return g_test_run (); +} diff --git a/json-glib/tests/gvariant.c b/json-glib/tests/gvariant.c new file mode 100644 index 0000000..38c56b7 --- /dev/null +++ b/json-glib/tests/gvariant.c @@ -0,0 +1,255 @@ +#include +#include +#include + +typedef struct +{ + gchar *test_name; + gchar *signature; + gchar *variant_data; + gchar *json_data; +} TestCase; + +/* each entry in this list spawns to a GVariant-to-JSON and + JSON-to-GVariant test */ +static const TestCase two_way_test_cases[] = + { + /* boolean */ + { "/boolean", "(b)", "(true,)", "[true]" }, + + /* byte */ + { "/byte", "(y)", "(byte 0xff,)", "[255]" }, + + /* int16 */ + { "/int16", "(n)", "(int16 -12345,)", "[-12345]" }, + + /* uint16 */ + { "/uint16", "(q)", "(uint16 40001,)", "[40001]" }, + + /* int32 */ + { "/int32", "(i)", "(-7654321,)", "[-7654321]" }, + + /* uint32 */ + { "/uint32", "(u)", "(uint32 12345678,)", "[12345678]" }, + + /* int64 */ + { "/int64", "(x)", "(int64 -666999666999,)", "[-666999666999]" }, + + /* uint64 */ + { "/uint64", "(t)", "(uint64 1999999999999999,)", "[1999999999999999]" }, + + /* handle */ + { "/handle", "(h)", "(handle 1,)", "[1]" }, + + /* double */ + { "/double", "(d)", "(1.23,)", "[1.23]" }, + + /* string */ + { "/string", "(s)", "('hello world!',)", "[\"hello world!\"]" }, + + /* object-path */ + { "/object-path", "(o)", "(objectpath '/org/gtk/json_glib',)", "[\"/org/gtk/json_glib\"]" }, + + /* signature */ + { "/signature", "(g)", "(signature '(asna{sv}i)',)", "[\"(asna{sv}i)\"]" }, + + /* maybe - null string */ + { "/maybe/simple/null", "(ms)", "(@ms nothing,)", "[null]" }, + + /* maybe - simple string */ + { "/maybe/simple/string", "(ms)", "(@ms 'maybe string',)", "[\"maybe string\"]" }, + + /* maybe - null container */ + { "/maybe/container/null", "(m(sn))", "(@m(sn) nothing,)", "[null]" }, + + /* maybe - tuple container */ + { "/maybe/container/tuple", "(m(sn))", "(@m(sn) ('foo', 0),)", "[[\"foo\",0]]" }, + + /* maybe - variant boolean */ + { "/maybe/variant/boolean", "(mv)", "(@mv ,)", "[true]" }, + + /* empty array */ + { "/array/empty", "as", "@as []", "[]" }, + + /* array of bytes */ + { "/array/byte", "ay", "[byte 0x01, 0x0a, 0x03, 0xff]", "[1,10,3,255]" }, + + /* array of strings */ + { "/array/string", "as", "['a', 'b', 'ab', 'ba']", "[\"a\",\"b\",\"ab\",\"ba\"]" }, + + /* array of array of int32 */ + { "/array/array/int32", "aai", "[[1, 2], [3, 4], [5, 6]]", "[[1,2],[3,4],[5,6]]" }, + + /* array of variants */ + { "/array/variant", "av", "[, , <'oops'>, , <0.5>]", "[true,1,\"oops\",-2,0.5]" }, + + /* tuple */ + { "/tuple", "(bynqiuxthds)", + "(false, byte 0x00, int16 -1, uint16 1, -2, uint32 2, int64 429496729, uint64 3, handle 16, 2.48, 'end')", + "[false,0,-1,1,-2,2,429496729,3,16,2.48,\"end\"]" }, + + /* empty dictionary */ + { "/dictionary/empty", "a{sv}", "@a{sv} {}", "{}" }, + + /* single dictionary entry */ + { "/dictionary/single-entry", "{ss}", "{'hello', 'world'}", "{\"hello\":\"world\"}" }, + + /* dictionary - string : int32 */ + { "/dictionary/string-int32", "a{si}", "{'foo': 1, 'bar': 2}", "{\"foo\":1,\"bar\":2}" }, + + /* dictionary - string : variant */ + { "/dictionary/string-variant", "a{sv}", "{'str': <'hi!'>, 'bool': }", "{\"str\":\"hi!\",\"bool\":true}" }, + + /* dictionary - int64 : variant */ + { "/dictionary/int64-variant", "a{xv}", + "{int64 -5: <'minus five'>, 10: <'ten'>}", "{\"-5\":\"minus five\",\"10\":\"ten\"}" }, + + /* dictionary - uint64 : variant */ + { "/dictionary/uint64-boolean", "a{tb}", + "{uint64 999888777666: true, 0: false}", "{\"999888777666\":true,\"0\":false}" }, + + /* dictionary - boolean : variant */ + { "/dictionary/boolean-variant", "a{by}", "{true: byte 0x01, false: 0x00}", "{\"true\":1,\"false\":0}" }, + + /* dictionary - double : string */ + { "/dictionary/double-string", "a{ds}", "{1.0: 'one point zero'}", "{\"1.000000\":\"one point zero\"}" }, + + /* variant - string */ + { "/variant/string", "(v)", "(<'string within variant'>,)", "[\"string within variant\"]" }, + + /* variant - maybe null */ + { "/variant/maybe/null", "(v)", "(<@mv nothing>,)", "[null]" }, + + /* variant - dictionary */ + { "/variant/dictionary", "v", "<{'foo': <'bar'>, 'hi': }>", "{\"foo\":\"bar\",\"hi\":1024}" }, + + /* variant - variant - array */ + { "/variant/variant/array", "v", "<[<'any'>, <'thing'>, , ]>", "[\"any\",\"thing\",0,-1]" }, + + /* deep-nesting */ + { "/deep-nesting", + "a(a(a(a(a(a(a(a(a(a(s))))))))))", + "[([([([([([([([([([('sorprise',)],)],)],)],)],)],)],)],)],)]", + "[[[[[[[[[[[[[[[[[[[[\"sorprise\"]]]]]]]]]]]]]]]]]]]]" }, + + /* mixed1 */ + { "/mixed1", + "a{s(syba(od))}", + "{'foo': ('bar', byte 0x64, true, [(objectpath '/baz', 1.3), ('/cat', -2.5)])}", + "{\"foo\":[\"bar\",100,true,[[\"/baz\",1.3],[\"/cat\",-2.5]]]}" }, + + /* mixed2 */ + { "/mixed2", + "(a{by}amsvmaba{qm(sg)})", + "({true: byte 0x01, false: 0x00}, [@ms 'do', nothing, 'did'], <@av []>, @mab nothing, {uint16 10000: @m(sg) ('yes', 'august'), 0: nothing})", + "[{\"true\":1,\"false\":0},[\"do\",null,\"did\"],[],null,{\"10000\":[\"yes\",\"august\"],\"0\":null}]" }, + }; + +static const TestCase json_to_gvariant_test_cases[] = + { + { "/string-to-boolean", "(b)", "(true,)", "[\"true\"]" }, + { "/string-to-byte", "(y)", "(byte 0xff,)", "[\"255\"]" }, + { "/string-to-int16", "(n)", "(int16 -12345,)", "[\"-12345\"]" }, + { "/string-to-uint16", "(q)", "(uint16 40001,)", "[\"40001\"]" }, + { "/string-to-int32", "(i)", "(-7654321,)", "[\"-7654321\"]" }, + { "/string-to-int64", "(x)", "(int64 -666999666999,)", "[\"-666999666999\"]" }, + { "/string-to-uint64", "(t)", "(uint64 1999999999999999,)", "[\"1999999999999999\"]" }, + { "/string-to-double", "(d)", "(1.23,)", "[\"1.23\"]" }, + }; + +static void +test_gvariant_to_json (gconstpointer test_data) +{ + TestCase *test_case = (TestCase *) test_data; + GVariant *variant; + gchar *json_data; + gsize len; + + variant = g_variant_parse (G_VARIANT_TYPE (test_case->signature), + test_case->variant_data, + NULL, + NULL, + NULL); + + json_data = json_gvariant_serialize_data (variant, &len); + g_assert (json_data != NULL); + + g_assert_cmpstr (test_case->json_data, ==, json_data); + + g_free (json_data); + g_variant_unref (variant); +} + +static void +test_json_to_gvariant (gconstpointer test_data) +{ + TestCase *test_case = (TestCase *) test_data; + GVariant *variant; + gchar *variant_data; + GError *error = NULL; + + variant = json_gvariant_deserialize_data (test_case->json_data, + -1, + test_case->signature, + &error); + + if (variant == NULL) + { + g_assert_no_error (error); + g_error_free (error); + } + else + { + variant_data = g_variant_print (variant, TRUE); + + g_assert_cmpstr (test_case->variant_data, ==, variant_data); + + g_free (variant_data); + g_variant_unref (variant); + } +} + +gint +main (gint argc, gchar *argv[]) +{ + gint i; + TestCase test_case; + gchar *test_name; + + g_test_init (&argc, &argv, NULL); + + /* GVariant to JSON */ + for (i = 0; i < G_N_ELEMENTS (two_way_test_cases); i++) + { + test_case = two_way_test_cases[i]; + test_name = g_strdup_printf ("/gvariant/to-json/%s", test_case.test_name); + + g_test_add_data_func (test_name, &two_way_test_cases[i], test_gvariant_to_json); + + g_free (test_name); + } + + /* JSON to GVariant */ + for (i = 0; i < G_N_ELEMENTS (two_way_test_cases); i++) + { + test_case = two_way_test_cases[i]; + test_name = g_strdup_printf ("/gvariant/from-json/%s", test_case.test_name); + + g_test_add_data_func (test_name, &two_way_test_cases[i], test_json_to_gvariant); + + g_free (test_name); + } + + /* JSON to GVariant one way tests */ + for (i = 0; i < G_N_ELEMENTS (json_to_gvariant_test_cases); i++) + { + test_case = json_to_gvariant_test_cases[i]; + test_name = g_strdup_printf ("/gvariant/from-json/%s", test_case.test_name); + + g_test_add_data_func (test_name, &json_to_gvariant_test_cases[i], test_json_to_gvariant); + + g_free (test_name); + } + + return g_test_run (); +} diff --git a/json-glib/tests/invalid.c b/json-glib/tests/invalid.c new file mode 100644 index 0000000..bac540f --- /dev/null +++ b/json-glib/tests/invalid.c @@ -0,0 +1,237 @@ +#include "config.h" + +#include +#include + +#include + +#include + +static void +test_invalid_bareword (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert_error (error, JSON_PARSER_ERROR, JSON_PARSER_ERROR_INVALID_BAREWORD); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static void +test_invalid_assignment (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert (error != NULL); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static void +test_invalid_value (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert (error != NULL); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static void +test_invalid_array (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert (error != NULL); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static void +test_invalid_object (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert (error != NULL); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static void +test_trailing_comma (gconstpointer user_data) +{ + const char *json = user_data; + GError *error = NULL; + JsonParser *parser; + gboolean res; + + parser = json_parser_new (); + g_assert (JSON_IS_PARSER (parser)); + + if (g_test_verbose ()) + g_print ("invalid data: '%s'...", json); + + res = json_parser_load_from_data (parser, json, -1, &error); + + g_assert (!res); + g_assert_error (error, JSON_PARSER_ERROR, JSON_PARSER_ERROR_TRAILING_COMMA); + + if (g_test_verbose ()) + g_print ("expected error: %s\n", error->message); + + g_clear_error (&error); + + g_object_unref (parser); +} + +static const struct +{ + const char *path; + const char *json; + gpointer func; +} test_invalid[] = { + /* bareword */ + { "bareword-1", "rainbows", test_invalid_bareword }, + { "bareword-2", "[ unicorns ]", test_invalid_bareword }, + { "bareword-3", "{ \"foo\" : ponies }", test_invalid_bareword }, + { "bareword-4", "[ 3, 2, 1, lift_off ]", test_invalid_bareword }, + { "bareword-5", "{ foo : 42 }", test_invalid_bareword }, + + /* values */ + { "values-1", "[ -false ]", test_invalid_value }, + + /* assignment */ + { "assignment-1", "var foo", test_invalid_assignment }, + { "assignment-2", "var foo = no", test_invalid_assignment }, + { "assignment-3", "var = true", test_invalid_assignment }, + { "assignment-4", "var blah = 42:", test_invalid_assignment }, + { "assignment-5", "let foo = true;", test_invalid_assignment }, + + /* arrays */ + { "array-1", "[ true, false", test_invalid_array }, + { "array-2", "[ true }", test_invalid_array }, + { "array-3", "[ \"foo\" : 42 ]", test_invalid_array }, + + /* objects */ + { "object-1", "{ foo : 42 }", test_invalid_object }, + { "object-2", "{ 42 : \"foo\" }", test_invalid_object }, + { "object-3", "{ \"foo\", 42 }", test_invalid_object }, + { "object-4", "{ \"foo\" : 42 ]", test_invalid_object }, + { "object-5", "{ \"blah\" }", test_invalid_object }, + { "object-6", "{ \"a\" : 0 \"b\" : 1 }", test_invalid_object }, + { "object-7", "{ \"\" : false }", test_invalid_object }, + + /* trailing commas */ + { "trailing-comma-1", "[ true, ]", test_trailing_comma }, + { "trailing-comma-2", "{ \"foo\" : 42, }", test_trailing_comma }, +}; + +static guint n_test_invalid = G_N_ELEMENTS (test_invalid); + +int +main (int argc, + char *argv[]) +{ + int i; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < n_test_invalid; i++) + { + char *test_path = g_strconcat ("/invalid/json/", test_invalid[i].path, NULL); + + g_test_add_data_func_full (test_path, + (gpointer) test_invalid[i].json, + test_invalid[i].func, + NULL); + + g_free (test_path); + } + + return g_test_run (); +} diff --git a/json-glib/tests/node-test.c b/json-glib/tests/node-test.c deleted file mode 100644 index b5ba722..0000000 --- a/json-glib/tests/node-test.c +++ /dev/null @@ -1,119 +0,0 @@ - -#include -#include - -#if !GLIB_CHECK_VERSION (2, 31, 0) -#include -#else -#include -#endif - - -static void -test_copy_null (void) -{ - JsonNode *node = json_node_new (JSON_NODE_NULL); - JsonNode *copy = json_node_copy (node); - - g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); - g_assert_cmpint (json_node_get_value_type (node), ==, json_node_get_value_type (copy)); - g_assert_cmpstr (json_node_type_name (node), ==, json_node_type_name (copy)); - - json_node_free (copy); - json_node_free (node); -} - -static void -test_copy_value (void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - JsonNode *copy; - - json_node_set_string (node, "hello"); - - copy = json_node_copy (node); - g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); - g_assert_cmpstr (json_node_type_name (node), ==, json_node_type_name (copy)); - g_assert_cmpstr (json_node_get_string (node), ==, json_node_get_string (copy)); - - json_node_free (copy); - json_node_free (node); -} - -static void -test_copy_object (void) -{ - JsonObject *obj = json_object_new (); - JsonNode *node = json_node_new (JSON_NODE_OBJECT); - JsonNode *value = json_node_new (JSON_NODE_VALUE); - JsonNode *copy; - - json_node_set_int (value, 42); - json_object_set_member (obj, "answer", value); - - json_node_take_object (node, obj); - - copy = json_node_copy (node); - - g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); - g_assert (json_node_get_object (node) == json_node_get_object (copy)); - - json_node_free (copy); - json_node_free (node); -} - -static void -test_null (void) -{ - JsonNode *node = json_node_new (JSON_NODE_NULL); - - g_assert (JSON_NODE_HOLDS_NULL (node)); - g_assert_cmpint (json_node_get_value_type (node), ==, G_TYPE_INVALID); - g_assert_cmpstr (json_node_type_name (node), ==, "NULL"); - - json_node_free (node); -} - -static void -test_value (void) -{ - JsonNode *node = json_node_new (JSON_NODE_VALUE); - GValue value = { 0, }; - GValue check = { 0, }; - - g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_VALUE); - - g_value_init (&value, G_TYPE_INT64); - g_value_set_int64 (&value, 42); - - g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_TYPE_INT64); - g_assert_cmpint (g_value_get_int64 (&value), ==, 42); - - json_node_set_value (node, &value); - json_node_get_value (node, &check); - - g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_VALUE_TYPE (&check)); - g_assert_cmpint (g_value_get_int64 (&value), ==, g_value_get_int64 (&check)); - g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_INT64); - g_assert_cmpint (g_value_get_int64 (&check), ==, 42); - - g_value_unset (&value); - g_value_unset (&check); - json_node_free (node); -} - -int -main (int argc, - char *argv[]) -{ - g_type_init (); - g_test_init (&argc, &argv, NULL); - - g_test_add_func ("/nodes/null-node", test_null); - g_test_add_func ("/nodes/copy-null", test_copy_null); - g_test_add_func ("/nodes/copy-value", test_copy_value); - g_test_add_func ("/nodes/copy-object", test_copy_object); - g_test_add_func ("/nodes/value", test_value); - - return g_test_run (); -} diff --git a/json-glib/tests/node.c b/json-glib/tests/node.c new file mode 100644 index 0000000..6aad5bc --- /dev/null +++ b/json-glib/tests/node.c @@ -0,0 +1,265 @@ +#include +#include +#include + +static void +test_init_int (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_int (node, 42); + g_assert_cmpint (json_node_get_int (node), ==, 42); + + json_node_free (node); +} + +static void +test_init_double (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_double (node, 3.14159); + g_assert_cmpfloat (json_node_get_double (node), ==, 3.14159); + + json_node_free (node); +} + +static void +test_init_boolean (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_boolean (node, TRUE); + g_assert (json_node_get_boolean (node)); + + json_node_free (node); +} + +static void +test_init_string (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_string (node, "Hello, World"); + g_assert_cmpstr (json_node_get_string (node), ==, "Hello, World"); + + json_node_free (node); +} + +static void +test_copy_null (void) +{ + JsonNode *node = json_node_new (JSON_NODE_NULL); + JsonNode *copy = json_node_copy (node); + + g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); + g_assert_cmpint (json_node_get_value_type (node), ==, json_node_get_value_type (copy)); + g_assert_cmpstr (json_node_type_name (node), ==, json_node_type_name (copy)); + + json_node_free (copy); + json_node_free (node); +} + +static void +test_copy_value (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + JsonNode *copy; + + json_node_set_string (node, "hello"); + + copy = json_node_copy (node); + g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); + g_assert_cmpstr (json_node_type_name (node), ==, json_node_type_name (copy)); + g_assert_cmpstr (json_node_get_string (node), ==, json_node_get_string (copy)); + + json_node_free (copy); + json_node_free (node); +} + +static void +test_copy_object (void) +{ + JsonObject *obj = json_object_new (); + JsonNode *node = json_node_new (JSON_NODE_OBJECT); + JsonNode *value = json_node_new (JSON_NODE_VALUE); + JsonNode *copy; + + json_node_set_int (value, 42); + json_object_set_member (obj, "answer", value); + + json_node_take_object (node, obj); + + copy = json_node_copy (node); + + g_assert_cmpint (json_node_get_node_type (node), ==, json_node_get_node_type (copy)); + g_assert (json_node_get_object (node) == json_node_get_object (copy)); + + json_node_free (copy); + json_node_free (node); +} + +static void +test_null (void) +{ + JsonNode *node = json_node_new (JSON_NODE_NULL); + + g_assert (JSON_NODE_HOLDS_NULL (node)); + g_assert (json_node_is_null (node)); + g_assert_cmpint (json_node_get_value_type (node), ==, G_TYPE_INVALID); + g_assert_cmpstr (json_node_type_name (node), ==, "NULL"); + + json_node_free (node); +} + +static void +test_get_int (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_int (node, 0); + g_assert_cmpint (json_node_get_int (node), ==, 0); + g_assert_cmpfloat (json_node_get_double (node), ==, 0.0); + g_assert (!json_node_get_boolean (node)); + g_assert (!json_node_is_null (node)); + + json_node_set_int (node, 42); + g_assert_cmpint (json_node_get_int (node), ==, 42); + g_assert_cmpfloat (json_node_get_double (node), ==, 42.0); + g_assert (json_node_get_boolean (node)); + g_assert (!json_node_is_null (node)); + + json_node_free (node); +} + +static void +test_get_double (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + + json_node_set_double (node, 3.14); + g_assert_cmpfloat (json_node_get_double (node), ==, 3.14); + g_assert_cmpint (json_node_get_int (node), ==, 3); + g_assert (json_node_get_boolean (node)); + + json_node_free (node); +} + +static void +test_gvalue (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + GValue value = { 0, }; + GValue check = { 0, }; + + g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_VALUE); + + g_value_init (&value, G_TYPE_INT64); + g_value_set_int64 (&value, 42); + + g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_TYPE_INT64); + g_assert_cmpint (g_value_get_int64 (&value), ==, 42); + + json_node_set_value (node, &value); + json_node_get_value (node, &check); + + g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_VALUE_TYPE (&check)); + g_assert_cmpint (g_value_get_int64 (&value), ==, g_value_get_int64 (&check)); + g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_INT64); + g_assert_cmpint (g_value_get_int64 (&check), ==, 42); + + g_value_unset (&value); + g_value_unset (&check); + + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, "Hello, World!"); + + g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_TYPE_STRING); + g_assert_cmpstr (g_value_get_string (&value), ==, "Hello, World!"); + + json_node_set_value (node, &value); + json_node_get_value (node, &check); + + g_assert_cmpint (G_VALUE_TYPE (&value), ==, G_VALUE_TYPE (&check)); + g_assert_cmpstr (g_value_get_string (&value), ==, g_value_get_string (&check)); + g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_STRING); + g_assert_cmpstr (g_value_get_string (&check), ==, "Hello, World!"); + + g_value_unset (&value); + g_value_unset (&check); + json_node_free (node); +} + +static void +test_gvalue_autopromotion (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + GValue value = { 0, }; + GValue check = { 0, }; + + g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_VALUE); + + if (g_test_verbose ()) + g_print ("Autopromotion of int to int64\n"); + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, 42); + + json_node_set_value (node, &value); + json_node_get_value (node, &check); + + if (g_test_verbose ()) + g_print ("Expecting an gint64, got a %s\n", g_type_name (G_VALUE_TYPE (&check))); + + g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_INT64); + g_assert_cmpint (g_value_get_int64 (&check), ==, 42); + g_assert_cmpint (G_VALUE_TYPE (&value), !=, G_VALUE_TYPE (&check)); + g_assert_cmpint ((gint64) g_value_get_int (&value), ==, g_value_get_int64 (&check)); + + g_value_unset (&value); + g_value_unset (&check); + + if (g_test_verbose ()) + g_print ("Autopromotion of float to double\n"); + + g_value_init (&value, G_TYPE_FLOAT); + g_value_set_float (&value, 3.14159f); + + json_node_set_value (node, &value); + json_node_get_value (node, &check); + + if (g_test_verbose ()) + g_print ("Expecting a gdouble, got a %s\n", g_type_name (G_VALUE_TYPE (&check))); + + g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_DOUBLE); + g_assert_cmpfloat ((float) g_value_get_double (&check), ==, 3.14159f); + g_assert_cmpint (G_VALUE_TYPE (&value), !=, G_VALUE_TYPE (&check)); + g_assert_cmpfloat ((gdouble) g_value_get_float (&value), ==, g_value_get_double (&check)); + + g_value_unset (&value); + g_value_unset (&check); + + json_node_free (node); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/nodes/init/int", test_init_int); + g_test_add_func ("/nodes/init/double", test_init_double); + g_test_add_func ("/nodes/init/boolean", test_init_boolean); + g_test_add_func ("/nodes/init/string", test_init_string); + g_test_add_func ("/nodes/init/null", test_null); + g_test_add_func ("/nodes/copy/null", test_copy_null); + g_test_add_func ("/nodes/copy/value", test_copy_value); + g_test_add_func ("/nodes/copy/object", test_copy_object); + g_test_add_func ("/nodes/get/int", test_get_int); + g_test_add_func ("/nodes/get/double", test_get_double); + g_test_add_func ("/nodes/gvalue", test_gvalue); + g_test_add_func ("/nodes/gvalue/autopromotion", test_gvalue_autopromotion); + + return g_test_run (); +} diff --git a/json-glib/tests/object-test.c b/json-glib/tests/object.c similarity index 64% rename from json-glib/tests/object-test.c rename to json-glib/tests/object.c index 3d7b4d1..f109464 100644 --- a/json-glib/tests/object-test.c +++ b/json-glib/tests/object.c @@ -34,6 +34,40 @@ test_add_member (void) } static void +test_set_member (void) +{ + JsonNode *node = json_node_new (JSON_NODE_VALUE); + JsonObject *object = json_object_new (); + + g_assert_cmpint (json_object_get_size (object), ==, 0); + + json_node_set_string (node, "Hello"); + + json_object_set_member (object, "String", node); + g_assert_cmpint (json_object_get_size (object), ==, 1); + + node = json_object_get_member (object, "String"); + g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_VALUE); + g_assert_cmpstr (json_node_get_string (node), ==, "Hello"); + + json_object_set_string_member (object, "String", "World"); + node = json_object_get_member (object, "String"); + g_assert_cmpint (JSON_NODE_TYPE (node), ==, JSON_NODE_VALUE); + g_assert_cmpstr (json_node_get_string (node), ==, "World"); + + json_object_set_string_member (object, "String", "Goodbye"); + g_assert_cmpstr (json_object_get_string_member (object, "String"), ==, "Goodbye"); + + json_object_set_array_member (object, "Array", NULL); + g_assert_cmpint (JSON_NODE_TYPE (json_object_get_member (object, "Array")), ==, JSON_NODE_NULL); + + json_object_set_object_member (object, "Object", NULL); + g_assert (json_object_get_null_member (object, "Object") == TRUE); + + json_object_unref (object); +} + +static void test_remove_member (void) { JsonObject *object = json_object_new (); @@ -60,6 +94,7 @@ static const struct { { "integer", JSON_NODE_VALUE, G_TYPE_INT64 }, { "boolean", JSON_NODE_VALUE, G_TYPE_BOOLEAN }, { "string", JSON_NODE_VALUE, G_TYPE_STRING }, + { "double", JSON_NODE_VALUE, G_TYPE_DOUBLE }, { "null", JSON_NODE_NULL, G_TYPE_INVALID } }; @@ -94,6 +129,7 @@ test_foreach_member (void) json_object_set_int_member (object, "integer", 42); json_object_set_boolean_member (object, "boolean", TRUE); json_object_set_string_member (object, "string", "hello"); + json_object_set_double_member (object, "double", 3.14159); json_object_set_null_member (object, "null"); json_object_foreach_member (object, verify_foreach, &fixture); @@ -112,6 +148,17 @@ test_empty_member (void) g_assert (json_object_has_member (object, "string")); g_assert_cmpstr (json_object_get_string_member (object, "string"), ==, ""); + json_object_set_string_member (object, "null", NULL); + g_assert (json_object_has_member (object, "null")); + g_assert (json_object_get_string_member (object, "null") == NULL); + + json_object_set_null_member (object, "array"); + g_assert (json_object_get_array_member (object, "array") == NULL); + + json_object_set_object_member (object, "object", NULL); + g_assert (json_object_get_member (object, "object") != NULL); + g_assert (json_object_get_object_member (object, "object") == NULL); + json_object_unref (object); } @@ -119,11 +166,11 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/object/empty-object", test_empty_object); g_test_add_func ("/object/add-member", test_add_member); + g_test_add_func ("/object/set-member", test_set_member); g_test_add_func ("/object/remove-member", test_remove_member); g_test_add_func ("/object/foreach-member", test_foreach_member); g_test_add_func ("/object/empty-member", test_empty_member); diff --git a/tests/test-parser.c b/json-glib/tests/parser.c similarity index 83% rename from tests/test-parser.c rename to json-glib/tests/parser.c index ffda63a..bdfbf13 100644 --- a/tests/test-parser.c +++ b/json-glib/tests/parser.c @@ -1,6 +1,4 @@ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include @@ -20,6 +18,12 @@ verify_int_value (JsonNode *node) } static void +verify_negative_int_value (JsonNode *node) +{ + g_assert_cmpint (-1, ==, json_node_get_int (node)); +} + +static void verify_boolean_value (JsonNode *node) { g_assert_cmpint (TRUE, ==, json_node_get_boolean (node)); @@ -37,6 +41,12 @@ verify_double_value (JsonNode *node) g_assert_cmpfloat (10.2e3, ==, json_node_get_double (node)); } +static void +verify_negative_double_value (JsonNode *node) +{ + g_assert_cmpfloat (-3.14, ==, json_node_get_double (node)); +} + static const struct { const gchar *str; JsonNodeType type; @@ -47,7 +57,9 @@ static const struct { { "42", JSON_NODE_VALUE, G_TYPE_INT64, verify_int_value }, { "true", JSON_NODE_VALUE, G_TYPE_BOOLEAN, verify_boolean_value }, { "\"string\"", JSON_NODE_VALUE, G_TYPE_STRING, verify_string_value }, - { "10.2e3", JSON_NODE_VALUE, G_TYPE_DOUBLE, verify_double_value } + { "10.2e3", JSON_NODE_VALUE, G_TYPE_DOUBLE, verify_double_value }, + { "-1", JSON_NODE_VALUE, G_TYPE_INT64, verify_negative_int_value }, + { "-3.14", JSON_NODE_VALUE, G_TYPE_DOUBLE, verify_negative_double_value }, }; static const struct { @@ -83,11 +95,31 @@ static const struct { { "{ \"test\" : 42 }", 1, "test", JSON_NODE_VALUE, G_TYPE_INT64 }, { "{ \"name\" : \"\", \"state\" : 1 }", 2, "name", JSON_NODE_VALUE, G_TYPE_STRING }, { "{ \"foo\" : \"bar\", \"baz\" : null }", 2, "baz", JSON_NODE_NULL, G_TYPE_INVALID }, - { "{ \"channel\" : \"/meta/connect\" }", 1, "channel", JSON_NODE_VALUE, G_TYPE_STRING } + { "{ \"channel\" : \"/meta/connect\" }", 1, "channel", JSON_NODE_VALUE, G_TYPE_STRING }, + { "{ \"halign\":0.5, \"valign\":0.5 }", 2, "valign", JSON_NODE_VALUE, G_TYPE_DOUBLE } }; static const gchar *test_nested_objects[] = { - "{ \"array\" : [ false, \"foo\" ], \"object\" : { \"foo\" : true } }" + "{ \"array\" : [ false, \"foo\" ], \"object\" : { \"foo\" : true } }", + "{ " + "\"type\" : \"ClutterGroup\", " + "\"width\" : 1, " + "\"children\" : [ " + "{ " + "\"type\" : \"ClutterRectangle\", " + "\"children\" : [ " + "{ \"type\" : \"ClutterText\", \"text\" : \"hello there\" }" + "] " + "}, " + "{ " + "\"type\" : \"ClutterGroup\", " + "\"width\" : 1, " + "\"children\" : [ " + "{ \"type\" : \"ClutterText\", \"text\" : \"hello\" }" + "] " + "} " + "] " + "}" }; static const struct { @@ -108,19 +140,6 @@ static const struct { "{ \"test\" : \"foo \\u00e8\" }", "test", "foo è" } }; -static const struct -{ - const gchar *str; -} test_invalid[] = { - { "test" }, - { "[ foo, ]" }, - { "[ true, ]" }, - { "{ \"foo\" : true \"bar\" : false }" }, - { "[ true, [ false, ] ]" }, - { "{ \"foo\" : { \"bar\" : false, } }" }, - { "[ { }, { }, { }, ]" } -}; - static guint n_test_base_values = G_N_ELEMENTS (test_base_values); static guint n_test_simple_arrays = G_N_ELEMENTS (test_simple_arrays); static guint n_test_nested_arrays = G_N_ELEMENTS (test_nested_arrays); @@ -128,7 +147,6 @@ static guint n_test_simple_objects = G_N_ELEMENTS (test_simple_objects); static guint n_test_nested_objects = G_N_ELEMENTS (test_nested_objects); static guint n_test_assignments = G_N_ELEMENTS (test_assignments); static guint n_test_unicode = G_N_ELEMENTS (test_unicode); -static guint n_test_invalid = G_N_ELEMENTS (test_invalid); static void test_empty (void) @@ -628,46 +646,103 @@ test_unicode_escape (void) } static void -test_invalid_json (void) +test_stream_sync (void) { JsonParser *parser; + GFile *file; + GFileInputStream *stream; GError *error = NULL; - gint i; + JsonNode *root; + JsonArray *array; + char *path; parser = json_parser_new (); - g_assert (JSON_IS_PARSER (parser)); - if (g_test_verbose ()) - g_print ("checking json_parser_load_from_data with invalid data...\n"); + path = g_test_build_filename (G_TEST_DIST, "stream-load.json", NULL); + file = g_file_new_for_path (path); + stream = g_file_read (file, NULL, &error); + g_assert_no_error (error); + g_assert (stream != NULL); - for (i = 0; i < n_test_invalid; i++) - { - gboolean res; + json_parser_load_from_stream (parser, G_INPUT_STREAM (stream), NULL, &error); + g_assert_no_error (error); - if (g_test_verbose ()) - g_print ("Parsing: '%s'\n", test_invalid[i].str); + root = json_parser_get_root (parser); + g_assert (root != NULL); + g_assert (JSON_NODE_HOLDS_ARRAY (root)); + + array = json_node_get_array (root); + g_assert_cmpint (json_array_get_length (array), ==, 1); + g_assert (JSON_NODE_HOLDS_OBJECT (json_array_get_element (array, 0))); + g_assert (json_object_has_member (json_array_get_object_element (array, 0), "hello")); - res = json_parser_load_from_data (parser, test_invalid[i].str, -1, - &error); + g_object_unref (stream); + g_object_unref (file); + g_object_unref (parser); + g_free (path); +} + +static void +on_load_complete (GObject *gobject, + GAsyncResult *result, + gpointer user_data) +{ + JsonParser *parser = JSON_PARSER (gobject); + GMainLoop *main_loop = user_data; + GError *error = NULL; + JsonNode *root; + JsonArray *array; - g_assert (!res); - g_assert (error != NULL); - g_assert (error->domain == JSON_PARSER_ERROR); + json_parser_load_from_stream_finish (parser, result, &error); + g_assert_no_error (error); - if (g_test_verbose ()) - g_print ("Error: %s\n", error->message); + root = json_parser_get_root (parser); + g_assert (root != NULL); + g_assert (JSON_NODE_HOLDS_ARRAY (root)); - g_clear_error (&error); - } + array = json_node_get_array (root); + g_assert_cmpint (json_array_get_length (array), ==, 1); + g_assert (JSON_NODE_HOLDS_OBJECT (json_array_get_element (array, 0))); + g_assert (json_object_has_member (json_array_get_object_element (array, 0), "hello")); + + g_main_loop_quit (main_loop); +} + +static void +test_stream_async (void) +{ + GMainLoop *main_loop; + GError *error = NULL; + JsonParser *parser = json_parser_new (); + GFile *file; + GFileInputStream *stream; + char *path; + + path = g_test_build_filename (G_TEST_DIST, "stream-load.json", NULL); + file = g_file_new_for_path (path); + stream = g_file_read (file, NULL, &error); + g_assert (error == NULL); + g_assert (stream != NULL); + + main_loop = g_main_loop_new (NULL, FALSE); + + json_parser_load_from_stream_async (parser, G_INPUT_STREAM (stream), NULL, + on_load_complete, + main_loop); + + g_main_loop_run (main_loop); + g_main_loop_unref (main_loop); + g_object_unref (stream); + g_object_unref (file); g_object_unref (parser); + g_free (path); } int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/parser/empty-string", test_empty); @@ -680,7 +755,8 @@ main (int argc, g_test_add_func ("/parser/nested-object", test_nested_object); g_test_add_func ("/parser/assignment", test_assignment); g_test_add_func ("/parser/unicode-escape", test_unicode_escape); - g_test_add_func ("/parser/invalid-json", test_invalid_json); + g_test_add_func ("/parser/stream-sync", test_stream_sync); + g_test_add_func ("/parser/stream-async", test_stream_async); return g_test_run (); } diff --git a/json-glib/tests/path.c b/json-glib/tests/path.c new file mode 100644 index 0000000..0dce631 --- /dev/null +++ b/json-glib/tests/path.c @@ -0,0 +1,318 @@ +#include +#include +#include + +static const char *test_json = +"{ \"store\": {" +" \"book\": [ " +" { \"category\": \"reference\"," +" \"author\": \"Nigel Rees\"," +" \"title\": \"Sayings of the Century\"," +" \"price\": \"8.95\"" +" }," +" { \"category\": \"fiction\"," +" \"author\": \"Evelyn Waugh\"," +" \"title\": \"Sword of Honour\"," +" \"price\": \"12.99\"" +" }," +" { \"category\": \"fiction\"," +" \"author\": \"Herman Melville\"," +" \"title\": \"Moby Dick\"," +" \"isbn\": \"0-553-21311-3\"," +" \"price\": \"8.99\"" +" }," +" { \"category\": \"fiction\"," +" \"author\": \"J. R. R. Tolkien\"," +" \"title\": \"The Lord of the Rings\"," +" \"isbn\": \"0-395-19395-8\"," +" \"price\": \"22.99\"" +" }" +" ]," +" \"bicycle\": {" +" \"color\": \"red\"," +" \"price\": \"19.95\"" +" }" +" }" +"}"; + +static const struct { + const char *desc; + const char *expr; + const char *res; + + guint is_valid : 1; + + JsonPathError error_code; +} test_expressions[] = { + { + "INVALID: invalid first character", + "/", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: Invalid character following root", + "$ponies", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: missing member name or wildcard after dot", + "$.store.", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: Malformed slice (missing step)", + "$.store.book[0:1:]", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: Malformed set", + "$.store.book[0,1~2]", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: Malformed array notation", + "${'store'}", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "INVALID: Malformed slice (invalid separator)", + "$.store.book[0~2]", + NULL, + FALSE, + JSON_PATH_ERROR_INVALID_QUERY, + }, + { + "Title of the first book in the store, using objct notation.", + "$.store.book[0].title", + "[\"Sayings of the Century\"]", + TRUE, + }, + { + "Title of the first book in the store, using array notation.", + "$['store']['book'][0]['title']", + "[\"Sayings of the Century\"]", + TRUE, + }, + { + "All the authors from the every book.", + "$.store.book[*].author", + "[\"Nigel Rees\",\"Evelyn Waugh\",\"Herman Melville\",\"J. R. R. Tolkien\"]", + TRUE, + }, + { + "All the authors.", + "$..author", + "[\"Nigel Rees\",\"Evelyn Waugh\",\"Herman Melville\",\"J. R. R. Tolkien\"]", + TRUE, + }, + { + "Everything inside the store.", + "$.store.*", + NULL, + TRUE, + }, + { + "All the prices in the store.", + "$.store..price", + "[\"8.95\",\"12.99\",\"8.99\",\"22.99\",\"19.95\"]", + TRUE, + }, + { + "The third book.", + "$..book[2]", + "[{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":\"8.99\"}]", + TRUE, + }, + { + "The last book.", + "$..book[-1:]", + "[{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":\"22.99\"}]", + TRUE, + }, + { + "The first two books.", + "$..book[0,1]", + "[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":\"8.95\"},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":\"12.99\"}]", + TRUE, + }, + { + "The first two books, using a slice.", + "$..book[:2]", + "[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":\"8.95\"},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":\"12.99\"}]", + TRUE, + }, + { + "All the books.", + "$['store']['book'][*]", + "[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":\"8.95\"},{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":\"12.99\"},{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":\"8.99\"},{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":\"22.99\"}]", + TRUE, + }, + { + "All the members of the bicycle object.", + "$.store.bicycle.*", + "[\"red\",\"19.95\"]", + TRUE, + }, + { + "The root node.", + "$", + "[{\"store\":{\"book\":[{\"category\":\"reference\",\"author\":\"Nigel Rees\",\"title\":\"Sayings of the Century\",\"price\":\"8.95\"}," + "{\"category\":\"fiction\",\"author\":\"Evelyn Waugh\",\"title\":\"Sword of Honour\",\"price\":\"12.99\"}," + "{\"category\":\"fiction\",\"author\":\"Herman Melville\",\"title\":\"Moby Dick\",\"isbn\":\"0-553-21311-3\",\"price\":\"8.99\"}," + "{\"category\":\"fiction\",\"author\":\"J. R. R. Tolkien\",\"title\":\"The Lord of the Rings\",\"isbn\":\"0-395-19395-8\",\"price\":\"22.99\"}]," + "\"bicycle\":{\"color\":\"red\",\"price\":\"19.95\"}}}]", + TRUE, + } +}; + +static void +path_expressions_valid (gconstpointer data) +{ + const int index_ = GPOINTER_TO_INT (data); + const char *expr = test_expressions[index_].expr; + const char *desc = test_expressions[index_].desc; + + JsonPath *path = json_path_new (); + GError *error = NULL; + + if (g_test_verbose ()) + g_print ("* %s ('%s')\n", desc, expr); + + g_assert (json_path_compile (path, expr, &error)); + g_assert_no_error (error); + + g_object_unref (path); +} + +static void +path_expressions_invalid (gconstpointer data) +{ + const int index_ = GPOINTER_TO_INT (data); + const char *expr = test_expressions[index_].expr; + const char *desc = test_expressions[index_].desc; + const JsonPathError code = test_expressions[index_].error_code; + + JsonPath *path = json_path_new (); + GError *error = NULL; + + if (g_test_verbose ()) + g_print ("* %s ('%s')\n", desc, expr); + + + g_assert (!json_path_compile (path, expr, &error)); + g_assert_error (error, JSON_PATH_ERROR, code); + + g_object_unref (path); +} + +static void +path_match (gconstpointer data) +{ + const int index_ = GPOINTER_TO_INT (data); + const char *desc = test_expressions[index_].desc; + const char *expr = test_expressions[index_].expr; + const char *res = test_expressions[index_].res; + + JsonParser *parser = json_parser_new (); + JsonGenerator *gen = json_generator_new (); + JsonPath *path = json_path_new (); + JsonNode *root; + JsonNode *matches; + char *str; + + json_parser_load_from_data (parser, test_json, -1, NULL); + root = json_parser_get_root (parser); + + g_assert (json_path_compile (path, expr, NULL)); + + matches = json_path_match (path, root); + g_assert (JSON_NODE_HOLDS_ARRAY (matches)); + + json_generator_set_root (gen, matches); + str = json_generator_to_data (gen, NULL); + + if (g_test_verbose ()) + { + g_print ("* %s ('%s') =>\n" + "- result: %s\n" + "- expected: %s\n", + desc, expr, + str, + res); + } + + g_assert_cmpstr (str, ==, res); + + g_free (str); + json_node_free (matches); + + g_object_unref (parser); + g_object_unref (path); + g_object_unref (gen); +} + +int +main (int argc, + char *argv[]) +{ + int i, j; + + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id="); + + for (i = 0, j = 1; i < G_N_ELEMENTS (test_expressions); i++) + { + char *path; + + if (!test_expressions[i].is_valid) + continue; + + path = g_strdup_printf ("/path/expressions/valid/%d", j++); + + g_test_add_data_func (path, GINT_TO_POINTER (i), path_expressions_valid); + + g_free (path); + } + + for (i = 0, j = 1; i < G_N_ELEMENTS (test_expressions); i++) + { + char *path; + + if (test_expressions[i].is_valid) + continue; + + path = g_strdup_printf ("/path/expressions/invalid/%d", j++); + + g_test_add_data_func (path, GINT_TO_POINTER (i), path_expressions_invalid); + + g_free (path); + } + + for (i = 0, j = 1; i < G_N_ELEMENTS (test_expressions); i++) + { + char *path; + + if (!test_expressions[i].is_valid || test_expressions[i].res == NULL) + continue; + + path = g_strdup_printf ("/path/match/%d", j++); + + g_test_add_data_func (path, GINT_TO_POINTER (i), path_match); + + g_free (path); + } + + return g_test_run (); +} diff --git a/json-glib/tests/reader.c b/json-glib/tests/reader.c new file mode 100644 index 0000000..19f58c9 --- /dev/null +++ b/json-glib/tests/reader.c @@ -0,0 +1,190 @@ +#include +#include + +#include + +#include + +static const gchar *test_base_array_data = +"[ 0, true, null, \"foo\", 3.14, [ false ], { \"bar\" : 42 } ]"; + +static const gchar *test_base_object_data = +"{ \"text\" : \"hello, world!\", \"foo\" : null, \"blah\" : 47, \"double\" : 42.47 }"; + +static const gchar *test_reader_level_data = +" { \"list\": { \"181195771\": { \"given_url\": \"http://www.gnome.org/json-glib-test\" } } }"; + +static const gchar *expected_member_name[] = { + "text", + "foo", + "blah", + "double", +}; + +static void +test_base_object (void) +{ + JsonParser *parser = json_parser_new (); + JsonReader *reader = json_reader_new (NULL); + GError *error = NULL; + gchar **members; + gsize n_members, i; + + json_parser_load_from_data (parser, test_base_object_data, -1, &error); + g_assert (error == NULL); + + json_reader_set_root (reader, json_parser_get_root (parser)); + + g_assert (json_reader_is_object (reader)); + g_assert_cmpint (json_reader_count_members (reader), ==, 4); + + members = json_reader_list_members (reader); + g_assert (members != NULL); + + n_members = g_strv_length (members); + g_assert_cmpint (n_members, ==, json_reader_count_members (reader)); + + for (i = 0; i < n_members; i++) + g_assert_cmpstr (members[i], ==, expected_member_name[i]); + + g_strfreev (members); + + g_assert (json_reader_read_member (reader, "text")); + g_assert (json_reader_is_value (reader)); + g_assert_cmpstr (json_reader_get_string_value (reader), ==, "hello, world!"); + json_reader_end_member (reader); + + g_assert (json_reader_read_member (reader, "foo")); + g_assert (json_reader_get_null_value (reader)); + json_reader_end_member (reader); + + g_assert (!json_reader_read_member (reader, "bar")); + g_assert (json_reader_get_error (reader) != NULL); + g_assert_error ((GError *) json_reader_get_error (reader), + JSON_READER_ERROR, + JSON_READER_ERROR_INVALID_MEMBER); + json_reader_end_member (reader); + g_assert (json_reader_get_error (reader) == NULL); + + g_assert (json_reader_read_element (reader, 2)); + g_assert_cmpstr (json_reader_get_member_name (reader), ==, "blah"); + g_assert (json_reader_is_value (reader)); + g_assert_cmpint (json_reader_get_int_value (reader), ==, 47); + json_reader_end_element (reader); + g_assert (json_reader_get_error (reader) == NULL); + + json_reader_read_member (reader, "double"); + g_assert_cmpfloat (json_reader_get_double_value (reader), ==, 42.47); + json_reader_end_element (reader); + + g_object_unref (reader); + g_object_unref (parser); +} + +static void +test_base_array (void) +{ + JsonParser *parser = json_parser_new (); + JsonReader *reader = json_reader_new (NULL); + GError *error = NULL; + + json_parser_load_from_data (parser, test_base_array_data, -1, &error); + g_assert (error == NULL); + + json_reader_set_root (reader, json_parser_get_root (parser)); + + g_assert (json_reader_is_array (reader)); + g_assert_cmpint (json_reader_count_elements (reader), ==, 7); + + json_reader_read_element (reader, 0); + g_assert (json_reader_is_value (reader)); + g_assert_cmpint (json_reader_get_int_value (reader), ==, 0); + json_reader_end_element (reader); + + json_reader_read_element (reader, 1); + g_assert (json_reader_is_value (reader)); + g_assert (json_reader_get_boolean_value (reader)); + json_reader_end_element (reader); + + json_reader_read_element (reader, 3); + g_assert (json_reader_is_value (reader)); + g_assert_cmpstr (json_reader_get_string_value (reader), ==, "foo"); + json_reader_end_element (reader); + + json_reader_read_element (reader, 5); + g_assert (!json_reader_is_value (reader)); + g_assert (json_reader_is_array (reader)); + json_reader_end_element (reader); + + json_reader_read_element (reader, 6); + g_assert (json_reader_is_object (reader)); + + json_reader_read_member (reader, "bar"); + g_assert (json_reader_is_value (reader)); + g_assert_cmpint (json_reader_get_int_value (reader), ==, 42); + json_reader_end_member (reader); + + json_reader_end_element (reader); + + g_assert (!json_reader_read_element (reader, 7)); + g_assert_error ((GError *) json_reader_get_error (reader), + JSON_READER_ERROR, + JSON_READER_ERROR_INVALID_INDEX); + json_reader_end_element (reader); + g_assert (json_reader_get_error (reader) == NULL); + + g_object_unref (reader); +} + +static void +test_reader_level (void) +{ + JsonParser *parser = json_parser_new (); + JsonReader *reader = json_reader_new (NULL); + GError *error = NULL; + char **members; + + json_parser_load_from_data (parser, test_reader_level_data, -1, &error); + g_assert (error == NULL); + + json_reader_set_root (reader, json_parser_get_root (parser)); + + g_assert (json_reader_count_members (reader) > 0); + + /* Grab the list */ + g_assert (json_reader_read_member (reader, "list")); + + members = json_reader_list_members (reader); + g_assert (members != NULL); + g_strfreev (members); + + g_assert (json_reader_read_member (reader, "181195771")); + + g_assert (!json_reader_read_member (reader, "resolved_url")); + g_assert (json_reader_get_error (reader) != NULL); + json_reader_end_member (reader); + + g_assert (json_reader_read_member (reader, "given_url")); + g_assert_cmpstr (json_reader_get_string_value (reader), ==, "http://www.gnome.org/json-glib-test"); + json_reader_end_member (reader); + + json_reader_end_member (reader); + + json_reader_end_member (reader); + g_clear_object (&reader); + g_clear_object (&parser); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id="); + + g_test_add_func ("/reader/base-array", test_base_array); + g_test_add_func ("/reader/base-object", test_base_object); + g_test_add_func ("/reader/level", test_reader_level); + + return g_test_run (); +} diff --git a/tests/test-serialize-complex.c b/json-glib/tests/serialize-complex.c similarity index 86% rename from tests/test-serialize-complex.c rename to json-glib/tests/serialize-complex.c index f577761..9da8dd1 100644 --- a/tests/test-serialize-complex.c +++ b/json-glib/tests/serialize-complex.c @@ -33,6 +33,7 @@ struct _TestObject gboolean bar; gchar *baz; TestBoxed blah; + gdouble meh; }; struct _TestObjectClass @@ -83,7 +84,8 @@ enum PROP_FOO, PROP_BAR, PROP_BAZ, - PROP_BLAH + PROP_BLAH, + PROP_MEH }; static JsonSerializableIface *serializable_iface = NULL; @@ -167,6 +169,9 @@ test_object_set_property (GObject *gobject, g_free (TEST_OBJECT (gobject)->baz); TEST_OBJECT (gobject)->baz = g_value_dup_string (value); break; + case PROP_MEH: + TEST_OBJECT (gobject)->meh = g_value_get_double (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -192,6 +197,9 @@ test_object_get_property (GObject *gobject, case PROP_BLAH: g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); break; + case PROP_MEH: + g_value_set_double (value, TEST_OBJECT (gobject)->meh); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -214,7 +222,7 @@ test_object_class_init (TestObjectClass *klass) g_object_class_install_property (gobject_class, PROP_BAR, g_param_spec_boolean ("bar", "Bar", "Bar", - FALSE, + TRUE, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_BAZ, @@ -226,6 +234,12 @@ test_object_class_init (TestObjectClass *klass) g_param_spec_boxed ("blah", "Blah", "Blah", TEST_TYPE_BOXED, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_MEH, + g_param_spec_double ("meh", "Meh", "Meh", + 0.0, 1.0, 0.0, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); } static void @@ -234,6 +248,7 @@ test_object_init (TestObject *object) object->foo = 42; object->bar = TRUE; object->baz = g_strdup ("Test"); + object->meh = 0.0; object->blah.foo = object->foo; object->blah.bar = object->bar; @@ -242,7 +257,12 @@ test_object_init (TestObject *object) static void test_serialize (void) { - TestObject *obj = g_object_new (TEST_TYPE_OBJECT, NULL); + TestObject *obj = g_object_new (TEST_TYPE_OBJECT, + "foo", 47, + "bar", FALSE, + "baz", "Hello, World!", + "meh", 0.5, + NULL); JsonParser *parser = json_parser_new (); GError *error = NULL; JsonObject *object; @@ -264,16 +284,13 @@ test_serialize (void) g_assert (json_node_get_node_type (node) == JSON_NODE_OBJECT); object = json_node_get_object (node); - g_assert_cmpint (json_object_get_int_member (object, "foo"), ==, 42); - g_assert (json_object_get_boolean_member (object, "bar")); - g_assert_cmpstr (json_object_get_string_member (object, "baz"), ==, "Test"); + g_assert_cmpint (json_object_get_int_member (object, "foo"), ==, 47); + g_assert (!json_object_get_boolean_member (object, "bar")); + g_assert_cmpstr (json_object_get_string_member (object, "baz"), ==, "Hello, World!"); + g_assert_cmpfloat (json_object_get_double_member (object, "meh"), ==, 0.5); - node = json_object_get_member (object, "blah"); - g_assert (json_node_get_node_type (node) == JSON_NODE_OBJECT); - - object = json_node_get_object (node); - g_assert_cmpint (json_object_get_int_member (object, "foo"), ==, 42); - g_assert (json_object_get_boolean_member (object, "bar")); + /* blah is read-only */ + g_assert (json_object_has_member (object, "blah")); g_free (data); g_object_unref (parser); @@ -284,7 +301,6 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/serialize/gobject-boxed", test_serialize); diff --git a/tests/test-serialize-full.c b/json-glib/tests/serialize-full.c similarity index 67% rename from tests/test-serialize-full.c rename to json-glib/tests/serialize-full.c index 2ef22d6..dd5da7a 100644 --- a/tests/test-serialize-full.c +++ b/json-glib/tests/serialize-full.c @@ -8,6 +8,7 @@ #include #define TEST_TYPE_ENUM (test_enum_get_type ()) +#define TEST_TYPE_FLAGS (test_flags_get_type ()) #define TEST_TYPE_BOXED (test_boxed_get_type ()) #define TEST_TYPE_OBJECT (test_object_get_type ()) #define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_OBJECT, TestObject)) @@ -22,6 +23,13 @@ typedef enum { TEST_ENUM_BAZ } TestEnum; +typedef enum { + TEST_FLAGS_NONE = 0, + TEST_FLAGS_FOO = 1 << 0, + TEST_FLAGS_BAR = 1 << 1, + TEST_FLAGS_BAZ = 1 << 2 +} TestFlags; + typedef struct _TestBoxed TestBoxed; typedef struct _TestObject TestObject; typedef struct _TestObjectClass TestObjectClass; @@ -36,14 +44,15 @@ struct _TestObject { GObject parent_instance; - gint foo; - gboolean bar; - gchar *baz; - TestBoxed blah; - TestEnum meh; - gchar **mah; + gint m_int; + gboolean m_bool; + gchar *m_str; + TestBoxed m_boxed; + TestEnum m_enum; + gchar **m_strv; + TestFlags m_flags; - TestObject *test; + TestObject *m_obj; }; struct _TestObjectClass @@ -107,6 +116,27 @@ test_enum_get_type (void) return e_type; } +GType +test_flags_get_type (void) +{ + static GType e_type = 0; + + if (G_UNLIKELY (e_type == 0)) + { + static const GFlagsValue values[] = { + { TEST_FLAGS_NONE, "TEST_FLAGS_NONE", "none" }, + { TEST_FLAGS_FOO, "TEST_FLAGS_FOO", "foo" }, + { TEST_FLAGS_BAR, "TEST_FLAGS_BAR", "bar" }, + { TEST_FLAGS_BAZ, "TEST_FLAGS_BAZ", "baz" }, + { 0, NULL, NULL } + }; + + e_type = g_flags_register_static ("TestFlags", values); + } + + return e_type; +} + enum { PROP_0, @@ -117,6 +147,7 @@ enum PROP_BLAH, PROP_MEH, PROP_MAH, + PROP_FLAGS, PROP_TEST }; @@ -126,18 +157,6 @@ G_DEFINE_TYPE_WITH_CODE (TestObject, test_object, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (JSON_TYPE_SERIALIZABLE, json_serializable_iface_init)); -static gboolean -test_object_deserialize_property (JsonSerializable *serializable, - const gchar *name, - GValue *value, - GParamSpec *pspec, - JsonNode *node) -{ - gboolean retval = FALSE; - - return retval; -} - static JsonNode * test_object_serialize_property (JsonSerializable *serializable, const gchar *name, @@ -184,17 +203,16 @@ json_serializable_iface_init (gpointer g_iface) JsonSerializableIface *iface = g_iface; iface->serialize_property = test_object_serialize_property; - iface->deserialize_property = test_object_deserialize_property; } static void test_object_finalize (GObject *gobject) { - g_free (TEST_OBJECT (gobject)->baz); - g_strfreev (TEST_OBJECT (gobject)->mah); + g_free (TEST_OBJECT (gobject)->m_str); + g_strfreev (TEST_OBJECT (gobject)->m_strv); - if (TEST_OBJECT (gobject)->test != NULL) - g_object_unref (TEST_OBJECT (gobject)->test); + if (TEST_OBJECT (gobject)->m_obj != NULL) + g_object_unref (TEST_OBJECT (gobject)->m_obj); G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); } @@ -208,28 +226,34 @@ test_object_set_property (GObject *gobject, switch (prop_id) { case PROP_FOO: - TEST_OBJECT (gobject)->foo = g_value_get_int (value); + TEST_OBJECT (gobject)->m_int = g_value_get_int (value); break; case PROP_BAR: - TEST_OBJECT (gobject)->bar = g_value_get_boolean (value); + TEST_OBJECT (gobject)->m_bool = g_value_get_boolean (value); break; case PROP_BAZ: - g_free (TEST_OBJECT (gobject)->baz); - TEST_OBJECT (gobject)->baz = g_value_dup_string (value); + g_free (TEST_OBJECT (gobject)->m_str); + TEST_OBJECT (gobject)->m_str = g_value_dup_string (value); break; case PROP_MEH: - TEST_OBJECT (gobject)->meh = g_value_get_enum (value); + TEST_OBJECT (gobject)->m_enum = g_value_get_enum (value); break; case PROP_MAH: - TEST_OBJECT (gobject)->mah = g_strdupv (g_value_get_boxed (value)); + g_strfreev (TEST_OBJECT (gobject)->m_strv); + TEST_OBJECT (gobject)->m_strv = g_strdupv (g_value_get_boxed (value)); + break; + + case PROP_FLAGS: + TEST_OBJECT (gobject)->m_flags = g_value_get_flags (value); break; case PROP_TEST: - TEST_OBJECT (gobject)->test = g_value_dup_object (value); + g_clear_object (&(TEST_OBJECT (gobject)->m_obj)); + TEST_OBJECT (gobject)->m_obj = g_value_dup_object (value); break; default: @@ -246,31 +270,35 @@ test_object_get_property (GObject *gobject, switch (prop_id) { case PROP_FOO: - g_value_set_int (value, TEST_OBJECT (gobject)->foo); + g_value_set_int (value, TEST_OBJECT (gobject)->m_int); break; case PROP_BAR: - g_value_set_boolean (value, TEST_OBJECT (gobject)->bar); + g_value_set_boolean (value, TEST_OBJECT (gobject)->m_bool); break; case PROP_BAZ: - g_value_set_string (value, TEST_OBJECT (gobject)->baz); + g_value_set_string (value, TEST_OBJECT (gobject)->m_str); break; case PROP_BLAH: - g_value_set_boxed (value, &(TEST_OBJECT (gobject)->blah)); + g_value_set_boxed (value, &(TEST_OBJECT (gobject)->m_boxed)); break; case PROP_MEH: - g_value_set_enum (value, TEST_OBJECT (gobject)->meh); + g_value_set_enum (value, TEST_OBJECT (gobject)->m_enum); break; case PROP_MAH: - g_value_set_boxed (value, TEST_OBJECT (gobject)->mah); + g_value_set_boxed (value, TEST_OBJECT (gobject)->m_strv); + break; + + case PROP_FLAGS: + g_value_set_flags (value, TEST_OBJECT (gobject)->m_flags); break; case PROP_TEST: - g_value_set_object (value, TEST_OBJECT (gobject)->test); + g_value_set_object (value, TEST_OBJECT (gobject)->m_obj); break; default: @@ -313,13 +341,21 @@ test_object_class_init (TestObjectClass *klass) g_param_spec_enum ("meh", "Meh", "Meh", TEST_TYPE_ENUM, TEST_ENUM_BAR, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); g_object_class_install_property (gobject_class, PROP_MAH, g_param_spec_boxed ("mah", "Mah", "Mah", G_TYPE_STRV, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", "Flags", "Flags", + TEST_TYPE_FLAGS, + TEST_FLAGS_NONE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + g_object_class_install_property (gobject_class, PROP_TEST, g_param_spec_object ("test", "Test", "Test", TEST_TYPE_OBJECT, @@ -329,18 +365,20 @@ test_object_class_init (TestObjectClass *klass) static void test_object_init (TestObject *object) { - object->foo = 0; - object->bar = FALSE; - object->baz = NULL; + object->m_int = 0; + object->m_bool = FALSE; + object->m_str = NULL; + + object->m_boxed.foo = object->m_int; + object->m_boxed.bar = object->m_bool; - object->blah.foo = object->foo; - object->blah.bar = object->bar; + object->m_enum = TEST_ENUM_BAR; - object->meh = TEST_ENUM_BAR; + object->m_strv = NULL; - object->mah = NULL; + object->m_flags = TEST_FLAGS_NONE; - object->test = NULL; + object->m_obj = NULL; } static const gchar *var_test = @@ -351,9 +389,10 @@ static const gchar *var_test = " \"meh\" : \"baz\",\n" " \"mah\" : [ \"hello\", \", \", \"world\", \"!\" ],\n" " \"test\" : {\n" -" \"bar\" : true,\n" -" \"baz\" : \"world\",\n" -" \"meh\" : \"foo\"\n" +" \"bar\" : true,\n" +" \"baz\" : \"world\",\n" +" \"meh\" : 0,\n" +" \"flags\" : \"foo|bar\"" " }\n" "}"; @@ -376,28 +415,29 @@ test_deserialize (void) " bar: %s\n" " baz: %s\n" " meh: %s\n", - TEST_OBJECT (object)->foo == 42 ? "" : "", - TEST_OBJECT (object)->bar == TRUE ? "" : "", - TEST_OBJECT (object)->baz != NULL ? "" : "", - TEST_OBJECT (object)->meh == TEST_ENUM_BAZ ? "" : ""); + TEST_OBJECT (object)->m_int == 42 ? "" : "", + TEST_OBJECT (object)->m_bool == TRUE ? "" : "", + TEST_OBJECT (object)->m_str != NULL ? "" : "", + TEST_OBJECT (object)->m_enum == TEST_ENUM_BAZ ? "" : ""); - g_assert_cmpint (TEST_OBJECT (object)->foo, ==, 42); - g_assert_cmpint (TEST_OBJECT (object)->bar, ==, TRUE); - g_assert_cmpstr (TEST_OBJECT (object)->baz, ==, "hello"); - g_assert_cmpint (TEST_OBJECT (object)->meh, ==, TEST_ENUM_BAZ); + g_assert_cmpint (TEST_OBJECT (object)->m_int, ==, 42); + g_assert (TEST_OBJECT (object)->m_bool); + g_assert_cmpstr (TEST_OBJECT (object)->m_str, ==, "hello"); + g_assert_cmpint (TEST_OBJECT (object)->m_enum, ==, TEST_ENUM_BAZ); - g_assert (TEST_OBJECT (object)->mah != NULL); - g_assert_cmpint (g_strv_length (TEST_OBJECT (object)->mah), ==, 4); + g_assert (TEST_OBJECT (object)->m_strv != NULL); + g_assert_cmpint (g_strv_length (TEST_OBJECT (object)->m_strv), ==, 4); - str = g_strjoinv (NULL, TEST_OBJECT (object)->mah); + str = g_strjoinv (NULL, TEST_OBJECT (object)->m_strv); g_assert_cmpstr (str, ==, "hello, world!"); g_free (str); - g_assert (TEST_IS_OBJECT (TEST_OBJECT (object)->test)); - test = TEST_OBJECT (TEST_OBJECT (object)->test); - g_assert (test->bar); - g_assert_cmpstr (test->baz, ==, "world"); - g_assert_cmpint (test->meh, ==, TEST_ENUM_FOO); + g_assert (TEST_IS_OBJECT (TEST_OBJECT (object)->m_obj)); + test = TEST_OBJECT (TEST_OBJECT (object)->m_obj); + g_assert (test->m_bool); + g_assert_cmpstr (test->m_str, ==, "world"); + g_assert_cmpint (test->m_enum, ==, TEST_ENUM_FOO); + g_assert_cmpint (test->m_flags, ==, TEST_FLAGS_FOO | TEST_FLAGS_BAR); g_object_unref (object); } @@ -406,7 +446,6 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/deserialize/json-to-gobject", test_deserialize); diff --git a/tests/test-serialize-simple.c b/json-glib/tests/serialize-simple.c similarity index 99% rename from tests/test-serialize-simple.c rename to json-glib/tests/serialize-simple.c index 42af6fb..e2e7be2 100644 --- a/tests/test-serialize-simple.c +++ b/json-glib/tests/serialize-simple.c @@ -157,7 +157,6 @@ int main (int argc, char *argv[]) { - g_type_init (); g_test_init (&argc, &argv, NULL); g_test_add_func ("/serialize/gobject", test_serialize); diff --git a/json-glib/tests/stream-load.json b/json-glib/tests/stream-load.json new file mode 100644 index 0000000..203f03f --- /dev/null +++ b/json-glib/tests/stream-load.json @@ -0,0 +1 @@ +[ { "hello" : "world!\n" } ] diff --git a/missing b/missing deleted file mode 100755 index 28055d2..0000000 --- a/missing +++ /dev/null @@ -1,376 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. - -scriptversion=2009-04-28.21; # UTC - -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# 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 2, 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 . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -msg="missing on your system" - -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - autom4te touch the output file, or create a stub one - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] - -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. - -Send bug reports to ." - exit $? - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing $scriptversion (GNU Automake)" - exit $? - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - -esac - -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - tar*) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running `$TOOL --version' or `$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: \`$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get \`$1' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: \`$1' $msg. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG="\${$#}" - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: \`$1' is $msg. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; - - tar*) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/packaging/baselibs.conf b/packaging/baselibs.conf new file mode 100644 index 0000000..d85c0f0 --- /dev/null +++ b/packaging/baselibs.conf @@ -0,0 +1 @@ +libjson-glib diff --git a/packaging/json-glib.changes b/packaging/json-glib.changes new file mode 100644 index 0000000..a3705ac --- /dev/null +++ b/packaging/json-glib.changes @@ -0,0 +1,6 @@ +* Sat Apr 27 2013 Anas Nashif upstream/0.16.0@8844179 +- Update to 0.16.0 + +* Thu Dec 20 2012 Anas Nashif submit/trunk/20121220.211531@cf96019 +- Update to 0.15.2 + diff --git a/packaging/json-glib.manifest b/packaging/json-glib.manifest new file mode 100644 index 0000000..93cab65 --- /dev/null +++ b/packaging/json-glib.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packaging/json-glib.spec b/packaging/json-glib.spec index 4c99b5c..faf956b 100644 --- a/packaging/json-glib.spec +++ b/packaging/json-glib.spec @@ -1,76 +1,120 @@ -#sbs-git:slp/pkgs/l/libjson-glib json-glib 0.0.1 982a2ec62fdaecef7bf0d791b9b7be16d398d70b - -Name: json-glib -Summary: JSON Parser for GLib -Version: 0.0.1 -Release: 1 -Group: System/Libraries -License: LGPL-2.1+ -Source0: %{name}-%{version}.tar.gz -Patch0: support_surrogate_pairs_in_json_string.patch -Requires(post): /sbin/ldconfig -Requires(postun): /sbin/ldconfig -BuildRequires: pkgconfig(gobject-2.0) -BuildRequires: pkgconfig(gnutls) - +%bcond_with introspection + +Name: json-glib +Version: 1.0.2 +Release: 0 +License: LGPL-2.1+ +Summary: Library for JavaScript Object Notation format +Url: http://live.gnome.org/JsonGlib +Group: System/Libraries +#X-Vcs-Url: git://git.gnome.org/json-glib +Source0: http://download.gnome.org/sources/json-glib/%{version}/%{name}-%{version}.tar.xz +Source99: baselibs.conf +Source1001: json-glib.manifest +%if %{with introspection} +BuildRequires: gobject-introspection-devel +%endif +BuildRequires: pkgconfig(glib-2.0) %description -an json-glib api library implementation in C (shared libs) +JSON is a lightweight data-interchange format.It is easy for humans to +read and write. It is easy for machines to parse and generate. + +JSON-GLib provides a parser and a generator GObject classes and various +wrappers for the complex data types employed by JSON, such as arrays +and objects. + +JSON-GLib uses GLib native data types and the generic value container +GValue for ease of development. It also provides integration with the +GObject classes for direct serialization into, and deserialization from, +JSON data streams. + +%package -n typelib-Json +Summary: Library for JavaScript Object Notation format -- Introspection bindings +Group: System/Libraries + +%description -n typelib-Json +JSON is a lightweight data-interchange format.It is easy for humans to +read and write. It is easy for machines to parse and generate. + +JSON-GLib provides a parser and a generator GObject classes and various +wrappers for the complex data types employed by JSON, such as arrays +and objects. +JSON-GLib uses GLib native data types and the generic value container +GValue for ease of development. It also provides integration with the +GObject classes for direct serialization into, and deserialization from, +JSON data streams. +This package provides the GObject Introspection bindings for JSON-GLib. %package devel -Summary: Development components for the json-glib package -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} +Summary: Library for JavaScript Object Notation format - Development Files +Group: System/Libraries +Requires: json-glib = %{version} +%if %{with introspection} +Requires: typelib-Json = %{version} +%endif +BuildRequires: gettext %description devel -Components for the json-glib package (devel) +JSON is a lightweight data-interchange format.It is easy for humans to +read and write. It is easy for machines to parse and generate. -%package docs -Summary: Documentation components for the json-glib package -Group: Documentation -Requires: %{name} = %{version}-%{release} +JSON-GLib provides a parser and a generator GObject classes and various +wrappers for the complex data types employed by JSON, such as arrays +and objects. -%description docs -Components for the json-glib package (doc) +JSON-GLib uses GLib native data types and the generic value container +GValue for ease of development. It also provides integration with the +GObject classes for direct serialization into, and deserialization from, +JSON data streams. +This package contains development files needed to develop with the +json-glib library. +%lang_package %prep -%setup -q -n %{name}-%{version} - -%patch0 -p1 -b .support_surrogate_pairs +%setup -q +cp %{SOURCE1001} . %build - -%reconfigure --disable-static -make %{?jobs:-j%jobs} +NOCONFIGURE=1 +%reconfigure --disable-man --disable-doc +make %{?_smp_mflags} %install - -mkdir -p %{buildroot}/usr/share/license -cp COPYING %{buildroot}/usr/share/license/json-glib -#rm -rf %{buildroot} %make_install +%find_lang %{name}-1.0 -%post -p /sbin/ldconfig +mv %{name}-1.0.lang %{name}.lang -%postun -p /sbin/ldconfig +%post -n json-glib -p /sbin/ldconfig +%postun -n json-glib -p /sbin/ldconfig %files -%defattr(-,root,root,-) +%manifest %{name}.manifest +%defattr(-,root,root) %doc COPYING -/usr/lib/libjson-glib-1.0.so.* -/usr/share/license/json-glib +%{_libdir}/*.so.* +%{_bindir}/* -%files devel -%defattr(-,root,root,-) -/usr/include/json-glib-1.0/json-glib/*.h -/usr/lib/*.so -/usr/lib/pkgconfig/*.pc - -%files docs -%defattr(-,root,root,-) -%doc /usr/share/gtk-doc/html/json-glib/* +%if %{with introspection} +%files -n typelib-Json +%manifest %{name}.manifest +%defattr(-,root,root) +%{_libdir}/girepository-1.0/Json-1.0.typelib +%endif +%files devel +%manifest %{name}.manifest +%defattr(-,root,root) +%{_includedir}/%{name}-1.0 +%{_libdir}/*.so +%{_libdir}/pkgconfig/*.pc +%if %{with introspection} +%{_datadir}/gir-1.0/*.gir +%endif + +%changelog diff --git a/packaging/support_surrogate_pairs_in_json_string.patch b/packaging/support_surrogate_pairs_in_json_string.patch deleted file mode 100644 index b6c7558..0000000 --- a/packaging/support_surrogate_pairs_in_json_string.patch +++ /dev/null @@ -1,50 +0,0 @@ -From fcd07918d3ed2b31b047900da9d2fed23dddf7da Mon Sep 17 00:00:00 2001 -From: Eiichi Sato -Date: Sat, 10 Apr 2010 01:52:10 +0900 -Subject: [PATCH] Support for surrogate pairs in json string. - -https://bugzilla.gnome.org/show_bug.cgi?id=615799 - -Signed-off-by: Emmanuele Bassi ---- - json-glib/json-scanner.c | 16 +++++++++++++++- - 1 files changed, 15 insertions(+), 1 deletions(-) - -diff --git a/json-glib/json-scanner.c b/json-glib/json-scanner.c -index 9cd0938..6eca2ba 100644 ---- a/json-glib/json-scanner.c -+++ b/json-glib/json-scanner.c -@@ -892,7 +892,7 @@ json_scanner_get_unichar (JsonScanner *scanner, - break; - } - -- g_assert (g_unichar_validate (uchar)); -+ g_assert (g_unichar_validate (uchar) || g_unichar_type (uchar) == G_UNICODE_SURROGATE); - - return uchar; - } -@@ -1439,6 +1439,20 @@ json_scanner_get_token_ll (JsonScanner *scanner, - gunichar ucs; - - ucs = json_scanner_get_unichar (scanner, line_p, position_p); -+ -+ if (g_unichar_type (ucs) == G_UNICODE_SURROGATE) -+ { -+ /* read next surrogate */ -+ if ('\\' == json_scanner_get_char (scanner, line_p, position_p) -+ && 'u' == json_scanner_get_char (scanner, line_p, position_p)) -+ { -+ gunichar ucs_lo = json_scanner_get_unichar (scanner, line_p, position_p); -+ g_assert (g_unichar_type (ucs_lo) == G_UNICODE_SURROGATE); -+ ucs = (((ucs & 0x3ff) << 10) | (ucs_lo & 0x3ff)) + 0x10000; -+ } -+ } -+ -+ g_assert (g_unichar_validate (ucs)); - gstring = g_string_append_unichar (gstring, ucs); - } - break; --- -1.7.1 - - diff --git a/po/.gitignore b/po/.gitignore new file mode 100644 index 0000000..9ac1987 --- /dev/null +++ b/po/.gitignore @@ -0,0 +1,14 @@ +/Makefile.in.in +/Makevars.template +/POTFILES +/Rules-quot +/boldquot.sed +/en@boldquot.header +/en@quot.header +/insert-header.sin +/quot.sed +/remove-potcdate.sed +/remove-potcdate.sin +/stamp-po +*.gmo +*.pot diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..0df7a65 --- /dev/null +++ b/po/Makevars @@ -0,0 +1,7 @@ +DOMAIN = json-glib-1.0 +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --keyword=P_ --keyword=C_ +COPYRIGHT_HOLDER = Intel Corporation +MSGID_BUGS_ADDRESS = http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib +EXTRA_LOCALE_CATEGORIES = + +top_builddir = .. diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..8868a19 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,8 @@ +# keep sorted alphabetically! +json-glib/json-glib-format.c +json-glib/json-glib-validate.c +json-glib/json-gobject.c +json-glib/json-gvariant.c +json-glib/json-parser.c +json-glib/json-path.c +json-glib/json-reader.c diff --git a/po/as.po b/po/as.po new file mode 100644 index 0000000..395e7ae --- /dev/null +++ b/po/as.po @@ -0,0 +1,167 @@ +# Assamese translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Nilamdyuti Goswami , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-10-25 17:15+0000\n" +"PO-Revision-Date: 2012-10-26 15:38+0530\n" +"Last-Translator: Nilamdyuti Goswami \n" +"Language-Team: as_IN \n" +"Language: as\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "এটা JSON আশা কৰা হৈছে, কিন্তু ৰুট ন'ডৰ ধৰণ '%s'" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON অৱস্থাত অপ্ৰত্যাশিত ধৰণ '%s'" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "এটা টিউপুলৰ সৈতে সংগত হবলে JSON এৰেত কিছুমান উপাদান সন্ধানহিন" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant টিউপুল ধৰণত বন্ধৰ চিহ্ন ')' সন্ধানহিন" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON এৰেত অপ্ৰত্যাশিত অতিৰিক্ত উপাদান" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant লে পৰিবৰ্তন কৰোতে অবৈধ স্ট্ৰিং মান" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"এটা GVariant অভিধান প্ৰবিষ্টিয়ে কেৱল এটা সদস্যৰ সৈতে এটা JSON অবজেক্ট আশা কৰে" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant শ্ৰেণী '%c' সমৰ্থিত নহয়" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "অবৈধ GVariant স্বাক্ষৰ" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON তথ্য ৰিক্ত" + +#: ../json-glib/json-parser.c:810 +#, c-format +#| msgid "%s:%d: Parse error: %s" +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: বিশ্লেষণ ত্ৰুটি: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath অভিব্যক্তিত কেৱল এটা ৰুট ন'ডৰ অনুমতি আছে" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "ৰুট ন'ড অবৈধ আখৰ '%c' দ্বাৰা অনুকৰণ কৰা হৈছে" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "স্খলিত স্লাইচ অভিব্যক্তি '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "অবৈধ সংহতি বিৱৰণ '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "অবৈধ স্লাইচ বিৱৰণ '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "অভৈধ এৰে সূচী বিৱৰণ '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "বৰ্তমান ন'ডৰ ধৰণ '%s', কিন্তু এটা এৰে অথবা এটা অবজেক্ট আশা কৰা হৈছিল।" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "সূচী '%d' বৰ্তমান অৱস্থানত এৰেৰ আকাৰতকে অধিক।" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "সূচী '%d' বৰ্তমান অৱস্থানত অবজেক্টৰ আকাৰতকে ডাঙৰ।" + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "বৰ্তমান অৱস্থানত কোনো ন'ড উপলব্ধ নাই" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "বৰ্তমান অৱস্থানত এটা '%s' আছে কিন্তু এটা এৰে নাই" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "বৰ্তমান ন'ডৰ ধৰণ '%s', কিন্তু এটা অবজেক্ট আশা কৰা হৈছিল।" + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "সদস্য '%s' বৰ্তমান অৱস্থানৰ অবজেক্টত বিৱৰিত নহয়।" + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "বৰ্তমান অৱস্থানত এটা '%s' আছে কিন্তু এটা অবজেক্ট নাই" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "বৰ্তমান অৱস্থানত এটা '%s' আছে কিন্তু এটা মান নাই" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "বৰ্তমান অৱস্থানত এটা স্ট্ৰিং ধৰণ নাই" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "বৰ্তমান অৱস্থানত এটা পূৰ্ণসংখ্যা ধৰণ নাই" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "বৰ্তমান অৱস্থানত এটা দশমিকযুক্ত ধৰণ নাই" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "বৰ্তমান অৱস্থানত এটা বুলিয়ান ধৰণ নাই" diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..2d358d4 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,157 @@ +# Bulgarian translation for json-glib po-file +# Copyright (C) 2012, 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# Ivaylo Valkov , 2012. +# Alexander Shopov , 2013. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2013-01-08 21:45+0200\n" +"PO-Revision-Date: 2013-01-08 21:45+0200\n" +"Last-Translator: Ivaylo Valkov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Очакваха се данни в JSON, но кореновият елемент е от вида „%s“" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Неочакван вид „%s“ във възел на JSON" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "" +"Липсват елементи в масив на JSON. Това пречи на използването му и като " +"списък." + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Липсва затварящият символ „)“ в списъка на GVariant" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "Неочаквани допълнителни елементи в масив на JSON" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "Неправилно преобразуване от низ в GVariant" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Речникът на GVariant очаква данни в JSON само с един член" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Класът на GVariant „%c“ не се поддържа" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Грешен подпис за вида GVariant" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "Няма данни в JSON" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Грешка при анализиране: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Позволен е само един коренов възел в изрази от вида „JSONPath“" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Символът „%c“ след кореновия възел е грешен" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Неправилен израз за отрязък: „%*s“" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Неправилна дефиниция за множество „%*s“" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Неправилна дефиниция за отрязък: „%*s“" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Неправилна дефиниция за индекс на масив „%*s“" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Възелът е от вида „%s“. Очакваше се масив или обект." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Индексът „%d“ е по-голям от броя на елементите в масива." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Индексът „%d“ е по-голям от броя на елементите в обекта." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "Липсва възел на тази позиция" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "На тази позиция трябва да има масив, а не „%s“" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Възелът е от вида „%s“. Очакваше се обект." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Членът „%s“ не е дефиниран на тази позиция в обекта." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "На тази позиция трябва да има обект, а не „%s“" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "На тази позиция трябва да има стойност, а не „%s“" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "На тази позиция няма низ" diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..96597ad --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,156 @@ +# Bengali (India) translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Sayak Sarkar , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-22 19:40+0000\n" +"PO-Revision-Date: 2012-09-23 11:44+0530\n" +"Last-Translator: Sayak Sarkar \n" +"Language-Team: Bengali (India) \n" +"Language: bn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.4\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "একটি JSON বস্তুর প্রত্যাশা করা হচ্ছে, কিন্তু রুট নোড টাইপ হল `%s'" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON নোডের মধ্যে অপ্রত্যাশিত টাইপ '%s'" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON অ্যারের মধ্যে অনুপস্থিত উপাদানের একটি tuple বর্নিত" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant tuple টাইপে শেষ চিহ্ন ')' অনুপস্থিত" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON অ্যারের মধ্যে অপ্রত্যাশিত অতিরিক্ত উপাদানসমূহ" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant এর রূপান্তরিকরণে স্ট্রিং-এর মান অবৈধ" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "একটি GVariant অভিধান এন্ট্রি এক সদস্যের সঙ্গে ঠিক একটি JSON বস্তুর আশা করে" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant ক্লাস '%c' সমর্থিত নয়" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "অবৈধ GVariant স্বাক্ষর" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON তথ্য খালি" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: পার্স ত্রুটি: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "কেবলমাত্র একটি রুট নোড একটি JSONPath অভিব্যক্তিতে অনুমোদিত করা হয়" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "রুট নোড অবৈধ অক্ষর '%c' দ্বারা অনুসরিত" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "ত্রুটিপূর্ণ স্লাইস্ অভিব্যক্তি '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "অবৈধ সেট সংজ্ঞা '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "অবৈধ স্লাইস্ সংজ্ঞা '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "অবৈধ অ্যারের সূচক সংজ্ঞা '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "বর্তমান নোড '%s' ধরনের, কিন্তু একটি অ্যারে অথবা কোনো বস্তু প্রত্যাশিত ছিল।" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "সূচক '%d' বর্তমান অবস্থান এ অ্যারের মাপের চেয়ে বেশী।" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "সূচক '% d' বর্তমান অবস্থানে বস্তুর আকারের চেয়ে বৃহত্তর।" + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "বর্তমান অবস্থানে কোন নোড উপলব্ধ নয়" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "বর্তমান অবস্থানে একটি অ্যারের জায়গায় '%s' উপস্থিত" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "বর্তমান নোড '%s' ধরনের, কিন্তু একটি বস্তু প্রত্যাশিত ছিল।" + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "'%s' সদস্য বর্তমান অবস্থানে অবজেক্টে সংজ্ঞায়িত করা নেই।" + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "বর্তমান অবস্থানে একটি বস্তুর জায়গায় '%s' উপস্থিত" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "বর্তমান অবস্থানে একটি মানের জায়গায় '%s' উপস্থিত" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "বর্তমান অবস্থানে কোন স্ট্রিং নেই" diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..7b19abf --- /dev/null +++ b/po/ca.po @@ -0,0 +1,158 @@ +# Catalan translation for json-glib. +# Copyright (C) 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# Gil Forcada , 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2013-01-21 00:26+0100\n" +"PO-Revision-Date: 2013-01-21 00:26+0100\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "S'esperava un objecte JSON, però el node arrel és del tipus «%s»" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "No s'esperava el tipus «%s» en un node de JSON" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Manquen elements en la matriu de JSON perquè siguin una tupla" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Manca el símbol de tancament «)» pel tipus de tupla de GVariant" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "No s'esperaven elements extra en la matriu de JSON" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "La cadena no es pot convertir a GVariant, la conversió no és vàlida" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Un diccionari de GVariant requereix un objecte de JSON amb un sol membre" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "La classe «%c» de GVariant no es pot utilitzar" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "La signatura de GVariant no és vàlida" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "No hi ha dades de JSON" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: error en l'anàlisi: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Només es pot utilitzar un node arrel en una expressió JSONPath" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "El caràcter «%c» que segueix el node arrel no és vàlid" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "L'expressió de tallat «%*s» no està ben formatada" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "La definició del conjunt «%*s» no és vàlida" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "La definició del tallat «%*s» no és vàlida" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "La definició de l'índex de la matriu «%*s» no és vàlida" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"El node actual és de tipus «%s», però s'esperava una matriu, o bé, un " +"objecte." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "L'índex «%d» és més gran que la mida de la matriu a la posició actual." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "L'índex «%d» és més gran que la mida de l'objecte a la posició actual." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "No hi ha cap node disponible a la posició actual" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "A la posició actual hi ha un «%s» i no una matriu" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "El node actual és de tipus «%s», però s'esperava un objecte." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "El membre «%s» no està definit a l'objecte de la posició actual." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "A la posició actual hi ha un «%s» i no un objecte" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "A la posició actual hi ha un «%s» i no un valor" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "A la posició actual no hi ha una cadena" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..ce1cc3f --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,158 @@ +# Catalan translation for json-glib. +# Copyright (C) 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# Gil Forcada , 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2013-01-21 00:27+0100\n" +"PO-Revision-Date: 2013-01-21 00:26+0100\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca-XV\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "S'esperava un objecte JSON, però el node arrel és del tipus «%s»" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "No s'esperava el tipus «%s» en un node de JSON" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Manquen elements en la matriu de JSON perquè siguen una tupla" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Manca el símbol de tancament «)» pel tipus de tupla de GVariant" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "No s'esperaven elements extra en la matriu de JSON" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "La cadena no es pot convertir a GVariant, la conversió no és vàlida" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Un diccionari de GVariant requereix un objecte de JSON amb un sol membre" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "La classe «%c» de GVariant no es pot utilitzar" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "La signatura de GVariant no és vàlida" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "No hi ha dades de JSON" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: error en l'anàlisi: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Només es pot utilitzar un node arrel en una expressió JSONPath" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "El caràcter «%c» que segueix el node arrel no és vàlid" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "L'expressió de tallat «%*s» no està ben formatada" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "La definició del conjunt «%*s» no és vàlida" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "La definició del tallat «%*s» no és vàlida" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "La definició de l'índex de la matriu «%*s» no és vàlida" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"El node actual és de tipus «%s», però s'esperava una matriu, o bé, un " +"objecte." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "L'índex «%d» és més gran que la mida de la matriu a la posició actual." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "L'índex «%d» és més gran que la mida de l'objecte a la posició actual." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "No hi ha cap node disponible a la posició actual" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "A la posició actual hi ha un «%s» i no una matriu" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "El node actual és de tipus «%s», però s'esperava un objecte." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "El membre «%s» no està definit a l'objecte de la posició actual." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "A la posició actual hi ha un «%s» i no un objecte" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "A la posició actual hi ha un «%s» i no un valor" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "A la posició actual no hi ha una cadena" diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..3e39dc0 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,257 @@ +# Czech translation for json-glib. +# Copyright (C) 2011 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Marek Černocký , 2011, 2012, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 14:30+0000\n" +"PO-Revision-Date: 2014-01-18 22:45+0100\n" +"Last-Translator: Marek Černocký \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Gtranslator 2.91.6\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Lépe upravit výstup" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Mezery pro odsazení" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: chyba při otevírání souboru: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: chyba při analýze souboru: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: chyba při zápisu do standardního výstupu" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: chyba při zavírání: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "SOUBOR" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Formátovat soubory JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formátuje prostředky JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Chyba při zpracování přepínačů příkazového řádku: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Pro více informací zkuste použít „%s --help“." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: schází soubory" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Ověřit platnost souborů JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate ověřuje platnost dat JSON na zadané adrese URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Očekává se objekt JSON, ale kořenový uzel je typu „%s“" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Neočekávaný typ „%s“ v uzlu JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Schází prvky v poli JSON, aby to byla n-tice" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Schází uzavírací symbol „)“ v typu n-tice GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Neočekávané dodatečné prvky v poli JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Neplatná hodnota typu řetězec převáděná na GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Záznam slovníku GVariant očekává objekt JSON s právě jedním členem" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Třída GVariant „%c“ není podporována" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Neplatná signatura GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Data JSON jsou prázdná" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Chyba zpracování: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Data JSON musí být kódována v UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Ve výrazu JSONPath je dovolen pouze jeden kořenový uzel" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Kořenový uzel následován neplatným znakem „%c“" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Schází název člena nebo divoký znak po znaku tečky." + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Chybný výraz dílu „%*s“" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Neplatná definice množiny „%*s“" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Neplatná definice dílu „%*s“" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Neplatná definice indexu pole „%*s“" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Neplatný první znak „%c“" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Aktuální uzel je typu „%s“, ale bylo očekáváno pole nebo objekt." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Index „%d“ je větší než velikost pole na aktuální pozici." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Index „%d“ je větší než velikost objektu na aktuální pozici." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Na aktuální pozici není k dispozici žádný uzel" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Aktuální pozice obsahuje „%s“ a ne pole" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Aktuální uzel je typu „%s“, ale byl očekáván objekt." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Člen „%s“ není na aktuálním pozici v objektu definován." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Aktuální pozice obsahuje „%s“ a ne objekt" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Aktuální pozice obsahuje „%s“ a ne hodnotu" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "Aktuální pozice neobsahuje typ string (řetězec)" diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..4d0b434 --- /dev/null +++ b/po/da.po @@ -0,0 +1,264 @@ +# Danish translation for json-glib. +# Copyright (C) 2012-2013 json-glib's developers +# This file is distributed under the same license as the json-glib package. +# +# Ask Hjorth Larsen , 2012-2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2014-03-19 22:31+0100\n" +"PO-Revision-Date: 2014-03-15 13:53+0100\n" +"Last-Translator: Ask Hjorth Larsen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Gør udskrift pæn" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Indrykningsmellemrum" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: fejl ved Ã¥bning af fil: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: fejl ved fortolkning af fil: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: fejl ved skrivning til stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: fejl ved lukning: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FIL" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formatér JSON-filer." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formaterer JSON-ressourcer." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Fejl ved fortolkning af kommandolinjetilvalg: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Prøv \"%s --help\" for at fÃ¥ yderligere oplysninger." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: manglende filer" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Kontrollér JSON-filer." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate kontrollerer JSON-data pÃ¥ den givne URI." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Forventer et JSON-objekt, men rodknuden er af typen \"%s\"" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Uventet type \"%s\" i JSON-tilstand" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Manglende elementer i JSON-array for at kunne være en tuple" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Manglende lukkesymbol \")\" i GVariant-tupletype" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Uventet ekstra elementer i JSON-array" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Ugyldig strengværdi ved konvertering til GVariant" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "En GVariant-ordbogspost forventer et JSON-objekt med nøjagtigt ét tal" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant-klassen \"%c\" understøttes ikke" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Ugyldig GVariant-underskrift" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "JSON-data er tom" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Fortolkningsfejl: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON-data skal være UTF-8-kodet" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Kun en rodknude tillades i et JSONPath-udtryk" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Rodknuden efterfølges af et ugyldigt tegn, \"%c\"" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Manglende medlemsnavn eller wildcard efter .-tegn" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Misdannet slice-udtryk \"%*s\"" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Ugyldig mængdedefinition \"%*s\"" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Ugyldig slice-definition \"%*s\"" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Ugyldig arrayindeksdefinition \"%*s\"" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Ugyldigt første tegn \"%c\"" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Den nuværende knude er af typen \"%s\", men der blev forventet et array " +"eller et objekt." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"Indekset \"%d\" er større end størrelsen af arrayet ved nuværende position." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"Indekset \"%d\" er større end størrelsen af objektet pÃ¥ den nuværende " +"position." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Ingen tilgængelig knude pÃ¥ nuværende position" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Den nuværende position holder en \"%s\" og ikke et array" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "" +"Den nuværende knude er af typen \"%s\", men der blev forventet et objekt." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "" +"Medlemmet \"%s\" er ikke defineret i objektet pÃ¥ den nuværende position." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Den nuværende position indeholder en \"%s\" og ikke et objekt" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Den nuværende position indeholder en \"%s\" og ikke en værdi" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Den nuværende position indeholder ikke en strengtype" diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..9c062cc --- /dev/null +++ b/po/de.po @@ -0,0 +1,275 @@ +# German translation for json-glib. +# Copyright (C) 2011 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Mario Blättermann , 2011. +# Wolfgang Stöggl , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-04-24 21:03+0000\n" +"PO-Revision-Date: 2014-04-27 20:32+0100\n" +"Last-Translator: Benjamin Steinwender \n" +"Language-Team: Deutsch \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.4\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Ausgabe hübsch gestalten" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Einrückungsleerzeichen" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: Fehler beim Öffnen der Datei: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: Fehler beim Verarbeiten der Datei: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: Fehler beim Schreiben auf die Standardausgabe" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: Fehler beim Schließen: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "DATEI" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "JSON-Datei formatieren." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatiert JSON-Ressourcen." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Fehler beim Verarbeiten der Befehlszeilenoptionen: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für mehr Informationen." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: Fehlende Dateien" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "JSON-Datei auf Gültigkeit prüfen." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate prüft JSON-Daten der angegebenen Adresse." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Ein JSON-Objekt wurde erwartet, aber der Root-Knoten hat den Typ »%s«" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Unerwarteter Typ »%s« im JSON-Knoten" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Elemente im JSON-Array fehlen, um konform zu einem Tupel zu sein" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Schließende Klammer »)« im Typ des GVariant-Tupels fehlt" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Unerwartete zusätzliche Elemente im JSON-Array" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Ungültiger Zeichenkettenwert zur GVariant-Umwandlung" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Ein GVariant-Verzeichniseintrag erwartet ein JSON-Objekt mit genau einem " +"Mitglied" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant-Klasse »%c« wird nicht unterstützt" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Ungültige GVariant-Signatur" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "JSON-Daten sind leer" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Verarbeitungsfehler: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON-Daten müssen in UTF-8 kodiert sein" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Im JSONPath-Ausdruck ist nur ein einziger Root-Knoten erlaubt" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Auf den Root-Knoten folgt das ungültige Zeichen »%c«" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Ungültiger Slice-Ausdruck »%*s«" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Ungültige »set«-Definition »%*s«" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Ungültige »slice«-Definition »%*s«" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Ungültige Array-Index-Definition »%*s«" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Ungültiges erstes Zeichen »%c«" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Der Typ des aktuellen Knotens ist »%s«, aber ein Array oder Objekt wurde " +"erwartet." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"Der Index »%d« übersteigt die Größe des Arrays an der aktuellen Position." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"Der Index »%d« übersteigt die Größe des Objekts an der aktuellen Position." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "An der aktuellen Position ist kein Knoten verfügbar" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "An der aktuellen Position befindet sich ein »%s« und kein Array" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Der aktuelle Knoten hat den Typ »%s«, aber ein Objekt wurde erwartet." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "" +"Das Mitglied »%s« ist im Objekt an der aktuellen Position nicht definiert." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "An der aktuellen Position befindet sich ein »%s« und kein Objekt" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "" +"An der aktuellen Position befindet sich ein »%s«, welches kein Wert ist" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "An der aktuellen Position befindet sich kein Zeichenketten-Typ" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "An der aktuellen Position befindet sich kein Ganzzahl-Typ" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "An der aktuellen Position befindet sich kein Gleitkomma-Typ" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "An der aktuellen Position befindet sich kein boolescher Typ" diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..d833114 --- /dev/null +++ b/po/el.po @@ -0,0 +1,275 @@ +# Greek translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Dimitris Spingos , 2012. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-01-03 08:06+0000\n" +"PO-Revision-Date: 2014-01-04 10:25+0300\n" +"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" +"Language-Team: team@lists.gnome.gr\n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Ωραιοποίηση εξόδου" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Διαστήματα εσοχών" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: σφάλμα ανοίγματος αρχείου: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: σφάλμα ανάλυσης αρχείου: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: σφάλμα εγγραφής στην τυπική έξοδο" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: σφάλμα κλεισίματος: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "ΑΡΧΕΙΟ" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Μορφή αρχείων JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "το json-glib-format μορφοποιεί τους πόρους JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Σφάλμα ανάλυσης επιλογών της γραμμής εντολών: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Δοκιμάστε \"%s --help\" για περισσότερες πληροφορίες." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: λείπουν αρχεία" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Επικυρώστε αρχεία JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "το json-glib-validate επικυρώνει δεδομένα JSON στο δοσμένο URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Αναμένεται αντικείμενο JSON, αλλά ο αρχικός κόμβος είναι τύπου `%s'" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Αναπάντεχος τύπος '%s' σε κόμβο JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Λείπουν στοιχεία σε πίνακα JSON για συμφωνία με πλειάδα" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Λείπει το σύμβολο κλεισίματος ')' στον τύπο πλειάδας GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Αναπάντεχα πρόσθετα στοιχεία σε πίνακα JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Άκυρη τιμή συμβολοσειράς μετατροπής σε GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Μια καταχώριση λεξικού GVariant περιμένει ένα αντικείμενο JSON με ακριβώς " +"ένα μέλος" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Η κλάση GVariant '%c' δεν υποστηρίζεται" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Άκυρη υπογραφή GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Τα δεδομένα JSON είναι κενά" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Σφάλμα ανάλυσης: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Τα δεδομένα JSON πρέπει να είναι κωδικοποιημένα ως UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Μόνο ένας κόμβος υπερχρήστη επιτρέπεται σε μια έκφραση JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Κόμβος υπερχρήστη ακολουθούμενος από άκυρο χαρακτήρα '%c'" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Λείπει όνομα μέλους ή συμβόλου υποκατάστασης μετά τον χαρακτήρα ." + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Κακοσχηματισμένη έκφραση τεμαχισμού '%*s'" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Άκυρος ορισμός συνόλου '%*s'" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Άκυρος ορισμός τεμαχισμού '%*s'" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Άκυρος ορισμός δείκτη πίνακα '%*s'" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Άκυρος ο πρώτος χαρακτήρας '%c'" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Ο τρέχον κόμβος είναι τύπου '%s', αλλά αναμενόταν ένας πίνακας ή ένα " +"αντικείμενο." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"Ο δείκτης '%d' είναι μεγαλύτερος από το μέγεθος του πίνακα στην τρέχουσα " +"θέση." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"Ο δείκτης '%d' είναι μεγαλύτερος από το μέγεθος του αντικειμένου στην " +"τρέχουσα θέση." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Κανένας διαθέσιμος κόμβος στην τρέχουσα θέση" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Η τρέχουσα θέση περιέχει ένα '%s' και όχι ένα πίνακα" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Ο τρέχον κόμβος είναι του τύπου '%s', αλλά αναμενόταν ένα αντικείμενο." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Το μέλος '%s' δεν ορίζεται στο αντικείμενο στην τρέχουσα θέση." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Η τρέχουσα θέση περιέχει ένα '%s' και όχι ένα αντικείμενο" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Η τρέχουσα θέση περιέχει ένα '%s' και όχι μια τιμή" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "Η τρέχουσα θέση δεν περιέχει τύπο συμβολοσειράς" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "Η τρέχουσα θέση δεν περιέχει ακέραιο τύπο" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "Η τρέχουσα θέση δεν περιέχει τύπο κινητής υποδιαστολής" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "Η τρέχουσα θέση δεν περιέχει τύπο boolean" diff --git a/po/en_GB.po b/po/en_GB.po new file mode 100644 index 0000000..730a2d0 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,160 @@ +# British English translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-04 16:18+0000\n" +"PO-Revision-Date: 2012-09-04 16:18+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: British English \n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);;\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Expecting a JSON object, but the root node is of type `%s'" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Unexpected type '%s' in JSON node" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Missing elements in JSON array to conform to a tuple" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Missing closing symbol ')' in the GVariant tuple type" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "Unexpected extra elements in JSON array" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "Invalid string value converting to GVariant" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"A GVariant dictionary entry expects a JSON object with exactly one member" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant class '%c' not supported" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Invalid GVariant signature" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON data is empty" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: Parse error: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Only one root node is allowed in a JSONPath expression" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Root node followed by invalid character '%c'" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Malformed slice expression '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Invalid set definition '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Invalid slice definition '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Invalid array index definition '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"The current node is of type '%s', but an array or an object was expected." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"The index '%d' is greater than the size of the array at the current position." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"The index '%d' is greater than the size of the object at the current " +"position." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "No node available at the current position" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "The current position holds a '%s' and not an array" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "The current node is of type '%s', but an object was expected." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "The member '%s' is not defined in the object at the current position." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "The current position holds a '%s' and not an object" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "The current position holds a '%s' and not a value" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "The current position does not hold a string type" diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 0000000..4d57a38 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,170 @@ +# Esperanto translation for json-glib. +# Copyright (C) 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# Kristjan SCHMIDT , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-03-20 15:04+0000\n" +"PO-Revision-Date: 2013-04-01 18:26+0200\n" +"Last-Translator: Kristjan SCHMIDT \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Gtranslator 2.91.5\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Atendis JSON-objekton sed la radika nodo havas la tipon \"%s\"" + +#: ../json-glib/json-gvariant.c:540 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Neatendita tipo \"%s\" en JSON-nodo" + +#: ../json-glib/json-gvariant.c:610 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Elementoj mankas en la JSON-tabelo por esti konforma al tupelo" + +#: ../json-glib/json-gvariant.c:638 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Fermanta signo ')' mankas en la GVariant-tupelo-tipo" + +#: ../json-glib/json-gvariant.c:646 +msgid "Unexpected extra elements in JSON array" +msgstr "Neatenditaj pluaj elementoj en JSON-tabelo" + +#: ../json-glib/json-gvariant.c:925 +msgid "Invalid string value converting to GVariant" +msgstr "Nevalida signoĉena valoro por konverto al GVariant" + +#: ../json-glib/json-gvariant.c:981 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant-vortaro-enigo atendas JSON-objekton kun ekzakte unu membro" + +#: ../json-glib/json-gvariant.c:1237 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant-klaso '%c' ne estas subtenata" + +#: ../json-glib/json-gvariant.c:1285 +msgid "Invalid GVariant signature" +msgstr "Nevalida GVariant-subskribo" + +#: ../json-glib/json-gvariant.c:1333 +msgid "JSON data is empty" +msgstr "JSON-datumoj estas malplenaj" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Analiz-eraro: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Nur unu 'Root'-nodo estas permesata en JSONPath-esprimo" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "MalantaÅ­ la radika nodo sekvas nevalida signo \"%c\"" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Nevalida segment-esprimo \"%*s\"" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Nevalida \"set\"-difino \"%*s\"" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Nevalida segment-difino \"%*s\"" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Nevalida tebel-indeks-difino \"%*s\"" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"La tipo de la nuna nodo estas \"%s\", sed tabelo aÅ­ objekto estis atendita." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"La indekso '%d' estas pli grande ol la grando de la tabelo ĉe la aktuala " +"pozicio." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"La indekso '%d' estas pli grande ol la grando de la objekto ĉe la aktuala " +"pozicio." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "Neniu nodo estas ĉe la aktuala pozicio" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "La aktuala pozicio havas na '%s' kaj ne tabelon" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "La aktuala nodo havas la tipon '%s', sed objekto estis atendita." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "La membro '%s' ne estas definita en la objekto ĉe la aktuala pozicio." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "La aktuala pozicio havas na '%s' kaj ne objekton" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "La aktuala pozicio havas na '%s' kaj ne valoron" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "La aktuala pozicio ne havas signoĉenan tipon" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "La aktuala pozicio ne havas entjeran tipon" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "La aktuala pozicio ne havas glitkoman tipon" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "La aktuala pozicio ne havas bulean tipon" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..1becf9c --- /dev/null +++ b/po/es.po @@ -0,0 +1,272 @@ +# Spanish translation for json-glib. +# Copyright (C) 2011 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# FIRST AUTHOR , YEAR. +# Daniel Mustieles , 2011, 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-02 11:30+0000\n" +"PO-Revision-Date: 2013-12-09 15:59+0100\n" +"Last-Translator: Daniel Mustieles \n" +"Language-Team: Español \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Gtranslator 2.91.5\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Embellecer la salida" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Espacios de sangrado" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: error al abrir el archivo: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: error al analizar: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: error al escribir en la salida estándar" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: error al cerrar: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "ARCHIVO" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Formatear archivos JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatea recursos JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Error al analizar las opciones de la línea de comandos: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Pruebe «%s --help» para obtener más información." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: faltan archivos" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Validar archivos JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate valida los datos JSON del URI dado." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Se esperaba un objeto JSON, pero el nodo raíz es de tipo «%s»" + +#: ../json-glib/json-gvariant.c:540 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo «%s» no esperado en un nodo JSON" + +#: ../json-glib/json-gvariant.c:610 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Faltan elementos en el vector JSON para conformar una tupla" + +#: ../json-glib/json-gvariant.c:638 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Falta el símbolo de cierre «)» en la tupla de GVariant" + +#: ../json-glib/json-gvariant.c:646 +msgid "Unexpected extra elements in JSON array" +msgstr "Elementos adicionales no esperados en el vector JSON" + +#: ../json-glib/json-gvariant.c:925 +msgid "Invalid string value converting to GVariant" +msgstr "Valor de cadena no válido al convertir a GVariant" + +#: ../json-glib/json-gvariant.c:981 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Una entrada del diccionario de GVariant espera un objeto JSON con sólo un " +"miembro" + +#: ../json-glib/json-gvariant.c:1237 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Clase «%c» de GVariant no soportada" + +#: ../json-glib/json-gvariant.c:1285 +msgid "Invalid GVariant signature" +msgstr "Firma de GVariant no válida" + +#: ../json-glib/json-gvariant.c:1333 +msgid "JSON data is empty" +msgstr "Datos de JSON vacíos" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Error al analizr: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Los datos JSON deben estar codificados en UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Sólo se permite un nodo raíz en una expresión JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nodo raíz seguido de un carácter «%c» no válido" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Falta el nombre del miembro o el comodín después del «.»." + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Expresión de particionado «%*s» mal formada" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definición de conjunto no válida «%*s»" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definición de particionado no válida «%*s»" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definición de índice de vector no válida «%*s»" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Primer carácter «%c» no válido" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"El nodo actual es de tipo «%s», pero se esperaba un objeto o un vector." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"El índice «%d» es mayor que el tamaño del vector en la posición actual." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"El índice «%d» es mayor que el tamaño del objeto en la posición actual." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "No hay ningún nodo disponible en la posición actual" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "La posición actual tiene un «%s» y no un vector" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "El nodo actual es de tipo «%s», pero se esperaba un objeto." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "El miembro «%s» no está definido en el objeto en la posición actual." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "La posición actual tiene un «%s» y no un objeto" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "La posición actual tiene un «%s» y no un valor" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "La posición actual no tiene un tipo de cadena" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "La posición actual no tiene un tipo entero" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "La posición actual no tiene un tipo de coma flotante" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "La posición actual no tiene un tipo booleano" diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..b7141c7 --- /dev/null +++ b/po/et.po @@ -0,0 +1,123 @@ +# Estonian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Mattias Põldaru , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-10-28 12:31+0000\n" +"PO-Revision-Date: 2012-10-29 20:51+0300\n" +"Last-Translator: Mattias Põldaru \n" +"Language-Team: Estonian \n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Oodati JSON objekti, kuid juursõlme liik on '%s'" + +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON sõlmes esines ootamatu liik '%s'" + +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON massiivis puuduvad tuple'i moodustamiseks vajalikud elemendid" + +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Puuduv sulgev ')' sümbol GVariant tuple'is" + +msgid "Unexpected extra elements in JSON array" +msgstr "Ootamatud lisaelemendid JSON massiivis" + +msgid "Invalid string value converting to GVariant" +msgstr "Sobimatu sõne väärtus GVariandiks teisendamisel" + +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"GVariant dictionary kirje eeldab JSON objekti, milles on täpselt üks liige" + +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant klass '%c' pole toetatud" + +msgid "Invalid GVariant signature" +msgstr "Sobimatu GVariant-i allkiri" + +msgid "JSON data is empty" +msgstr "JSON ei sisalda andmeid" + +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: parsimise viga: %s" + +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Ainult juursõlm on lubatud JSONPath expression lauses" + +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Juursõlmele järgneb sobimatu märk '%c'" + +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Sobimatu tüki väljendus (slice expression) '%*s'" + +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Sobimatu kogu (set) definitsioon '%*s'" + +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Sobimatu tüki (slice) definitsioon '%*s'" + +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Sobimatu massiivi indeksi definitsioon '%*s'" + +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Praeguse sõlme liik on '%s', aga oodati massiivi või objekti." + +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Indeks '%d' on suurem kui massivi suurus praeguses asukohas." + +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Indeks '%d' on suurem kui objekti suurus praeguses asukohas." + +msgid "No node available at the current position" +msgstr "Praeguses asukohas pole saadaval ühtegi sõlme" + +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Praegune asukoht sisaldab '%s' ning see pole massiiv" + +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Praeguse sõlme liik on '%s', aga oodati objekti." + +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Liige '%s' ei ole defineeritud praeguses asukohas asuvas objektis." + +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Praegune asukoht sisaldab '%s', mitte objekti" + +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Praegune asukoht sisaldab '%s' ning mitte väärtust" + +msgid "The current position does not hold a string type" +msgstr "Praegune asukoht ei sisalda sõne liiki" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..d1a5e21 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,262 @@ +# Basque translation of jon-glib. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Iñaki Larrañaga Murgoitio , 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-04-03 17:32+0200\n" +"PO-Revision-Date: 2014-04-03 17:38+0200\n" +"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Koskatu irteera" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Koskaren zuriuneak" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: errorea fitxategia irekitzean: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: errorea fitxategia analizatzean: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: errorea irteera estandarrean idaztean" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: errorea ixtean: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FITXATEGIA" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "JSON fitxategien formatua." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "'json-glib-format'-ek JSON baliabideei formatu ematen die." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Errorea komando-lerroaren aukerak analizatzean: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Saiatu '%s --help' erabiltzen informazio gehiagorako." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: fitxategiak falta dira" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "JSON fitxategien balidazioa." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "" +"'json-glib-validate'-ek JSON datuen balidazioa egiten du emandako URIan." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "JSON objektu bat espero zen, baina erroaren nodoa '%s' motakoa da" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Ustekabeko '%s' mota JSON nodoan" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON matrizean elementuak falta dira tupla bat osatzeko" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Itxierako ')' ikurra falta da GVariant tupla motan" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Ustekabeko elementu gehigarriak JSON nodoan" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Baliogabeko kate-balioa GVariant-era bihurtzean" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"GVariant hiztegiaren sarrera batek JSON objektu bat espero du kide bakar " +"batekin soilik" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "'%c' GVariant klasea ez dago onartuta" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Baliogabeko GVariant sinadura" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "JSONen datuak hutsik daude" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: analisi-errorea: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON datuak UTF-8 kodeketan egon behar dute" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "" +"Soilik erroko nodo bakar bat dago baimenduta JSONPath adierazpen batean" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Erroko nodoaren ondoren baliogabeko '%c' karakterea dago" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Kidearen izena edo '.' karakterearen ondorengo izartxoa falta da" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Gaizki osatutako '%*s' adierazpen zatia" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "'%*s' multzoaren definizioa baliogabea" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Baliogabeko '%*s' definizio zatia" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Baliogabeko '%*s' matrizearen indizearen definizioa" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Aurreneko '%c' karakterea baliogabea" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Uneko nodoa '%s' motakoa da, baina matrize edo objektu bat espero zen." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "'%d' indizea uneko posizioko matrizearen tamaina baino handiagoa da." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "'%d' indizea uneko posizioko objektuaren tamaina baino handiagoa da ." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Ez dago nodorik erabilgarri uneko posizioan" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Uneko posizioak '%s' dauka, eta ez matrize bat" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Uneko nodoa '%s' motakoa da, baina objektu bat espero zen." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "'%s' kidea ez dago uneko posizioko objektuan definituta." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Uneko posizioak '%s' dauka, baina ez objektu bat" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Uneko posizioak '%s' dauka, baina ez balio bat" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Uneko posizioak ez dauka kate motakorik" + diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..1c40d36 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,267 @@ +# French translation of jon-glib. +# Copyright (C) 2012 json-glib COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Josselin TILLAY-DOLEDEC , 2012 +# Claude Paroz , 2014 +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-11 10:21+0000\n" +"PO-Revision-Date: 2014-03-11 22:43+0100\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: GNOME French Team \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Formatage indenté" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Espaces d'indentation" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s : %s : erreur d'ouverture du fichier : %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s : %s : erreur d'analyse du fichier : %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s : %s : erreur d'écriture vers stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s : %s : erreur de fermeture : %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FICHIER" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Mise en forme de fichiers JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format met en forme des ressources JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Erreur d'analyse des options de la ligne de commande : %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s : fichiers manquants" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Validation de fichiers JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate valide des données JSON à l'URI indiquée." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Objet de type JSON attendu mais le nœud racine est de type « %s »" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Type « %s » inattendu dans le nœud JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Éléments manquants dans le tableau JSON pour être conforme à un tuple" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Symbole fermant « ) » manquant dans le tuple GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Éléments supplémentaires inattendus dans le tableau JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Chaîne de caractères invalide pour la conversion en GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Une entrée de dictionnaire GVariant requiert un objet JSON contenant un seul " +"membre" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Classe GVariant « %c » non prise en charge" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Signature GVariant non valide" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Les données JSON sont vides" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Erreur d'analyse : %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Les données JSON doivent être codées en UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Un seul nœud racine autorisé dans une expression JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nœud racine suivi d'un caractère invalide « %c »" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Nom de membre ou caractère joker manquant après un caractère « . »" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Expression de segmentation malformée « %*s »" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Définition d'ensemble invalide « %*s »" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Définition de segmentation invalide « %*s »" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Définition d'indice de tableau invalide « %*s »" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Premier caractère « %c » non valide" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Le nœud courant est de type « %s » mais un tableau ou un objet était attendu." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"L'indice « %d » est plus grand que la taille du tableau à la position " +"actuelle." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"L'indice « %d » est plus grand que la taille de l'objet indiqué à la " +"position actuelle." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "Aucun nœud disponible à cette position." + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "" +"La position actuelle contient un élément de type « %s » et non un tableau" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Le nœud actuel est de type « %s » mais un objet était attendu." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "" +"Le membre « %s » n'est pas défini dans l'objet à la position actuelle." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "" +"La position actuelle contient un élément de type « %s » et non un objet" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "" +"La position actuelle contient un élément de type « %s » et non une valeur" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "La position actuelle ne contient pas une chaîne de caractères" diff --git a/po/fur.po b/po/fur.po new file mode 100644 index 0000000..58d5d52 --- /dev/null +++ b/po/fur.po @@ -0,0 +1,157 @@ +# Friulian translation for json-glib. +# Copyright (C) 2013 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Fabio Tomat , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-07-20 10:25+0000\n" +"PO-Revision-Date: 2013-08-20 15:12+0100\n" +"Last-Translator: Fabio Tomat \n" +"Language-Team: Friulian \n" +"Language: fur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Si spiete un ogjet JSON, ma il grop lidrîs al è dal tipo \"%s\"" + +#: ../json-glib/json-gvariant.c:540 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo \"%s\" no spietât tal grop JSON" + +#: ../json-glib/json-gvariant.c:610 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "A mancjin ogjets tal array JSON par conformitât a une tuple" + +#: ../json-glib/json-gvariant.c:638 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Al mancje il simbul ')' di siaradure tal tipo tuple GVariant" + +#: ../json-glib/json-gvariant.c:646 +msgid "Unexpected extra elements in JSON array" +msgstr "Elements di plui no spietâts tal array JSON" + +#: ../json-glib/json-gvariant.c:925 +msgid "Invalid string value converting to GVariant" +msgstr "Valôrs di stringhe no valits te conversion a JSON" + +#: ../json-glib/json-gvariant.c:981 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Une vôs di dizionari GVariant a domandave un ogjet JSON cun precîs un membri" + +#: ../json-glib/json-gvariant.c:1237 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Classe GVariant '%c' no supuartade" + +#: ../json-glib/json-gvariant.c:1285 +msgid "Invalid GVariant signature" +msgstr "Firme GVariant no valide" + +#: ../json-glib/json-gvariant.c:1333 +msgid "JSON data is empty" +msgstr "I dâts JSON a son vueits" + +#: ../json-glib/json-parser.c:831 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: erôr di analisi: %s" + +#: ../json-glib/json-path.c:436 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "A si amet dome un grop lidrîs intune espression JSON" + +#: ../json-glib/json-path.c:445 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Grop lidrîs seguît da caratar no valit '%c'" + +#: ../json-glib/json-path.c:551 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Espression slice '%*s' scrite mâl" + +#: ../json-glib/json-path.c:595 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definizion di set '%*s' no valide" + +#: ../json-glib/json-path.c:648 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definizion di slice '%*s' no valide" + +#: ../json-glib/json-path.c:676 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definizion di indiç array '%*s' no valide" + +#: ../json-glib/json-reader.c:470 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Il tipo di grop curint al è \"%s\", ma si spietave un array o un ogjet." + +#: ../json-glib/json-reader.c:482 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "L'indiç '%d' al è plui grant de dimension dal array ae posizion atuâl." + +#: ../json-glib/json-reader.c:499 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "L'indiç '%d' al è plui grant de dimension dal ogjet ae posizion atuâl." + +#: ../json-glib/json-reader.c:583 ../json-glib/json-reader.c:736 +#: ../json-glib/json-reader.c:787 ../json-glib/json-reader.c:825 +#: ../json-glib/json-reader.c:863 ../json-glib/json-reader.c:901 +#: ../json-glib/json-reader.c:939 ../json-glib/json-reader.c:984 +#: ../json-glib/json-reader.c:1020 ../json-glib/json-reader.c:1046 +msgid "No node available at the current position" +msgstr "Nissun grop disponibil ae posizion atuâl." + +#: ../json-glib/json-reader.c:590 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "La posizion atuâl a ten un \"%s\" e no un array" + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Il tipo di grop atuâl al è \"%s\", ma si spietave un ogjet." + +#: ../json-glib/json-reader.c:660 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Nol è definît il membri \"%s\" tal ogjet ae posizion atuâl." + +#: ../json-glib/json-reader.c:743 ../json-glib/json-reader.c:794 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "La posizion atuâl a ten un \"%s\" e no un ogjet" + +#: ../json-glib/json-reader.c:834 ../json-glib/json-reader.c:872 +#: ../json-glib/json-reader.c:910 ../json-glib/json-reader.c:948 +#: ../json-glib/json-reader.c:993 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "La posizion atuâl a ten un \"%s\" e no un valôr" + +#: ../json-glib/json-reader.c:956 +msgid "The current position does not hold a string type" +msgstr "La posizion atuâl no ten un tipo stringhe" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..82b24e0 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,267 @@ +# Galician translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Fran Dieguez , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2013-12-19 01:12+0100\n" +"PO-Revision-Date: 2013-12-19 01:13+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: gnome-l10n-gl@gnome.org\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Mellorar saída" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Espazos de sangrado" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: erro ao abrir o ficheiro: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: error ao analizar o ficheiro: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: erro ao escribir na saída estándar" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: erro ao pechar: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "FICHEIRO" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Formatea de ficheiros JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "Os recursos de JSON de json-glib-format." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Produciuse un erro ao analizar as opcións de liña de ordes: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Tente \"%s --help\" para máis información." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: ficheiros omitidos" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Validar ficheiros JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate valida os datos JSON dunha URI fornecida." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Agardábase un obxecto JSON, pero o nodo raíz é de tipo «%s»" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo «%s» non agardado nun nodo JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Faltan elementos no vector JSON para conformar unha tupla" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Falta o símbolo de peche «)» na tupla de GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Elementos adicionais non agardados no vector JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Valor de cadea non válido ao converter a GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Unha entrada do dicionario e GVariant agarda un obxecto JSON con só un membro" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Clase «%c» de GVariant non admitida" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Firma de GVariant non válida" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Datos de JSON baleiros" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: erro de análise: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Os datos JSON deben ter a codificación UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Só se permite un nodo raíz nunha expresión JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nodo raíz seguido dun carácter «%c» non válido" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Falta o nome do membro ou comodín logo do caracter «.»" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Expresión de particionado «%*s» mal formada" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definición de conxunto non válida «%*s»" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definición de particionado non válida «%*s»" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definición de índice de vector non válida «%*s»" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Primeiro caracter «%c» non válido" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "O nodo actual é de tipo «%s», pero agardábase un obxecto ou un vector." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "O índice «%d» é maior que o tamaño do vector na posición actual." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "O índice «%d» é maior que o tamaño do obxecto na posición actual." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Non hai ningún nodo dipoñíbel na posición actual" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "A posición actual ten un «%s» e non un vector" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "O nodo actual é de tipo «%s», pero agardábase un obxecto." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "O membro «%s» non está definido no obxecto na posición actual." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "A posición actual ten un «%s» e non un obxecto" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "A posición actual ten un «%s» e non un valor" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "A posición actual non ten un tipo de cadea" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "A posición actual non ten un tipo enteiro" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "A posición actual non ten un tipo de coma flotante" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "A posición actual non ten un tipo booleano" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..fe885be --- /dev/null +++ b/po/he.po @@ -0,0 +1,263 @@ +# Hebrew translations for json-glib package. +# Copyright (C) 2014 THE json-glib'S COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# יוסף אור בוצ׳קו , 2014. +# Yosef Or Boczko , 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib 0.17.1\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2014-01-26 05:31+0200\n" +"PO-Revision-Date: 2014-01-26 05:32+0200\n" +"Last-Translator: Yosef Or Boczko \n" +"Language-Team: עברית <>\n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.6\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Prettify output" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Indentation spaces" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: error opening file: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: error parsing file: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: error writing to stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: error closing: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "FILE" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Format JSON files." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formats JSON resources." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Error parsing commandline options: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Try \"%s --help\" for more information." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: missing files" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Validate JSON files." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate validates JSON data at the given URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Expecting a JSON object, but the root node is of type `%s'" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Unexpected type '%s' in JSON node" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Missing elements in JSON array to conform to a tuple" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Missing closing symbol ')' in the GVariant tuple type" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Unexpected extra elements in JSON array" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Invalid string value converting to GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"A GVariant dictionary entry expects a JSON object with exactly one member" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant class '%c' not supported" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Invalid GVariant signature" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON data is empty" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Parse error: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON data must be UTF-8 encoded" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Only one root node is allowed in a JSONPath expression" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Root node followed by invalid character '%c'" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Missing member name or wildcard after . character" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Malformed slice expression '%*s'" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Invalid set definition '%*s'" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Invalid slice definition '%*s'" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Invalid array index definition '%*s'" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Invalid first character '%c'" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"The current node is of type '%s', but an array or an object was expected." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"The index '%d' is greater than the size of the array at the current position." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"The index '%d' is greater than the size of the object at the current " +"position." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "No node available at the current position" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "The current position holds a '%s' and not an array" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "The current node is of type '%s', but an object was expected." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "The member '%s' is not defined in the object at the current position." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "The current position holds a '%s' and not an object" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "The current position holds a '%s' and not a value" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "The current position does not hold a string type" diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..40c5114 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,160 @@ +# Hindi translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# chandankumar , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-18 16:29+0000\n" +"PO-Revision-Date: 2012-09-20 10:33+0530\n" +"Last-Translator: chandankumar \n" +"Language-Team: Hindi \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.4\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "एक JSON वस्तु की उम्मीद है, लेकिन रूट नोड प्रकार `%s' हैं " + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "अनपेक्षित प्रकार '%s' JSON नोड में" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "एक टपल अनुरूप करने के लिए JSON सरणी में गुम तत्वों " + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr " GVariant टपल प्रकार में समापन प्रतीक ')' गुम" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON सरणी में अप्रत्याशित अतिरिक्त तत्वों" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant को करने के लिए परिवर्तित अवैध स्ट्रिंग मान " + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"GVariant शब्दकोश प्रविष्टि को वास्तव में एक सदस्य के साथ एक JSON वस्तु की " +"उम्मीद है" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant वर्ग '%c' समर्थित नहीं है" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "अवैध GVariant हस्ताक्षर" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON डेटा खाली है" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: व्याख्या त्रुटि: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "एक JSONPath अभिव्यक्ति में केवल एक रूट नोड की अनुमति दी है" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "अवैध अक्षर '%c' के बाद रूट नोड " + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "विकृत स्लाइस अभिव्यक्ति '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "अमान्य सेट परिभाषा '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "अवैध स्लाइस परिभाषा '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "अवैध सरणी सूचकांक परिभाषा '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"वर्तमान नोड प्रकार '%s' में से एक है, लेकिन एक सरणी या एक वस्तु की उम्मीद थी." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "सूचकांक '%d' वर्तमान स्थिति में सरणी के आकार की तुलना में अधिक है." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "सूचकांक '%d' वर्तमान स्थिति में वस्तु के आकार की तुलना में अधिक है." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "वर्तमान स्थिति में कोई नोड उपलब्ध नहीं " + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "मौजूदा स्थिति के पास '%s' हैं और सरणी नहीं है." + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "वर्तमान नोड प्रकार '%s' में से एक है, लेकिन एक वस्तु की उम्मीद थी." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "सदस्य '%s' वर्तमान स्थिति में वस्तु में परिभाषित नहीं है." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "वर्तमान स्थिति के लिए '%s' और कोई ऑब्जेक्ट आयोजित नहीं है" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "वर्तमान स्थिति के लिए '%s' और कोई मान आयोजित नहीं है" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "वर्तमान स्थिति के लिए स्ट्रिंग प्रकार नहीं है" + diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..7dc0696 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,262 @@ +# Hungarian translation of json-glib +# Copyright (C) 2012. Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# +# Gabor Kelemen , 2012, 2014. +# Balázs Úr , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-19 10:19+0000\n" +"PO-Revision-Date: 2014-03-21 18:09+0100\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.4\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Kimenet csinosítása" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Behúzási szóközök" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: hiba a fájl megnyitásakor: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: hiba a fájl feldolgozásakor: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: hiba a szabványos kimenetre íráskor" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: hiba a következő lezárásakor: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FÁJL" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "JSON fájlok formázása." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "A json-glib-format JSON erőforrásokat formáz." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Hiba a parancssori kapcsolók feldolgozásakor: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "További információkért adja ki a következő parancsot: „%s --help”." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: hiányzó fájlok" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "JSON fájlok ellenőrzése." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "" +"A json-glib-validate a megadott URI-n található JSON adatokat ellenőrzi." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "A várt JSON objektum helyett a gyökérobjektum „%s” típusú" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Váratlan „%s” típus a JSON csomópontban" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "A JSON tömbből hiányzó elemek miatt a tuple nem teljes" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Hiányzó „)” szimbólum a GVariant tuple típusban" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Váratlan extra elemek a JSON tömbben" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Érvénytelen karakterláncérték a GVariant-tá alakítás közben" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Egy GVariant szótárbejegyzés pontosan egy tagú JSON objektumot vár" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "A(z) „%c” GVariant osztály nem támogatott" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Érvénytelen GVariant aláírás" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "A JSON adatok üresek" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: feldolgozási hiba: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "A JSON adatoknak UTF-8 kódolásúnak kell lenniük" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Csak egy gyökércsomópont engedélyezett a JSONPath kifejezésben" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "A gyökércsomópontot érvénytelen karakter követi: „%c”" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Hiányzó tagnév vagy helyettesítő karakter a . után" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Hibás szeletkifejezés: „%*s”" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Érvénytelen halmazdefiníció: „%*s”" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Érvénytelen szeletdefiníció: „%*s”" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Érvénytelen tömbindex-definíció: „%*s”" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Érvénytelen első karakter: „%c”" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "A jelenlegi csomópont „%s” típusú a várt tömb vagy objektum helyett." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "A(z) „%d” index nagyobb az aktuális pozícióban lévő tömb méreténél." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"A(z) „%d” index nagyobb az aktuális pozícióban lévő objektum méreténél." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Nem érhető el csomópont az aktuális pozícióban" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Az aktuális pozícióban „%s” található tömb helyett" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "A jelenlegi csomópont „%s” típusú a várt objektum helyett." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "" +"A(z) „%s” tag nincs definiálva az aktuális pozícióban lévő objektumban." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Az aktuális pozícióban „%s” található objektum helyett" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Az aktuális pozícióban „%s” található érték helyett" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Az aktuális pozícióban nem karakterlánc típus található" + diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..3fb51ad --- /dev/null +++ b/po/id.po @@ -0,0 +1,259 @@ +# Indonesian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Andika Triwidada , 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 14:30+0000\n" +"PO-Revision-Date: 2014-01-02 23:38+0700\n" +"Last-Translator: Andika Triwidada \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 1.5.7\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Percantik keluaran" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Spasi indentasi" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: galat saat membuka berkas: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: galat saat mengurai berkas: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: galat saat menulis ke stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: galat saat menutup: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "BERKAS" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Memformat berkas JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format memformat sumber daya JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Galat saat mengurai opsi baris perintah: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Cobalah \"%s --help\" untuk lebih banyak informasi." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: kurang berkas" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Validasikan berkas JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate memvalidasi data JSON pada URI yang diberikan." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Mengharapkan objek JSON, tapi node akar bertipe '%s'" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipe '%s' yang tak diharapkan dalam node JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Kehilangan elemen dalam larik JSON untuk memenuhi syarat sebagai tuple" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Kehilangan simbol penutup ')' dalam tipe tuple GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Elemen ekstra yang tak diharapkan dalam larik JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Nilai string tak valid saat mengonversi ke GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Suatu entri kamus GVariant mengharapkan objek JSON dengan tepat satu anggota" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Kelas '%c' GVariant tak didukung" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Tanda tangan GVariant tak valid" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Data JSON kosong" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Galat mengurai: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Data JSON mesti ter-enkode UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Hanya satu node akar yang diijinkan dalam ekspresi JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Node akar diikuti oleh karakter tak valid '%c'" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Kurang nama anggota atau wildcard setelah karakter . (titik)" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Ekspresi slice '%*s' salah bentuk" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definisi set '%*s' tak valid" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definisi slice '%*s' tak valid" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definisi indeks larik '%*s' tak valid" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Karakter pertama '%c' tak valid" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Node kini bertipe '%s', tapi larik atau objek yang diharapkan." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Indeks '%d' lebih besar daripada ukuran larik pada posisi kini." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Indeks '%d' lebih besar daripada ukuran objek pada posisi kini." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Node tak tersedia pada posisi kini" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Posisi kini menampung '%s' dan bukan suatu larik" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Node kini bertipe '%s', tapi yang diharapkan adalah objek." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Anggota '%s' tak didefinisikan dalam objek pada posisi kini." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Posisi kini menampung '%s' dan bukan suatu objek" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Posisi kini menampung '%s' dan bukan suatu nilai" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "Posisi kini tak menampung suatu tipe string" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..b359440 --- /dev/null +++ b/po/it.po @@ -0,0 +1,265 @@ +# Italian translation for json-glib. +# Copyright (C) 2012, 2013 json-glib's copyright holder +# This file is distributed under the same license as the json-glib package. +# Luca Ferretti , 2012. +# Milo Casagrande , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2013-12-11 10:43+0100\n" +"PO-Revision-Date: 2013-12-11 10:47+0100\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Gtranslator 2.91.6\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Output abbellito" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Spazi di rientro" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: errore nell'aprire il file: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: errore nell'analizzare il file: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: errore nello scrivere su stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: errore nel chiudere: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "FILE" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Formatta i file JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatta le risorse JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Errore nell'analizzare le opzioni a riga di comando: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Per maggiori informazioni, usare \"%s --help\"." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: mancano dei file" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Convalida i file JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate convalida i dati JSON trovati all'URI fornito." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Atteso un oggetto JSON, ma il nodo radice è del tipo \"%s\"" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo \"%s\" inatteso nel nodo JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Elementi mancanti nell'array JSON per conformità a una tupla" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Simbolo ')' di chiusra mancante nel tipo tupla GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Elementi aggiuntivi inattesi nell'array JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Valore di stringa non valido nella conversione a JSON" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Una voce di dizionario GVariant richiese un oggetto JSON con esattamente un " +"membro" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Classe GVariant '%c' non supportata" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Firma GVariant non valida" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "I dati JSON sono vuoti" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: errore di analisi: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "I dati JSON devono essere codificati in UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "È consentito un solo nodo radice in una espressione JSON" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nodo radice seguito dal carattere non valido '%c'" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "" +"Manca il nome del membro o un carattere speciale dopo il carattere \".\"" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Espressione slice '%*s' malformata" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definizione di set '%*s' non valida" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definizione di slice '%*s' non valida" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definizione di indice array '%*s' non valida" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Primo carattere \"%c\" non valido" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"Il tipo del nodo corrente è \"%s\", ma era atteso un array o un oggetto." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"L'indice '%d' è maggiore della dimensione dell'array alla posizione corrente." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"L'indice '%d' è maggiore della dimensione dell'oggetto alla posizione " +"corrente." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Nessun nodo disponibile alla posizione corrente" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "La posizione corrente contiene un \"%s\" e non un array" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Il tipo del nodo corrente è \"%s\", ma era atteso un oggetto." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Non è definito il membro \"%s\" nell'oggetto alla posizione corrente." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "La posizione corrente contiene un \"%s\" e non un oggetto" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "La posizione corrente contiene un \"%s\" e non un valore" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "La posizione corrente non contiene un tipo stringa" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..d6a09b4 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,158 @@ +# json-glib ja.po +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Takayuki KUSANO , 2012. +# Jiro Matsuzawa , 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib\n" +"POT-Creation-Date: 2013-09-18 22:27+0900\n" +"PO-Revision-Date: 2013-09-18 22:29+0900\n" +"Last-Translator: Jiro Matsuzawa \n" +"Language-Team: Japanese \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "JSON オブジェクトであるべきところ、ルートノードが `%s' 型です" + +#: ../json-glib/json-gvariant.c:540 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON ノードが `%s' 型になってしまってます" + +#: ../json-glib/json-gvariant.c:610 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON の配列にタプルを構成する要素が足りません" + +#: ../json-glib/json-gvariant.c:638 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant タプル型に閉じ記号 ')' がありません" + +#: ../json-glib/json-gvariant.c:646 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON 配列に余計な要素があります" + +#: ../json-glib/json-gvariant.c:925 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant に変換するのに無効な文字列です" + +#: ../json-glib/json-gvariant.c:981 +msgid "A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant の辞書エントリはメンバーを一つだけ含んだ JSON オブジェクトでなくてはなりません" + +#: ../json-glib/json-gvariant.c:1237 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant のクラス '%c' はサポートされていません" + +#: ../json-glib/json-gvariant.c:1285 +msgid "Invalid GVariant signature" +msgstr "無効な GVariant シグネチャです" + +#: ../json-glib/json-gvariant.c:1333 +msgid "JSON data is empty" +msgstr "JSON データが空です" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: パースエラー: %s" + +#: ../json-glib/json-path.c:436 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath 式ではルートノード一つだけが許可されています" + +#: ../json-glib/json-path.c:445 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "ルートノードの後に無効な文字 '%c' があります" + +#: ../json-glib/json-path.c:551 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "不正なスライス式 '%*s'" + +#: ../json-glib/json-path.c:595 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "無効な集合定義 '%*s'" + +#: ../json-glib/json-path.c:648 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "無効なスライス定義: '%*s'" + +#: ../json-glib/json-path.c:676 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "無効な配列インデックス定義 '%*s'" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "The current node is of type '%s', but an array or an object was expected." +msgstr "現在のノードは '%s' 型ですが、配列あるいはオブジェクトである必要があります。" + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "The index '%d' is greater than the size of the array at the current position." +msgstr "インデックス '%d' は現在位置にある配列の長さよりも大きいです。" + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "The index '%d' is greater than the size of the object at the current position." +msgstr "インデックス '%d' は現在位置のオブジェクトの大きさよりも大きいです。" + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "現在位置にノードがありません" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "現在位置は '%s' で、配列ではありません" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "現在のノードは '%s' 型ですが、オブジェクトである必要があります。" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "現在位置のオブジェクトで '%s' メンバーは定義されていません" + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "現在位置は '%s' で、オブジェクトではありません" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "現在位置は '%s' で値ではありません" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "現在位置が文字列型ではありません" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "現在位置が整数型ではありません" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "現在位置が浮動小数点型ではありません" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "現在位置が論理値型ではありません" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..da7e142 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,258 @@ +# Korean translation for json-glib. +# Copyright (C) 2012 Seong-ho Cho et al. +# This file is distributed under the same license as the json-glib package. +# Seong-ho Cho , 2012, 2013, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-16 10:16+0000\n" +"PO-Revision-Date: 2014-03-15 02:04+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 1.5.5\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "출력 정돈" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "들여쓰기 공백" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: 파일 여는 중 오류: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: 파일 해석 중 오류: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: 표준 출력 쓰는 중 오류" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: 닫는 중 오류: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "<파일>" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "JSON 파일의 코드를 정렬합니다." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format이 JSON 자료 코드를 정렬합니다." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "명령줄 옵션 해석 중 오류: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "더 많은 내용은 \"%s --help\"를 실행하십시오." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: 파일이 빠졌습니다" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "JSON 파일을 검증합니다." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate는 주어진 URI의 JSON 데이터를 검증합니다." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "JSON 객체를 예상했지만 최상위 노드는 `%s' 형식입니다" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON 노드에 예상치 못한 '%s' 형식이 있습니다" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "튜플에 따르기 위한 JSON 배열의 요소가 빠졌습니다" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant 튜플 형식에서 ')' 닫음 심볼이 빠졌습니다" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON 배열에 예상치 못한 추가 요소가 있습니다" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant로 변환하려는 문자열 값이 잘못되었습니다" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"GVariant 딕셔너리 항목은 정확히 하나의 요소를 가진 JSON 객체를 요구합니다" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant '%c' 클래스를 지원하지 않습니다" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "잘못된 GVariant 서명입니다" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON 데이터가 비었습니다" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: 해석 오류: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON 데이터는 UTF-8로 인코딩해야 합니다" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath 표현식에서는 단 하나만의 최상위 노드를 허용합니다" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "최상위 노드에 잘못된 '%c' 문자가 따라옵니다" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "멤버 이름 또는 구두점 문자 다음 와일드카드가 빠졌습니다" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "잘못된 분배 표현식 '%*s'" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "잘못된 셋 정의 '%*s'" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "잘못된 분배 정의 '%*s'" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "잘못된 배열 인덱스 정의 '%*s'" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "잘못된 첫번째 문자 '%c'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "현재 노드는 '%s' 형식 이지만, 배열 또는 객체를 요구합니다." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "현재 위치의 인덱스 '%d'번은 배열의 크기보다 큽니다." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "현재 위치의 '%d'번 인덱스는 객체의 크기보다 큽니다." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "현재 위치에 노드가 없습니다" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "현재 위치에 배열이 아닌 '%s'이(가) 있습니다" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "현재 노드는 '%s' 형식이지만 객체를 요구합니다." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "현재 위치 객체에 '%s' 구성원을 정의하지 않았습니다." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "현재 위치에 객체가 아닌 '%s'이(가) 있습니다" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "현재 위치에 값이 아닌 '%s'이(가) 있습니다" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "현재 위치에 문자열 값이 없습니다" diff --git a/po/ky.po b/po/ky.po new file mode 100644 index 0000000..02cb3a0 --- /dev/null +++ b/po/ky.po @@ -0,0 +1,161 @@ +# Kirghiz translation for json-glib. +# Kyrgyz translation of json-glib +# Copyright (C) 2012 json-glib authors +# This file is distributed under the same license as the json-glib package. +# +# Timur Zhamakeev , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-24 08:27+0000\n" +"PO-Revision-Date: 2013-01-05 18:22+0600\n" +"Last-Translator: Timur Zhamakeev \n" +"Language-Team: Kirghiz \n" +"Language: ky\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 1.4\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "JSON объекти күтүлүүдө, бирок башкы түйүн `%s' тибинде" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON түйүнүндө күтүлбөгөн тип: '%s' " + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON массивинде кортежге ылайык келүүчү элементтер жок" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant кортеж тибинде жабылуучу ')' тамгасы жок" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON массивинде күтүлбөгөн кошумча элементтер" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant тибине которуу үчүн берилген саптын мааниси туура эмес" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant сөздүк элементи, бир гана мүчөлүү JSON объекти болушу керек" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "'%c' GVariant классы колдоого ээ эмес" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "GVariant сигнатурасы туура эмес" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON маалыматы жок" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: Ажыратып окуу катасы: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath туюнтмасында бир гана башкы түйүн болушу мүмкүн" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Башкы түйүн туура эмес тамга менен аяктаган: '%c'" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Туура эмес кесүү (slice) туюнтмасы '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Туура эмес ыйгаруу (set) аныктамасы '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Туура эмес кесүү (slice) аныктамасы '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Массив индексинин туура эмес аныктамасы '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Учурдагы түйүн '%s' тибинде; массив же объект күтүлгөн." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Учурдагы позициянын индекси:'%d' массивдин узундугунан чоң." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"Учурдагы позициянын индекси:'%d'; объектин узундугунан " +"чоң." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "Учурдагы позицияда түйүн жок" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Учурдагы позицияда:'%s'; ал массив эмес" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Учурдагы түйүн '%s' тибинде; объект күтүлгөн." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Учурку позициядагы объекте '%s' аттуу мүчө аныкталган эмес." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Учурдагы позицияда:'%s'; ал объект эмес" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Учурдагы позицияда:'%s'; ал маани эмес" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "Учурдагы позициянын тиби, саптык тип эмес" + + diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..ffc1a02 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,258 @@ +# Lithuanian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Aurimas Černius , 2012, 2013, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-02-21 10:16+0000\n" +"PO-Revision-Date: 2014-02-21 23:18+0200\n" +"Last-Translator: Aurimas Černius \n" +"Language-Team: Lietuvių \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Gtranslator 2.91.6\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Graži iÅ¡vestis" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Ä®trauka tarpais" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: klaida atveriant failą: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: klaida skaitant failą: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: klaida raÅ¡ant į standartinę iÅ¡vestį" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: klaida užveriant: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FAILAS" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formatuoti JSON failus." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatuoja JSON resursus." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Klaida skaitant komandų eilutės parametrus: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Daugiau informacijos gausite įvykdę „%s --help“." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: trÅ«ksta failų" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Tikrinti JSON failus." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate patikrina JSON duomenis ties pateiktu URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Tikimasi JSON objekto, bet Å¡akninė virÅ¡Å«nė yra „%s“ tipo" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Netikėtas tipas „%s“ JSON virÅ¡Å«nėje" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "TrÅ«ksta elementų JSON masyve junginiui sudaryti" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "TrÅ«ksta uždarančio simbolio „)“ GVariant junginio tipe" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Netikėti papildomi elementai JSON masyve" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Netinkama eilutės reikÅ¡mė konvertavimui į GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant žodyno įraÅ¡as tikisi JSON objekto su vieninteliu nariu" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant klasė „%c“ nepalaikoma" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Netinkamas GVariant apraÅ¡as" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON duomenys yra tuÅ¡ti" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: skaitymo klaida: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON duomenys turi bÅ«ti koduoti UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath iÅ¡raiÅ¡koje leidžiamas vienintelė Å¡akninė virÅ¡Å«nė" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Po Å¡akninės virÅ¡Å«nės yra netinkamas simbolis „%c“" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "TrÅ«ksta nario pavadinimo arba pakaitos simbolio po . simbolio" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Blogai suformuota dalinimo iÅ¡raiÅ¡ka „%*s“" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Netinkamas aibės apibrėžimas „%*s“" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Netinkamas dalinimo apibrėžimas „%*s“" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Netinkamas masyvo apibrėžimas „%*s“" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Netinkamas pirmasis simbolis „%c“" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Dabartinė virÅ¡Å«nė yra „%s“ tipo, bet tikėtasi masyvo arba objekto." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Indeksas „%d“ yra didesnis nei masyvo dydis dabartinėje pozicijoje." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Indeksas „%d“ yra didesnis nei objekto dydis dabartinėje pozicijoje." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "Nėra virÅ¡Å«nės dabartinėje pozicijoje" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Dabartinėje pozicijoje yra „%s“, o ne masyvas" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Dabartinė virÅ¡Å«nė yra „%s“ tipo, bet tikėtasi objekto." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Narys „%s“ neapibrėžtas dabartinėje pozicijoje esančiame objekte." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Dabartinė pozicija turi „%s“, o ne objektą" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Dabartinė pozicija turi „%s“, o ne reikÅ¡mę" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "Dabartinė pozicija turi „%s“, o ne eilutės tipą" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..6396528 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,260 @@ +# Latvian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# RÅ«dolfs Mazurs , 2012, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-07 10:18+0000\n" +"PO-Revision-Date: 2014-03-07 16:52+0200\n" +"Last-Translator: RÅ«dolfs Mazurs \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" +"X-Generator: Lokalize 1.5\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Izskaistināt izvadi" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Atkāpes atstarpes" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: kļūda, atverot datni: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: kļūda, parsējot datni: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s, kļūda, rakstot uz stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: kļūda aizverot: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "DATNE" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formatēt JSON datnes." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatē JSON resursus." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Kļūda, parsējot komandrindas opcijas — %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Lietojiet “%s --help”, lai uzzinātu vairāk." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: iztrÅ«kstoÅ¡as datnes" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "PārbaudÄ«t JSON datnes." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate pārbauda JSON datus dotajā URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "GaidÄ«ja JSON objektu, bet saknes mezglam ir tips “%s”" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "NegaidÄ«ts tips “%s” JSON mezglā" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON masÄ«vā trÅ«kst elementu, lai tas atbilstu kortežam" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant korteža tipā trÅ«kst aizverošā simbola “%s”" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON masÄ«vā ir negaidÄ«ti papildu elementi" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Pārveidojot uz GVariant, nederÄ«ga virknes vērtÄ«ba" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"GVariant vārdnÄ«cas ieraksts gaidÄ«ja JSON objektu ar tieÅ¡i vienu locekli" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant klase “%c” nav atbalstÄ«ta" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "NederÄ«gs GVariant paraksts" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON dati ir tukÅ¡i" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: parsēšanas kļūda — %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON datiem ir jābÅ«t UTF-8 kodējumā" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath izteiksmē ir atļauta tikai viens saknes mezgls" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Pēc saknes mezgla seko nederÄ«ga rakstzÄ«me “%c”" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "TrÅ«kst locekļa nosaukums vai aizstājējzÄ«me pēc . rakstzÄ«mes" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Slikti formēta gabala izteiksme “%*s”" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "NederÄ«ga kopas definÄ«cija “%*s”" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "NederÄ«ga gabala definÄ«cija “%*s”" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "NederÄ«ga masÄ«va indeksa definÄ«cija “%*s”" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "NederÄ«ga pirmā rakstzÄ«me “%c”" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "PaÅ¡reizējam mezglam ir tips “%s”, bet tika gaidÄ«ts masÄ«vs vai objekts." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Indekss “%d” dotajā pozÄ«cijā ir lielāks kā masÄ«va izmērs." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Indekss “%d” dotajā pozÄ«cijā ir lielāks kā objekta izmērs." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "Å ajā pozÄ«cija nav pieejams neviens mezgls" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Å ajā pozÄ«cijā ir “%s”, nevis masÄ«vs" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "PaÅ¡reizējam mezglam ir tips “%s”, bet tika gaidÄ«ts objekts." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Å ajā pozÄ«cijā objektā loceklis “%s” nav definēts." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Å ajā pozÄ«cijā ir “%s”, nevis objekts" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Å ajā pozÄ«cijā ir “%s”, nevis vērtÄ«ba" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "Å ajā pozÄ«cijā nav virknes tipa" + diff --git a/po/ml.po b/po/ml.po new file mode 100644 index 0000000..3a5bb47 --- /dev/null +++ b/po/ml.po @@ -0,0 +1,155 @@ +# Malayalam translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Anish A , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-02-11 20:00+0000\n" +"PO-Revision-Date: 2013-02-14 21:57+0530\n" +"Last-Translator: Jishnu Mohan \n" +"Language-Team: Swatantra Malayalam Computing\n" +"Language: ml\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "`%s' അണ് റൂട്ട് നോഡിന്റെ തരം, പക്ഷേ JSON ഒബ്ജക്ട് ആണ് പ്രതീക്ഷിച്ചത്" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON node ല്‍ '%s'എന്ന പ്രതീക്ഷിക്കാത്ത തരം" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON അറേയില്‍ ടപ്പിള്‍ ആകാനായുള്ള കാര്യങ്ങള്‍ കാണുന്നില്ല" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant ടപ്പിള്‍ തരത്തില്‍ തീരുന്ന ചിഹ്നം ')' കാണുന്നില്ല" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON അറേയില്‍ വിചാരിക്കാത്ത അധികം കാര്യങ്ങള്‍" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant ലേക്ക് മാറ്റുന്ന അസാധുവായ വാചകം" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "ഒരേ ഒരു അംഗമുള്ള JSON ഒബ്ജക്റ്റിനെ GVariant നിഘണ്ടു എന്ട്രി പ്രതീക്ഷിക്കുന്നു" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "'%c' എന്ന GVariant തരം പിന്‍തുണയ്ക്കുന്നില്ല" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "അസാധുവായ GVariant ഒപ്പ്" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON ഡാറ്റ ശൂന്യം" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: പാഴ്സ് പിഴവ്: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath എക്സ്പ്രഷനില്‍ ഒരു റൂട്ടേ അനുവദിനീയമായിട്ടുള്ളു" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "റൂട്ട് നോഡിന് ശേഷം തെറ്റായ അക്ഷരം '%c'" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "തെറ്റായ സ്ലൈസ് എക്സ്പ്രഷന്‍ '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "'%*s' എന്നത് തെറ്റായ കൂട്ടം നിര്‍വചനമാണ്" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "'%*s' എന്നത് തെറ്റായ സ്ലൈസ് നിര്‍വചനമാണ്" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "'%*s' എന്നത് തെറ്റായ അറേ ഇന്റെക്സ് നിര്‍വചനമാണ്" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "ഇപ്പോഴത്തെ നോഡിന്റെ തരം '%s' ആണ്, പക്ഷേ ഒരു അറേയോ ഒബ്ജക്റ്റോ ആണ് പ്രതീക്ഷിച്ചത്." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "ഇപ്പോഴത്തെ സ്ഥാനത്തുള്ള അറേയുടെ വലിപ്പത്തെക്കാള്‍ വലുതാണ് ഇന്‍ഡെക്സ് '%d'" + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "ഇപ്പോഴത്തെ സ്ഥാനത്തുള്ള ഒബ്ജക്റ്റിന്റെ വലിപ്പത്തെക്കാള്‍ വലുതാണ് ഇന്‍ഡെക്സ് '%d'" + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "ഈ സ്ഥാനത്ത് ഒരു നോഡുമില്ല" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "അപ്പോഴത്തെ സ്ഥാനത്ത് '%s' ആണ് ഒരു അറേ അല്ല" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "ഇപ്പോഴത്തെ നോഡിന്റെ തരം '%s' ആണ്, പക്ഷേ ഒരു ഒബ്ജക്റ്റ് ആണ് പ്രതീക്ഷിച്ചത്." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "ഇപ്പോഴത്തെ സ്ഥാനത്തെ ഒബ്ജക്റ്റില്‍ '%s' എന്ന അംഗം നിര്‍വ്വചിച്ചിട്ടില്ല." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "അപ്പോഴത്തെ സ്ഥാനത്ത് '%s' ആണ് ഒരു ഒബ്ജക്ട്ട് അല്ല" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "അപ്പോഴത്തെ സ്ഥാനത്ത് '%s' ആണ് ഒരു മൂല്യം അല്ല" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "അപ്പോഴത്തെ സ്ഥാനത്ത് ഒരു വാചകം അല്ല" diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..f9f7f4a --- /dev/null +++ b/po/nb.po @@ -0,0 +1,255 @@ +# Norwegian bokmÃ¥l translation of json-glib. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Kjartan Maraas , 2011-2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib 0.12.x\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2014-02-12 19:46+0100\n" +"PO-Revision-Date: 2014-02-12 19:47+0100\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Kjartan Maraas \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FIL" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formater JSON-filer." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: mangler filer" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Valider JSON-filer." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "" + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Forventet et JSON-objekt, men rotnoden er av type «%s»" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Uventet type «%s» i JSON-node" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Uventede ekstra elementer i JSON-tabell" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Ugyldig strengverdi ved konvertering til GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant-klasse «%c» er ikke støttet" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Ugyldig signatur for GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON-datastruktur er tom" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Tolkefeil: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON-data mÃ¥ være kodet i UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Kun en rotnode tillates i et JSONPath-uttrykk" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Rotnode etterfulgt av ugyldig tegn «%c»" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Ugyldig definisjon av sett «%*s»" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "Ingen node tilgjengelig i denne posisjonen" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "" + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Medlem «%s» er ikke definert i objekt ved nÃ¥værende posisjon." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "NÃ¥værende posisjon innholder en «%s» og ikke et objekt" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "NÃ¥værende posisjon inneholder en «%s» og ikke en verdi" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "NÃ¥værende posisjon inneholder ikke en streng-type" diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..e7252df --- /dev/null +++ b/po/or.po @@ -0,0 +1,160 @@ +# Oriya translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Manoj Kumar Giri , 2012. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-08-06 14:04+0000\n" +"PO-Revision-Date: 2012-08-09 18:26+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"Language: or\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.4\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "ଏକ JSON ବସ୍ତୁକୁ ଆଶାକରୁଅଛି, କିନ୍ତୁ ରୁଟର ନୋଡ `%s' ପ୍ରକାରର ଅଟେ" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON ନୋଡରେ ଆଶାକରାଯାଇନଥିବା ପ୍ରକାର '%s'" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "ଏକ tuple କୁ ନିଶ୍ଚିତ କରିବା ପାଇଁ JSON ଆରେରେ ଅନୁପସ୍ଥିତ ଉପାଦାନ" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant tuple ପ୍ରକାରରେ ବନ୍ଦ କରିବା ଚିହ୍ନ ')' ନାହିଁ" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON ଆରେର ଆଶାକରାଯାଇନଥିବା ଅତିରିକ୍ତ ଉପାଦାନ" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant କୁ ପରିବର୍ତ୍ତନ କରୁଥିବା ଅବୈଧ ବାକ୍ୟ ଖଣ୍ଡ ମୂଲ୍ୟ" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "ଏକ GVariant ଅଭିଧାନ ନିବେଶ ଗୋଟିଏ JSON ବସ୍ତୁକୁ ଗୋଟିଏ ସଦସ୍ୟ ସହିତ ଆଶାକରିଥାଏ" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant ଶ୍ରେଣୀ '%c' ସମର୍ଥିତ ନୁହଁ" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "ଅବୈଧ GVariant ହସ୍ତାକ୍ଷର" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON ତଥ୍ୟ ନାହିଁ" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: ବିଶ୍ଳେଷଣ ତ୍ରୁଟି: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "କେବଳ ଗୋଟିଏ ମୂଖ୍ୟ ଚାଳକ ନୋଡ JSONPath ଅଭିବ୍ୟକ୍ତିରେ ଅନୁମତି ପ୍ରାପ୍ତ" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "ଅବୈଧ ଅକ୍ଷର '%c' ଦ୍ୱାରା ମୂଖ୍ୟ ଚାଳକ ନୋଡ" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "ତ୍ରୁଟିଯୁକ୍ତ ଖଣ୍ଡ ଅଭିବ୍ୟକ୍ତି '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "ଅବୈଧ ସେଟ ସଂଜ୍ଞା '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "ଅବୈଧ ଖଣ୍ଡ ସଂଜ୍ଞା '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "ଅବୈଧ ଆରେ ଅନୁକ୍ରମଣିକା ସଂଜ୍ଞା '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "" +"ପ୍ରଚଳିତ ନୋଡଟି '%s' ପ୍ରକାରର ଅଟେ, କିନ୍ତୁ ଏକ ଆରେ ଅଥବା ବସ୍ତୁ ଆଶାକରାଯାଇଥିଲା।" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "ଅନୁକ୍ରମଣିକା '%d' ଟି ପ୍ରଚଳିତ ଅବସ୍ଥାନରେ ଆରେ ଆକାର ଠାରୁ ବଡ଼ ଅଟେ।" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "ଅନୁକ୍ରମଣିକା '%d' ଟି ପ୍ରଚଳିତ ଅବସ୍ଥାନରେ ବସ୍ତୁ ଆକାର ଠାରୁ ବଡ଼ ଅଟେ।" + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "ପ୍ରଚଳିତ ଅବସ୍ଥାନରେ କୌଣସି ନୋଡ ଉପଲବ୍ଧ ନାହିଁ।" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "ପ୍ରଚଳିତ ଅବସ୍ଥାନ ଏକ '%s' କୁ ଧାରଣ କରିଥାଏ ଏବଂ କୌଣସି ଆରେକୁ ଧାରଣ କରିନଥାଏ" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "ପ୍ରଚଳିତ ନୋଡଟି '%s' ପ୍ରକାରର ଅଟେ, କିନ୍ତୁ ଏକ ବସ୍ତୁକୁ ଆଶାକରୁଥିଲା।" + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "'%s' ସଦସ୍ୟଟି ପ୍ରଚଳିତ ଅବସ୍ଥାନରେ ବସ୍ତୁ ପାଖରେ ବ୍ୟାଖ୍ୟା କରିନାହିଁ।" + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "" +"ପ୍ରଚଳିତ ଅବସ୍ଥାନ ଏକ '%s' କୁ ଧାରଣ କରିଥାଏ କିନ୍ତୁ କୌଣସି ବସ୍ତୁକୁ ଧାରଣ କରିନଥାଏ" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "ପ୍ରଚଳିତ ଅବସ୍ଥାନ ଏକ '%s' ଧାରଣ କରିଥାଏ କିନ୍ତୁ କୌଣସି ମୂଲ୍ୟ ଧାରଣ କରିନଥାଏ" + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "ପ୍ରଚଳିତ ଅବସ୍ଥାନ କୌଣସି ବାକ୍ୟଖଣ୍ଡ ପ୍ରକାର ଧାରଣ କରିନଥାଏ" + + diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..1d8321a --- /dev/null +++ b/po/pa.po @@ -0,0 +1,158 @@ +# Punjabi translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# A S Alam , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-02-11 20:00+0000\n" +"PO-Revision-Date: 2013-02-26 07:26+0530\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi/Panjabi \n" +"Language: pa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.5\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "JSON ਆਬਜੈਕਟ ਦੀ ਮੰਗ ਸੀ, ਪਰ ਰੂਟ ਨੋਡ ਦੀ ਕਿਸਮ `%s' ਹੈ" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON ਨੋਡ ਵਿੱਚ ਅਣਜਾਣ ਕਿਸਮ '%s'" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON ਅਰੇ ਵਿੱਚ ਟਪਲ ਦੇਣ ਵਾਲੇ ਐਲੀਮੈਂਟ ਗੁੰਮ ਹਨ" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant ਟਪਲ ਕਿਸਮ ਵਿੱਚ ')' ਬੰਦ ਕਰਨ ਨਿਸ਼ਾਨ ਗੁੁੰਮ ਹੈ" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON ਅਰੇ ਵਿੱਚ ਵਾਧੂ ਐਲੀਮੈਂਟ ਦੀ ਮੰਗ ਸੀ" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant ਲਈ ਬਦਲਣ ਲਈ ਗਲਤ ਸਤਰ ਮੁੱਲ" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant ਡਿਕਸ਼ਨਰੀ ਐਂਟਰਈ ਲਈ ਇੱਕ ਮੈਂਬਰ ਲਈ ਠੀਕ JSON ਆਬਜੈਕਟ ਦੀ ਮੰਗ ਸੀ" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant ਕਲਾਸ '%c' ਸਹਾਇਕ ਨਹੀਂ" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "ਅਢੁੱਕਵਾਂ GVariant ਦਸਤਖਤ" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON ਡਾਟਾ ਖਾਲੀ ਹੈ।" + +#: ../json-glib/json-parser.c:825 +#, c-format +#| msgid "%s:%d: Parse error: %s" +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: ਪਾਰਸ ਗਲਤੀ: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath ਸਮੀਕਰਨ ਵਿੱਚ ਇੱਕ ਰੂਟ ਨੋਡ ਹੀ ਮਨਜ਼ੂਰ ਸੀ" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "ਗਲਤ ਅੱਖਰ '%c' ਦੇ ਬਾਅਦ ਰੂਟ ਨੋਡ" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "ਨਿਕਾਰਾ ਭਾਗ ਸਮੀਕਰਨ '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "ਗਲਤ ਸੈੱਟ ਪ੍ਰੀਭਾਸ਼ਾ '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "ਗਲਤ ਭਾਗ ਪ੍ਰੀਭਾਸ਼ਾ '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "ਗਲਤ ਅਰੇ ਇੰਡੈਕਸ ਪ੍ਰੀਭਾਸ਼ਾ '%*s'" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "ਮੌਜੂਦਾ ਨੋਡ ਦੀ '%s' ਕਿਸਮ ਹੈ, ਪਰ ਅਰੇ ਜਾਂ ਆਬਜੈਕਟ ਦੀ ਮੰਗ ਸੀ।" + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "ਇੰਡੈਕਸ '%d' ਮੌਜੂਦਾ ਸਥਿਤੀ ਉੱਤੇ ਅਰੇ ਦੇ ਆਕਾਰ ਤੋਂ ਵੱਧ ਹੈ।" + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "ਇੰਡੈਕਸ '%d' ਮੌਜੂਦਾ ਸਥਿਤੀ ਉੱਤੇ ਆਬਜੈਕਟ ਦੇ ਆਕਾਰ ਤੋਂ ਵੱਧ ਹੈ।" + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "ਮੌਜੂਦਾ ਸਥਿਤੀ ਉੱਤੇ ਕੋਈ ਵੀ ਨੋਡ ਉਪਲੱਬਧ ਨਹੀਂ" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "ਮੌਜੂਦਾ ਸਥਿਤੀ '%s' ਰੱਖਦੀ ਹੈ ਨਾ ਕਿ ਅਰੇ" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "ਮੌਜੂਦਾ ਨੋਡ ਦੀ '%s' ਕਿਸਮ ਹੈ, ਪਰ ਆਬਜੈਕਟ ਦੀ ਮੰਗ ਸੀ।" + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "ਮੈਂਬਰ '%s' ਨੂੰ ਮੌਜੂਦਾ ਸਥਿਤੀ ਉੱਤੇ ਆਬਜੈਕਟ ਵਿੱਚ ਪ੍ਰਭਾਸ਼ਿਤ ਹੈ।" + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "ਮੌਜੂਦਾ ਸਥਿਤੀ '%s' ਰੱਖਦੀ ਹੈ ਨਾ ਕਿ ਆਬਜੈਕਟ" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "ਮੌਜੂਦਾ ਸਥਿਤੀ '%s' ਰੱਖਦੀ ਹੈ, ਮੁੱਲ ਨਹੀਂ" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "ਮੌਜੂਦਾ ਸਥਿਤੀ ਸਤਰ ਕਿਸਮ ਨਹੀਂ ਰੱਖਦਾ ਹੈ" + diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..3124a55 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,263 @@ +# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +# Aviary.pl +# Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz +# pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas: +# gnomepl@aviary.pl +# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +# Piotr Drąg , 2011-2014. +# Aviary.pl , 2011-2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib\n" +"POT-Creation-Date: 2014-03-03 01:04+0100\n" +"PO-Revision-Date: 2014-03-02 01:05+0100\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: Poland\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Ładniejsze wyjście" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Spacje wcięcia" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: błąd podczas otwierania pliku: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: błąd podczas przetwarzania pliku: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: błąd podczas zapisywania do standardowego wyjścia" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: błąd podczas zamykania: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "PLIK" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formatuje pliki JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formatuje zasoby JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Błąd podczas przetwarzania opcji wiesza poleceń: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Wykonanie polecenia \"%s --help\" wyświetli więcej informacji." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: brak plików" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Sprawdza pliki JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate sprawdza dane JSON na podanym adresie URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Oczekiwano obiektu JSON, ale typ głównego węzła to \"%s\"" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Nieoczekiwany typ \"%s\" w węźle JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Brak elementów w tablicy JSON, aby zgadzało się z krotką" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Brak zamykającego symbolu \")\" w typie krotki GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Nieoczekiwane dodatkowe elementy w tablicy JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Nieprawidłowa wartość ciągu konwertowanego do GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Wpis słownika GVariant oczekuje obiektu JSON z dokładnie jednym elementem" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Klasa GVariant \"%c\" jest nieobsługiwana" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Nieprawidłowy podpis GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Dane JSON są puste" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: błąd przetwarzania: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Dane JSON muszą być zakodowane w UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Dozwolony jest tylko jeden węzeł główny w wyrażeniu JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Po węźle głównym występuje nieprawidłowy znak \"%c\"" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Brak nazwy elementu lub wieloznacznika po znaku ." + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Błędnie sformatowane wyrażenie plasterka \"%*s\"" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Nieprawidłowe określenie zestawu \"%*s\"" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Nieprawidłowe określenie plasterka \"%*s\"" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Nieprawidłowe określenie indeksu tablicy \"%*s\"" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Nieprawidłowy pierwszy znak \"%c\"" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Bieżący węzeł jest typu \"%s\", a oczekiwano tablicy lub obiektu." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Indeks \"%d\" jest większy niż rozmiar tablicy w bieżącym położeniu." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Indeks \"%d\" jest większy niż rozmiar obiektu w bieżącym położeniu." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "Brak węzłów dostępnych w bieżącym położeniu" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Bieżące położenie przechowuje \"%s\", a nie tablicę" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Bieżący węzeł jest typu \"%s\", a oczekiwano obiektu." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Element \"%s\" nie jest określony w obiekcie w bieżącym położeniu." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Bieżące położenie przechowuje \"%s\", a nie obiekt" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Bieżące położenie przechowuje \"%s\", a nie wartość" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "Bieżące położenie nie przechowuje typu ciągu" diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..2d99151 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,257 @@ +# json-glib's Portuguese translation. +# Copyright © 2012, 2013, 2014 json-glib +# This file is distributed under the same license as the json-glib package. +# Duarte Loreto , 2012, 2013, 2014. +# +msgid "" +msgstr "" +"Project-Id-Version: 3.12\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-18 22:21+0000\n" +"PO-Revision-Date: 2014-03-18 23:30+0100\n" +"Last-Translator: Duarte Loreto \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Embelezar resultado" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Espaços da indentação" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: erro ao abrir ficheiro: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: erro ao processar ficheiro: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: erro ao escrever para stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: erro ao fechar: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "FICHEIRO" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Formatar ficheiros JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formata recursos JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Erro ao processar opções de linha de comandos: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Tente \"%s --help\" para mais informações." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: faltam ficheiros" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Validar ficheiros JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate valida dados JSON no URI indicado." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Esperado um objeto JSON, mas o nó raiz é do tipo `%s'" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo '%s' inesperado no nó JSON" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Elementos em falta na lista JSON para respeitar uma enupla" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Falta o símbolo de fecho ')' no tipo de enupla GVariant" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Elementos extra inesperados na lista JSON" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Valor inválido de expressão ao converter em GVariant" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Uma entrada de dicionário GVariant espera um objeto JSON com exatamente um " +"membro" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Classe GVariant '%c' não suportada" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Assinatura GVariant inválida" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "Dados JSON estão vazios" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Erro de processamento: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "Dados JSON têm de estar codificados em UTF-8" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Apenas um nó raiz é permitido numa expressão JSONPath" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nó raiz seguido do caracter inválido '%c'" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Falta nome de membro ou caráter global após caráter ." + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Expressão '%*s' de fatia mal-formada" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definição inválida de conjunto '%*s'" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definição inválida de fatia '%*s'" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definição inválida de índice de lista '%*s'" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Primeiro caráter '%c' inválido" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "O nó atual é do tipo '%s', mas era esperada uma lista ou um objeto." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "O índice '%d' é maior do que o tamanho da lista na posição atual." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "O índice '%d' é maior do que o tamanho do objeto na posição atual." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Nenhum nó disponível na posição atual" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "A posição atual contém um '%s' e não uma lista" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "O nó atual é do tipo '%s', mas era esperado um objeto." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "O membro '%s' não está definido no objeto da posição atual." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "A posição atual contém um '%s' e não um objeto" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "A posição atual contém um '%s' e não um valor" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "A posição atual não contém um tipo expressão" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..96b71d3 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,271 @@ +# Brazilian Portuguese translation for json-glib. +# Copyright (C) 2013 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Gabriel Speckhahn , 2012. +# Enrico Nicoletto , 2013. +# Rafael Ferreira , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 00:13+0000\n" +"PO-Revision-Date: 2013-12-19 11:01-0300\n" +"Last-Translator: Rafael Ferreira \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 1.5.7\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Saída formatada" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Espaços de recuo" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: erro ao abrir arquivo: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: erro ao analisar arquivo: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: erro ao gravar na saída padrão" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: erro ao fechar: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "ARQUIVO" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Formatar arquivos JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format formata recursos JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Ocorreu erro ao analisar as opções de linha de comando: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Tente \"%s --help\" para mais informações." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: arquivos em falta" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Validar arquivos JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate valida dados JSON no URI fornecido." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Objeto JSON esperado, porém o nó raiz é do tipo \"%s\"" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Tipo inesperado \"%s\" no nó JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Faltam elementos no vetor JSON para que se forme uma tupla" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Símbolo de fechamento \")\" ausente no tipo de tupla GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Elementos adicionais inesperados no vetor JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Valor string inválido ao converter para GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Uma entrada de dicionário GVariant espera um objeto JSON com exatamente um " +"membro" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Não há suporte para a classe GVariant \"%c\"" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Assinatura GVariant inválida" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Dados JSON vazios" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d%d: Erro na análise: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Os dados JSON devem possuir codificação UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Apenas um nó raiz é permitido em uma expressão JSONPath" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Nó raiz seguido de caractere inválido \"%c\"" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Faltando nome de membro ou coringa após o caractere \".\"" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Expressão de corte \"%*s\" má formada" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Definição de conjunto \"%*s\" inválida." + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Definição de corte \"%*s\" inválida" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Definição de índice de vetor %*s\" inválida" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Primeiro caractere \"%c\" inválido" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "O nó atual é do tipo \"%s\", mas um vetor ou objeto era esperado." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "O índice \"%d\" é maior do que o tamanho do vetor na posição atual." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "O índice \"%d\" é maior do que o tamanho do objeto na posição atual." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Nenhum nó disponível na posição atual" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "A posição atual detém um \"%s\" e não um vetor" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "O nó atual é do tipo \"%s\", mas um objeto era esperado." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "O membro \"%s\" não está definido no objeto na posição atual." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "A posição atual detém um \"%s\" e não um objeto" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "A posição atual detém um \"%s\" e não um valor" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "A posição atual não detém um tipo string" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "A posição atual não detém um tipo inteiro" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "A posição atual não detém um tipo de ponto flutuante" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "A posição atual não detém um tipo booleano" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..5b60ba7 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,271 @@ +# Russian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Юрий Козлов , 2012. +# Yuri Myasoedov , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-10 22:18+0000\n" +"PO-Revision-Date: 2014-03-11 12:23+0300\n" +"Last-Translator: Yuri Myasoedov \n" +"Language-Team: русский \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Выводить в удобочитаемой форме" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Отступы" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: не удалось открыть файл: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: не удалось разобрать файл: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: не удалось записать в стандартный вывод" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: не удалось закрыть: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "ФАЙЛ" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Форматирование файлов JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format форматирует ресурсы JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Не удалось разобрать параметры командной строки: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Используйте «%s --help» для получения подробной информации." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: отсутствуют файлы" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Проверка корректности файлов JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "" +"json-glib-validate проверяет корректность данных JSON по заданному URI." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Ожидается объект JSON, но корневой узел имеет тип «%s»" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Неожиданный тип «%s» в узле JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Отсутствуют элементы в массиве JSON для соответствия кортежу" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Отсутствует закрывающий символ «)» в кортеже типа GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Неожиданные дополнительные символы в массиве JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Некорректное строковое значение для преобразования к GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Элемент словаря GVariant должен быть объектом JSON с единственным членом" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Класс GVariant «%c» не поддерживается" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Недопустимая подпись GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Данные JSON отсутствуют" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: ошибка разбора: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Данные JSON должны быть в кодировке UTF-8" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "В выражении JSONPath может быть только один корневой узел" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Корневой узел заканчивается некорректным символом «%c»" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Отсутствует имя члена или шаблон после символа «.»" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Неправильное выражение среза «%*s»" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Неверное определение присвоения «%*s»" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Неверное определение среза «%*s»" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Неверное определение индекса массива «%*s»" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Неверный первый символ «%c»" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Текущий узел имеет тип «%s», но ожидается массив или объект." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "В текущей позиции индекс «%d» больше размера массива." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "В текущей позиции индекс «%d» больше размера объекта." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "В текущей позиции отсутствует узел" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "В текущей позиции содержится «%s», а не массив" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Текущий узел имеет тип «%s», но ожидается объект." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "В текущей позиции член «%s» не определён в объекте." + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "В текущей позиции содержится «%s», а не объект" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "В текущей позиции содержится «%s», а не значение" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "В текущей позиции не содержится строковое значение" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "В текущей позиции не содержится значения целого" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "В текущей позиции не содержится значения с плавающей точкой" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "В текущей позиции не содержится логического значения" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..cf3d5cc --- /dev/null +++ b/po/sk.po @@ -0,0 +1,159 @@ +# Slovak translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Pavol Klačanský , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-11-16 23:22+0000\n" +"PO-Revision-Date: 2012-11-17 20:46+0100\n" +"Last-Translator: Pavol Klačanský \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Očakáva sa objekt JSON, ale koreňový uzol je typu „%s“" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Neočakávaný typ „%s“ v uzle JSON" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Chýbajú prvky v poli JSON na zmenu n-tice" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Chýba uzatvárací symbol „)“ v type n-tica pre GVariant" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "Neočakávané nadbytočné prvky v poli JSON" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "Neplatná hodnota reÅ¥azca, ktorý sa má konvertovaÅ¥ na typ GVariant" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Položka typu slovník pre GVariant očakáva objekt JSON s presne jedným členom" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Trieda pre GVariant „%c“ nie je podporovaná" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Neplatný podpis pre GVariant" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "Dáta JSON sú prázdne" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Chyba analýzy: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Vo výraze JSONPath môže byÅ¥ len jeden koreňový uzol" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Za koreňovým uzlom je neplatný znak „%c“" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Chybný výraz „%*s“ pre výsek" + +# MČ: set sa zväčša prekladá ako množina, vyhovoval by tento výraz? +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Neplatná definícia množiny „%*s“" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Neplatná definícia výseku „%*s“" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Neplatná definícia indexu poľa „%*s“" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Bolo očakávané pole alebo objekt, ale aktuálny uzol je typu „%s“." + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "" +"Index s hodnotou „%d“ poľa na aktuálnej pozícii je väčší ako jeho veľkosÅ¥." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "" +"Index s hodnotou „%d“ objektu na aktuálnej pozícii je väčší ako jeho veľkosÅ¥." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "Na aktuálnej pozícii nie je dostupný žiadny uzol" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Na aktuálnej pozícii je „%s“ a nie pole" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Bol očakávaný objekt, ale aktuálny uzol je typu „%s“." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Člen „%s“ nie je definovaný v objekte na aktuálnej pozícii." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Na aktuálnej pozícii je „%s“ a nie objekt" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Na aktuálnej pozícii je „%s“ a nie hodnota" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "Na aktuálnej pozícii je „%s“ a nie reÅ¥azec" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..ff87fc1 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,268 @@ +# Slovenian translation for json-glib. +# Copyright (C) 2011 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Matej Urbančič , 2011-2014. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-31 09:49+0000\n" +"PO-Revision-Date: 2014-04-03 20:37+0100\n" +"Last-Translator: Matej Urbančič \n" +"Language-Team: Slovenian GNOME Translation Team \n" +"Language: sl_SI\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "OlepÅ¡aj odvod" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Presledki zamika" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: napaka odpiranja datoteke: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: napaka razčlenjevanja datoteke: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: napaka pisanja na standardni odvod" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: napaka zapiranja: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "DATOTEKA" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Oblikuj datoteke JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "Možnost json-glib-format oblikuje zapis virov JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Napaka med razčlenjevanjem možnosti ukazne vrstice: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Poskusite \"%s --help\" za več podrobnosti." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: manjkajoče datoteke" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Overi datoteke JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "Možnost json-glib-validate overi podatke JSON za podani naslov URI." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Pričakovan je predmet JSON, vendar pa je korensko vozlišče vrste `%s'" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Nepričakovana vrsta '%s' v vozlišču JSON" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Manjkajo predmeti v polju JSON za skladnost z n-terico." + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Manjka zaključni znak ')' v vrsti n-terice GVariant" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Nepričakovan dodatni predmet polja JSON" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Neveljavna vrednost niza med pretvarjanjem v GVariant" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Slovar GVariant pričakuje predmet JSON z natanko enim določilom" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Razred GVariant '%c' ni podprt." + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Neveljaven podpis GVariant" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "Podatki JSON so prazni" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: napaka razčlenjevanje: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "Podatki JSON morajo biti kodirani v naboru UTF-8" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Le eno korensko vozlišče je dovoljeno v izrazu JSONPath" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Korensko vozlišče se konča z neveljavnim znakom '%c'" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Manjka ime člana ali pa nadomestni znak po znaku . (pika)" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Napačno oblikovan izraz rezine '%*s'" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Neveljavno določilo '%*s'" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Neveljavno določilo rezine '%*s'" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Neveljavno določilo kazala polja '%*s'" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Neveljaven prvi znak '%c'" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Trenutno vozlišče je vrste '%s', pričakovano pa je polje ali predmet." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Kazalo '%d' je večje od velikosti polja na trenutnem položaju." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Kazalo '%d' je večje od velikosti predmeta na trenutnem položaju." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Na trenutnem položaju ni razpoložljivega vozlišča." + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Trenutni položaj vsebuje '%s' in ne polja" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Trenutno vozlišče je vrste '%s', pričakovan pa je predmet." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Določilo '%s' ni določan v predmetu na trenutnem položaju." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Trenutni položaj vsebuje '%s' in ne predmeta" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Trenutni položaj vsebuje '%s' in ne vrednosti" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Trenutni položaj ne vsebuje niza" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "Trenutni položaj ne vsebuje celega Å¡tevila" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "Trenutni položaj ne vsebuje plavajoče vejice" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "Trenutni položaj ne vsebuje logične izraza" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..e8d1513 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,257 @@ +# Serbian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Мирослав Николић , 2011 — 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib json-glib-0-14\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-20 22:24+0000\n" +"PO-Revision-Date: 2014-03-21 03:58+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Излаз улепшавања" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Размаци за увлачење" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: грешка отварања датотеке: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: грешка обраде датотеке: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: грешка писања на стандардни излаз" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: грешка затварања: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "ДАТОТЕКА" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Обликујте ЈСОН датотеке." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "„json-glib-format“ обликује ЈСОН изворишта." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Грешка обраде опција линије наредби: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Пробајте „%s --help“ за више података." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: недостају датотеке" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Потврдите ЈСОН датотеке." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "„json-glib-validate“ потврђује ЈСОН податке и дату путању." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Очекујем ЈСОН објекат, али корени чвор је врсте „%s“" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Неочекивана врста „%s“ у ЈСОН чвору" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Недостају елементи у ЈСОН низу да би био у складу са n-торком" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Недостаје симбол затварања „)“ у врсти n-торке Гваријанта" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Неочекивани додатни елементи у ЈСОН низу" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Неисправна вредност ниске претварајући у Гваријант" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Унос речника Гваријанта очекује ЈСОН објекат са тачно једним чланом" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Разред Гваријанта „%c“ није подржан" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Неисправан потпис Гваријанта" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "ЈСОН подаци су празни" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Грешка обраде: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "ЈСОН подаци морају бити у УТФ-8 кодирању" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Само један корени чвор је допуштен у изразу ЈСОНПутање" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "За кореним чвором следи неисправан знак „%c“" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Недостаје назив члана или џокер након знака тачке (.)" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Неисправан израз исечка „%*s“" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Неисправна одредница скупа „%*s“" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Неисправна одредница исечка „%*s“" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Неисправна одредница регистра низа „%*s“" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Неисправан први знак „%c“" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Тренутни чвор је врсте „%s“, али је очекиван низ или објекат." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Регистар „%d“ је већи од величине низа на тренутном положају." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Регистар „%d“ је већи од величине објекта на тренутном положају." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Ниједан чвор није доступан на тренутном положају" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Тренутни положај садржи „%s“ а не низ" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Тренутни чвор је врсте „%s“, али је очекиван објекат." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Члан „%s“ није одређен у објекту на тренутном положају." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Тренутни положај садржи „%s“ а не објекат" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Тренутни положај садржи „%s“ а не вредност" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Тренутни положај не садржи врсту ниске" diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..124e5e3 --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,257 @@ +# Serbian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Miroslav Nikolić , 2011 — 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib json-glib-0-14\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-20 22:24+0000\n" +"PO-Revision-Date: 2014-03-21 03:58+0200\n" +"Last-Translator: Miroslav Nikolić \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Izlaz ulepÅ¡avanja" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Razmaci za uvlačenje" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: greÅ¡ka otvaranja datoteke: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: greÅ¡ka obrade datoteke: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: greÅ¡ka pisanja na standardni izlaz" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: greÅ¡ka zatvaranja: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "DATOTEKA" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Oblikujte JSON datoteke." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "„json-glib-format“ oblikuje JSON izvoriÅ¡ta." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "GreÅ¡ka obrade opcija linije naredbi: %s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Probajte „%s --help“ za viÅ¡e podataka." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: nedostaju datoteke" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Potvrdite JSON datoteke." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "„json-glib-validate“ potvrđuje JSON podatke i datu putanju." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Očekujem JSON objekat, ali koreni čvor je vrste „%s“" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Neočekivana vrsta „%s“ u JSON čvoru" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Nedostaju elementi u JSON nizu da bi bio u skladu sa n-torkom" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Nedostaje simbol zatvaranja „)“ u vrsti n-torke Gvarijanta" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Neočekivani dodatni elementi u JSON nizu" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Neispravna vrednost niske pretvarajući u Gvarijant" + +#: ../json-glib/json-gvariant.c:964 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Unos rečnika Gvarijanta očekuje JSON objekat sa tačno jednim članom" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Razred Gvarijanta „%c“ nije podržan" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Neispravan potpis Gvarijanta" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "JSON podaci su prazni" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: GreÅ¡ka obrade: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON podaci moraju biti u UTF-8 kodiranju" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Samo jedan koreni čvor je dopuÅ¡ten u izrazu JSONPutanje" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Za korenim čvorom sledi neispravan znak „%c“" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Nedostaje naziv člana ili džoker nakon znaka tačke (.)" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Neispravan izraz isečka „%*s“" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Neispravna odrednica skupa „%*s“" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Neispravna odrednica isečka „%*s“" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Neispravna odrednica registra niza „%*s“" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Neispravan prvi znak „%c“" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Trenutni čvor je vrste „%s“, ali je očekivan niz ili objekat." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Registar „%d“ je veći od veličine niza na trenutnom položaju." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Registar „%d“ je veći od veličine objekta na trenutnom položaju." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Nijedan čvor nije dostupan na trenutnom položaju" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Trenutni položaj sadrži „%s“ a ne niz" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Trenutni čvor je vrste „%s“, ali je očekivan objekat." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Član „%s“ nije određen u objektu na trenutnom položaju." + +#: ../json-glib/json-reader.c:731 ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Trenutni položaj sadrži „%s“ a ne objekat" + +#: ../json-glib/json-reader.c:822 ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Trenutni položaj sadrži „%s“ a ne vrednost" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Trenutni položaj ne sadrži vrstu niske" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..576afba --- /dev/null +++ b/po/sv.po @@ -0,0 +1,170 @@ +# Swedish translation for json-glib. +# Copyright (C) 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the json-glib package. +# Daniel Nylander , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib\n" +"POT-Creation-Date: 2012-01-22 00:32+0100\n" +"PO-Revision-Date: 2012-01-22 00:38+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Oväntad typ \"%s\" i JSON-nod" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "Oväntade extra-element i JSON-array" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "Ogiltig strängvärdeskonvertering till GVariant" + +#: ../json-glib/json-gvariant.c:980 +msgid "A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant-klassen \"%c\" stöds inte" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Ogiltig GVariant-signatur" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON-data är tom" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: Tolkningsfel: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Rotnod efterföljd av otillÃ¥tet tecken \"%c\"" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "The current node is of type '%s', but an array or an object was expected." +msgstr "" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "The index '%d' is greater than the size of the array at the current position." +msgstr "" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "The index '%d' is greater than the size of the object at the current position." +msgstr "" + +#: ../json-glib/json-reader.c:576 +#: ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 +#: ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 +#: ../json-glib/json-reader.c:901 +#: ../json-glib/json-reader.c:946 +#: ../json-glib/json-reader.c:991 +#: ../json-glib/json-reader.c:1034 +#: ../json-glib/json-reader.c:1060 +msgid "No node available at the current position" +msgstr "Ingen nod tillgänglig pÃ¥ aktuell position" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Aktuell position innehÃ¥ller en \"%s\" och inte en array" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "" + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Medlemmen \"%s\" är inte definierad i objektet pÃ¥ aktuell position." + +#: ../json-glib/json-reader.c:736 +#: ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Aktuell position innehÃ¥ller en \"%s\" och inte ett objekt" + +#: ../json-glib/json-reader.c:827 +#: ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:910 +#: ../json-glib/json-reader.c:955 +#: ../json-glib/json-reader.c:1000 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Aktuell position innehÃ¥ller en \"%s\" och inte ett värde" + +#: ../json-glib/json-reader.c:873 +msgid "The current position does not hold an integer type" +msgstr "Aktuell position innehÃ¥ller inte en heltalstyp" + +#: ../json-glib/json-reader.c:918 +msgid "The current position does not hold a floating point type" +msgstr "Aktuell position innehÃ¥ller inte en flyttalstyp" + +#: ../json-glib/json-reader.c:963 +msgid "The current position does not hold a string type" +msgstr "Aktuell position innehÃ¥ller inte en strängtyp" + +#: ../json-glib/json-reader.c:1008 +msgid "The current position does not hold a boolean type" +msgstr "Aktuell position innehÃ¥ller inte en boolesk typ" + diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..e13e3c7 --- /dev/null +++ b/po/te.po @@ -0,0 +1,158 @@ +# Telugu translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# Copyright (C) 2012, Swecha Localisation Team +# This file is distributed under the same license as the json-glib package. +# +# sasi , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-27 05:54+0000\n" +"PO-Revision-Date: 2012-10-09 16:48+0530\n" +"Last-Translator: sasi \n" +"Language-Team: telugu \n" +"Language: te\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Gtranslator 2.91.5\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "ఒక JSON అంశంకు అవకాశం ఉంది, కానీ రూట్ నోడ్`% s' రకంగా ఉంటుంది " + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "ఊహించని రకం '% s' JSON నోడ్ లో" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "ఒక క్రమానుగుణ శ్రేణి కోసం JSON శ్రేణిలో తప్పిన అంశాలు " + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant tuple రకంలో ముగింపు చిహ్నం ')' లేదు" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON శ్రేణి లో ఊహించని అదనపు అంశాలు " + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant మారిన చెల్లని స్ట్రింగ్ విలువ " + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "ఒక GVariant నిఘంటువు ఎంట్రీ సరిగ్గా ఒక సభ్యుడుగా ఉంటుందని ఒక JSON అంశం అంచనా " + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant తరగతి '%c'మద్దతు లేదు" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "చెల్లని GVariant సంతకం" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON డేటా ఖాళీగా ఉంది" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "% s:% d: అన్వయ దోషం:% s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "కేవలం ఒక రూట్ నోడ్కు ఒక JSONPath వ్యక్తీకరణ లో అనుమతి ఉంది" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "చెల్లని అక్షరం '%c' తర్వాత రూట్ నోడ్" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "తప్పుడు ముక్క వ్యక్తీకరణ '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "చెల్లని వరు నిర్వచనం '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "చెల్లని ముక్క నిర్వచనం '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "చెల్లని వరు సూచిక నిర్వచనం '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "ప్రస్తుత నోడ్ రకం '%s' యొక్క, కానీ ఒక విన్యాసం లేదా ఒక వస్తువు భావించారు." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "ఇండెక్స్ '%d' ప్రస్తుత స్థితి వద్ద శ్రేణి యొక్క పరిమాణం కంటే ఎక్కువగా ఉంటుంది." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "ఇండెక్స్ '%d' ప్రస్తుత స్థితి వద్ద వస్తువు యొక్క పరిమాణం కంటే ఎక్కువగా ఉంటుంది." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:894 +#: ../json-glib/json-reader.c:932 ../json-glib/json-reader.c:977 +#: ../json-glib/json-reader.c:1013 ../json-glib/json-reader.c:1039 +msgid "No node available at the current position" +msgstr "ప్రస్తుత స్థానంలో అందుబాటులో లేదు నోడ్ " + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "ప్రస్తుత స్థితి ఒక '%s'కలిగి ఉంది మరియు వరుస కాదు " + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "ప్రస్తుత నోడ్ '%s' యొక్క రకం, కానీ ఒక వస్తువుని భావించారు." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "సభ్యుడు '%s', ప్రస్తుత స్థితి వద్ద అంశం వివరించబడలేదు." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "ప్రస్తుత స్థితి ఒక '%s' కలిగి ఉంది మరియు ఒక వస్తువు కాదు " + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:903 ../json-glib/json-reader.c:941 +#: ../json-glib/json-reader.c:986 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "ప్రస్తుత స్థితి ఒక '%s'కలిగి ఉంది మరియు ఒక విలువ కాదు " + +#: ../json-glib/json-reader.c:949 +msgid "The current position does not hold a string type" +msgstr "ప్రస్తుత స్థితి పదాల రకం కలిగి లేదు" diff --git a/po/tg.po b/po/tg.po new file mode 100644 index 0000000..3b3246d --- /dev/null +++ b/po/tg.po @@ -0,0 +1,260 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Victor Ibragimov , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: Tajik Gnome\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 14:30+0000\n" +"PO-Revision-Date: 2013-12-20 14:32+0500\n" +"Last-Translator: Victor Ibragimov \n" +"Language-Team: \n" +"Language: tg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.3\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Ҳамворкунии барориш" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "Фазоҳои фосилагузорӣ" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: хатои кушодани файли: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: хатои таҷзияи файли: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: хатои сабт ба stdout" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: хатои пӯшидани: %s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "ФАЙЛ" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "Формати файли JSON." + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "Формати json-glib-format манбаҳои JSON-ро формат мекунад." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Хатои таҷзияи имконоти хати фармонӣ: %s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Барои иттилооти бештар фармони \"%s --help\"-ро иҷро намоед." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s: дорои файлҳои намерасидагӣ мебошад" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "Санҷидани эътибори файли JSON." + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "" +"Қимати json-glib-validate иттилооти JSON-ро дар суроғаи URI додашуда тафтиш " +"мекунад." + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "" +"Дар ҳоли мунтазири объекти JSON, вале гиреҳи root дорои намуди `%s' мебошад" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Навъи пешбининашудаи '%s' дар гиреҳи JSON" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Унсурҳои ғоиб дар қатори JSON барои мутобиқат ба чандтогӣ" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Аломати пӯшонидани ')' ғоиб дар навъи чандтогии GVariant" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "Унсурҳои иловагии пешбининашуда дар қатори JSON" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "Қимати табдилдиҳии сатр ба GVariant нодуруст аст" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Вуруди луғати GVariant дар ҳоли мунтазири объекти JSON бо як рақам мебошад" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Синфи GVariant-и '%c' дастгирӣ намешавад" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "Имзои нодурусти GVariant" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "Иттилооти JSON холӣ аст" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: Хатои таҷзия: %s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "Иттилооти JSON бояд ба формати UTF-8 рамзгузорӣ шавад" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Танҳо як гиреҳи решагӣ дар ифодаи JSONPath иҷозат дода шудааст" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Гиреҳи решагӣ, ки бо аломати беэътибори '%c' пайгирӣ шуд" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "Баъд аз аломати \".\" номи узв ё номи алоқаманд вуҷуд надорад" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Ифодаи бадшакл: '%*s'" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Таърифи маҷмӯи \"%*s\" беэътибор аст" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Таърифи нодуруст: '%*s'" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Таърифи индекси қатори \"%*s\" беэътибор аст" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Аломати аввалини нодуруст: '%c'" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Гиреҳи ҷорӣ аз навъи '%s' аст, вале қатор ё объект пешбинӣ шуда буд." + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Индекси '%d' калонтар аз андозаи қатор дар вазъияти ҷорӣ мебошад." + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Индекси '%d' калонтар аз андозаи объект дар вазъияти ҷорӣ аст." + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "Ҳеҷ гуна гиреҳ дар вазъияти ҷорӣ дастрас нест" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Вазъияти ҷорӣ '%s'-ро нигаҳдорӣ мекунад, на қаторро" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Гиреҳи ҷорӣ аз навъи '%s' аст, вале объект пешбинӣ шудааст." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Дар вазъияти ҷорӣ аъзои '%s' дар объект муайян нашудааст." + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Вазъияти ҷорӣ '%s'-ро нигаҳдорӣ мекунад, на объектро" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Вазъияти ҷорӣ '%s'-ро нигаҳдорӣ мекунад, на қиматро" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "Ҷойгиршавии ҷорӣ ягон намуди сатрро дар бар намегирад" diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..a50c711 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,170 @@ +# Turkish translation for json-glib. +# Copyright (C) 2011 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# +# Muhammet Kara , 2011. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-11-15 08:44+0000\n" +"PO-Revision-Date: 2011-11-16 12:18+0200\n" +"Last-Translator: Muhammet Kara \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: tr\n" +"X-Generator: Lokalize 1.2\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Bir JSON nesnesi bekleniyor, ama kök düğümü `%s' türünde" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON düğümünde beklenmeyen '%s' türü" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "JSON dizisinin bir demete uyması için gereken öğeler eksik" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "GVariant demeti türünde kapatma sembolü ')' eksik" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON dizisinde beklenmeyen ek öğeler" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "GVariant'a dönüştürmede geçersiz dizge değeri" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "" +"Bir GVariant sözlük girdisi, tam olarak bir üyesi olan JSON nesnesi bekler" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant sınıfı '%c' desteklenmiyor" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Geçersiz GVariant imzası" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON verisi boş" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: Ayrıştırma hatası: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath ifadesinde yalnızca bir kök düğümüne izin verilir" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Kök düğümünü izleyen '%c' karakteri geçersiz" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Kusurlu dilim ifadesi '%*s'" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Geçersiz küme tanımı '%*s'" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Geçersiz dilim tanımı '%*s'" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Geçersiz dizi indisi tanımı '%*s'" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Geçerli düğümün türü '%s', ama bir dizi ya da bir nesne bekleniyordu." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "'%d' indisi, geçerli konumdaki dizinin boyutundan daha büyük." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "'%d' indisi, geçerli konumdaki nesnenin boyutundan daha büyük." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:901 +#: ../json-glib/json-reader.c:946 ../json-glib/json-reader.c:991 +#: ../json-glib/json-reader.c:1034 ../json-glib/json-reader.c:1060 +msgid "No node available at the current position" +msgstr "Geçerli konumda kullanılabilir düğüm yok" + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Geçerli konum bir dizi değil '%s' bulunduruyor" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Geçerli düğümün türü '%s', ama bir nesne bekleniyordu." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "'%s' üyesi, geçerli konumdaki nesnede tanımlı değil." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Geçerli konum bir nesne değil '%s' bulunduruyor" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:910 ../json-glib/json-reader.c:955 +#: ../json-glib/json-reader.c:1000 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Geçerli konum bir değer değil '%s' bulunduruyor" + +#: ../json-glib/json-reader.c:873 +msgid "The current position does not hold an integer type" +msgstr "Geçerli konum bir tamsayı türü bulundurmuyor" + +#: ../json-glib/json-reader.c:918 +msgid "The current position does not hold a floating point type" +msgstr "Geçerli konum bir kayan noktalı tür bulundurmuyor" + +#: ../json-glib/json-reader.c:963 +msgid "The current position does not hold a string type" +msgstr "Geçerli konum bir dizge türü bulundurmuyor" + +#: ../json-glib/json-reader.c:1008 +msgid "The current position does not hold a boolean type" +msgstr "Geçerli konum bir mantıksal doğru/yanlış türü bulundurmuyor" + diff --git a/po/ug.po b/po/ug.po new file mode 100644 index 0000000..4c32cd8 --- /dev/null +++ b/po/ug.po @@ -0,0 +1,153 @@ +# Uyghur translation for json-glib. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Gheyret Kenji , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-20 02:49+0000\n" +"PO-Revision-Date: 2013-01-26 09:43+0900\n" +"Last-Translator: Gheyret Kenji \n" +"Language-Team: Uyghur Computer Science Association \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../json-glib/json-gobject.c:925 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "ئەسلى JSON نەڭى بولۇشقا تېگىشلىك ئىدى، بىراق غول تۈگۈننىڭ تىپى «%s» ئىكەن" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "ھازىر JSON تۈگۈننىڭ تىپى ‹%s› بولۇپ قېلىپتۇ" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "ھازىر JSON تىزىقىدا ئارتۇقچە ئېلېمېنت بار ئىكەن" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "تېكىستنىڭ قىممىتىنى GVariant قا ئايلاندۇرغىلى بولمايدىكەن" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "ئادەتتە GVariant لۇغەت ئېلېمېنتى چوقۇم بىرلا ئەزايى بار بولغان JSON نەڭى بولۇشى كېرەك" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant تىپ ‹%c› نى قوللىمايدۇ" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "ئىناۋەتسىز GVariant ئىمزاسى" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "JSON سانلىق-مەلۇماتى قۇرۇق" + +#: ../json-glib/json-parser.c:825 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: پارچىلاشتا خاتالىق كۆرۈلدى: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "ئادەتتە JSONPath ئىپادىسىدە پەقەت بىرلا غول ئېلېمېنتقا ئىجازەت بېرىلگەن" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "پەقەت بىرلا غول ئېلېمېنت كەينىدە ‹%c› دېگەن ھەرپ بار ئىكەن" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "بولمىغۇر كەسمە ئىپادىسى ‹%*s›" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "توپلام ئېنىقلىمىسى ئىناۋەتسىز ‹%*s›" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "كەسمە(slice) ئېنىقلىمىسى ئىناۋەتسىز ‹%*s›" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "تىزىق ئىندېكس ئېنىقلىمىسى ئىناۋەتسىز ‹%*s›" + +#: ../json-glib/json-reader.c:464 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "نۆۋەتتىكى تۈگۈننىڭ تىپى ‹%s›، بىراق بۇ يەرگە تىزىق ياكى بىر نەڭ كەلسە بولاتتى" + +#: ../json-glib/json-reader.c:476 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "ئىندېكس ‹%d› ، نۆۋەتتىكى ئورۇندىكى تىزىقنىڭ چوڭلۇقىدىن چوڭ." + +#: ../json-glib/json-reader.c:493 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "ئىندېكس ‹%d› ، نۆۋەتتىكى ئورۇندىكى نەڭنىڭ چوڭلۇقىدىن چوڭ." + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:730 +#: ../json-glib/json-reader.c:781 ../json-glib/json-reader.c:819 +#: ../json-glib/json-reader.c:857 ../json-glib/json-reader.c:895 +#: ../json-glib/json-reader.c:933 ../json-glib/json-reader.c:978 +#: ../json-glib/json-reader.c:1014 ../json-glib/json-reader.c:1040 +msgid "No node available at the current position" +msgstr "نۆۋەتتىكى ئورۇندا تۈگۈن يوق" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "نۆۋەتتىكى ئورۇندىكىسى ‹%s› بولۇپ، تىزىق ئەمەس" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "نۆۋەتتىكى ئورۇندىكى تۈگۈننىڭ تىپى ‹%s›، بىراق نەڭ كەلسە بولاتتى." + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "نۆۋەتتىكى ئورۇندىكى نەڭدە ‹%s› دېگەن ئەزا ئېنىقلانمىغان." + +#: ../json-glib/json-reader.c:737 ../json-glib/json-reader.c:788 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "نۆۋەتتىكى ئورۇندىكىسى ‹%s› بولۇپ، نەڭ ئەمەس" + +#: ../json-glib/json-reader.c:828 ../json-glib/json-reader.c:866 +#: ../json-glib/json-reader.c:904 ../json-glib/json-reader.c:942 +#: ../json-glib/json-reader.c:987 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "نۆۋەتتىكى ئورۇندىكىسى ‹%s› بولۇپ، قىممەت ئەمەس" + +#: ../json-glib/json-reader.c:950 +msgid "The current position does not hold a string type" +msgstr "نۆۋەتتىكى ئورۇندىكىسىنىڭ تىپى تېكىست ئەمەس" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..e7c9471 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,269 @@ +# Ukrainian translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Daniel , 2012. +# Mykola Tkach , 2014. +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-03-30 09:48+0000\n" +"PO-Revision-Date: 2014-03-30 13:22+0300\n" +"Last-Translator: Mykola Tkach \n" +"Language-Team: translation@linux.org.ua\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "Виводити у зручночитаній формі" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "Відступи" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 +#: ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s: не вдалося відкрити файл: %s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 +#: ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s: не вдалося розібрати файл: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s: не вдалося записати у стандартний вивід" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 +#: ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s: не вдалося закрити: %s\n" + +#: ../json-glib/json-glib-format.c:157 +#: ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "ФАЙЛ" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "Форматування файлів JSON." + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format форматує ресурси JSON." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 +#: ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "Не вдалося розібрати параметри командного рядка: %s\n" + +#: ../json-glib/json-glib-format.c:180 +#: ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 +#: ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Використовуйте «%s --help» для отримання детальної інформації." + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 +#: ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s: відсутні файли" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "Перевірка коректності файлів JSON." + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate перевіряє коректність даних JSON за вказаним URI." + +#: ../json-glib/json-gobject.c:915 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Очікування об'єкту JSON, але кореневий вузол є типом «%s»" + +#: ../json-glib/json-gvariant.c:523 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Очікуваний тип «%s» у вузлі JSON" + +#: ../json-glib/json-gvariant.c:593 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Бракує елементів у масиві JSON для підтвердження кортежу" + +#: ../json-glib/json-gvariant.c:621 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Бракує символу закривання «)» у типі кортежу GVariant" + +#: ../json-glib/json-gvariant.c:629 +msgid "Unexpected extra elements in JSON array" +msgstr "Неочікуваний додатковий елемент у масиві JSON" + +#: ../json-glib/json-gvariant.c:908 +msgid "Invalid string value converting to GVariant" +msgstr "Неправильне перетворення значення рядка в GVariant" + +#: ../json-glib/json-gvariant.c:964 +msgid "A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Запис словника GVariant очікує об'єкт JSON з лише однією частиною" + +#: ../json-glib/json-gvariant.c:1244 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Клас GVariant «%c» не підтримується" + +#: ../json-glib/json-gvariant.c:1292 +msgid "Invalid GVariant signature" +msgstr "Неправильний підпис GVariant" + +#: ../json-glib/json-gvariant.c:1340 +msgid "JSON data is empty" +msgstr "Дані JSON порожні" + +#: ../json-glib/json-parser.c:815 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d: помилка розбору: %s" + +#: ../json-glib/json-parser.c:883 +msgid "JSON data must be UTF-8 encoded" +msgstr "Дані JSON повинні бути у кодуванні UTF-8" + +#: ../json-glib/json-path.c:388 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Дозволено тільки один кореневий вузол у виразі JSONPath" + +#: ../json-glib/json-path.c:397 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Кореневий вузол супроводжується неправильним символом «%c»" + +#: ../json-glib/json-path.c:437 +msgid "Missing member name or wildcard after . character" +msgstr "Відсутнє ім’я члена або шаблон після символу «.»" + +#: ../json-glib/json-path.c:511 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Неправильний вираз шару «%*s»" + +#: ../json-glib/json-path.c:555 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Неправильне визначення набору «%*s»" + +#: ../json-glib/json-path.c:608 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Неправильне визначення шару «%*s»" + +#: ../json-glib/json-path.c:636 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Неправильне визначення покажчика масиву «%*s»" + +#: ../json-glib/json-path.c:655 +#, c-format +msgid "Invalid first character '%c'" +msgstr "Неправильний перший символ «%c»" + +#: ../json-glib/json-reader.c:456 +#, c-format +msgid "The current node is of type '%s', but an array or an object was expected." +msgstr "Поточний вузол має тип «%s», однак масив або об'єкт не були очікуваними." + +#: ../json-glib/json-reader.c:468 +#, c-format +msgid "The index '%d' is greater than the size of the array at the current position." +msgstr "Покажчик «%d» більший за розмір масиву на поточній позиції." + +#: ../json-glib/json-reader.c:485 +#, c-format +msgid "The index '%d' is greater than the size of the object at the current position." +msgstr "Покажчик «%d» більший за розмір об'єкту на поточній позиції." + +#: ../json-glib/json-reader.c:570 +#: ../json-glib/json-reader.c:724 +#: ../json-glib/json-reader.c:775 +#: ../json-glib/json-reader.c:813 +#: ../json-glib/json-reader.c:851 +#: ../json-glib/json-reader.c:889 +#: ../json-glib/json-reader.c:927 +#: ../json-glib/json-reader.c:972 +#: ../json-glib/json-reader.c:1008 +#: ../json-glib/json-reader.c:1034 +msgid "No node available at the current position" +msgstr "Немає жодного доступного вузла на поточній позиції" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "Поточна позиція утримує «%s» і не є масивом" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Поточний вузол має тип «%s», однак об'єкт не був очікуваними." + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "Частину «%s» не визначено в об'єкті на поточні позиції." + +#: ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Поточна позиція утримує «%s» і не є об'єктом" + +#: ../json-glib/json-reader.c:822 +#: ../json-glib/json-reader.c:860 +#: ../json-glib/json-reader.c:898 +#: ../json-glib/json-reader.c:936 +#: ../json-glib/json-reader.c:981 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Поточна позиція утримує «%s» і не є значенням" + +#: ../json-glib/json-reader.c:944 +msgid "The current position does not hold a string type" +msgstr "Поточна позиція не утримує тип рядка" + diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..74fdc57 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,166 @@ +# Vietnamese translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# Nguyễn Thái Ngọc Duy , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-06-21 21:05+0000\n" +"PO-Revision-Date: 2012-06-30 10:26+0700\n" +"Last-Translator: Nguyễn Thái Ngọc Duy \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../json-glib/json-gobject.c:934 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "Cần đối tượng JSON nhÆ°ng nút gốc thuộc loại '%s'" + +#: ../json-glib/json-gvariant.c:539 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "Cần loại '%s' trong nút JSON" + +#: ../json-glib/json-gvariant.c:609 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "Thiếu phần tá»­ trong mảng JSON để tuân thủ ống" + +#: ../json-glib/json-gvariant.c:637 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "Thiếu dấu đóng ')' trong loại ống GVariant" + +#: ../json-glib/json-gvariant.c:645 +msgid "Unexpected extra elements in JSON array" +msgstr "Cần phần tá»­ bổ sung trong mảng JSON" + +#: ../json-glib/json-gvariant.c:924 +msgid "Invalid string value converting to GVariant" +msgstr "Giá trị chuỗi chuyển đổi sang GVariant không hợp lệ" + +#: ../json-glib/json-gvariant.c:980 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "Mục từ điển GVariant cần đối tượng JSON với duy nhất một phần tá»­" + +#: ../json-glib/json-gvariant.c:1236 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "Không hỗ trợ lớp GVariant '%c'" + +#: ../json-glib/json-gvariant.c:1281 +msgid "Invalid GVariant signature" +msgstr "Chữ ký GVariant không hợp lệ" + +#: ../json-glib/json-gvariant.c:1326 +msgid "JSON data is empty" +msgstr "Dữ liệu JSON rỗng" + +#: ../json-glib/json-parser.c:818 +#, c-format +msgid "%s:%d: Parse error: %s" +msgstr "%s:%d: Lỗi phân tích: %s" + +#: ../json-glib/json-path.c:375 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "Chỉ cho phép duy nhất một nút gốc trong biểu thức JSONPath" + +#: ../json-glib/json-path.c:384 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "Ký tá»± không hợp lệ '%c' theo sau nút gốc" + +#: ../json-glib/json-path.c:490 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "Biểu thức chặt '%*s' hÆ°" + +#: ../json-glib/json-path.c:534 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "Định nghÄ©a tập '%*s' không hợp lệ" + +#: ../json-glib/json-path.c:587 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "Định nghÄ©a chặt '%*s' không hợp lệ" + +#: ../json-glib/json-path.c:615 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "Định nghÄ©a chỉ mục mảng '%*s' không hợp lệ" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "Nút hiện thời loại '%s', nhÆ°ng đang cần mảng hoặc một đối tượng." + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "Chỉ mục '%d' lớn hÆ¡n kích thước mảng tại vị trí hiện thời." + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "Chỉ mục '%d' lớn hÆ¡n kích thước đối tượng tại vị trí hiện thời." + +#: ../json-glib/json-reader.c:576 ../json-glib/json-reader.c:729 +#: ../json-glib/json-reader.c:780 ../json-glib/json-reader.c:818 +#: ../json-glib/json-reader.c:856 ../json-glib/json-reader.c:901 +#: ../json-glib/json-reader.c:946 ../json-glib/json-reader.c:991 +#: ../json-glib/json-reader.c:1034 ../json-glib/json-reader.c:1060 +msgid "No node available at the current position" +msgstr "Không có nút ở vị trí hiện thời." + +#: ../json-glib/json-reader.c:583 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "" + +#: ../json-glib/json-reader.c:646 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "Nút hiện thời thuộc loại '%s', nhÆ°ng đang cần đối tượng." + +#: ../json-glib/json-reader.c:653 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "ChÆ°a định nghÄ©a thành viên '%s' trong đối tượng tại vị trí hiện thời." + +#: ../json-glib/json-reader.c:736 ../json-glib/json-reader.c:787 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "Vị trí hiện thời chứa '%s', không phải đối tượng" + +#: ../json-glib/json-reader.c:827 ../json-glib/json-reader.c:865 +#: ../json-glib/json-reader.c:910 ../json-glib/json-reader.c:955 +#: ../json-glib/json-reader.c:1000 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "Vị trí hiện thời chứa '%s', không phải giá trị" + +#: ../json-glib/json-reader.c:873 +msgid "The current position does not hold an integer type" +msgstr "Vị trí hiện thời không phải kiểu số nguyên" + +#: ../json-glib/json-reader.c:918 +msgid "The current position does not hold a floating point type" +msgstr "Vị trí hiện thời không phải kiểu số thá»±c" + +#: ../json-glib/json-reader.c:963 +msgid "The current position does not hold a string type" +msgstr "Vị trí hiện thời không phải kiểu chuỗi" + +#: ../json-glib/json-reader.c:1008 +msgid "The current position does not hold a boolean type" +msgstr "Vị trí hiện thời không phải kiểu luận lý" diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..a0a598d --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,269 @@ +# Chinese (China) translation for json-glib ui. +# Copyright (C) 2012 json-glib's authors and contributors. +# This file is distributed under the same license as the json-glib package. +# +# Cheng Lu , 2012. +# Wylmer Wang , 2012. +# Sphinx Jiang , 2014. + +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2014-02-20 10:20+0000\n" +"PO-Revision-Date: 2014-02-22 09:27+0800\n" +"Last-Translator: Sphinx Jiang \n" +"Language-Team: Chinese Simplified \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 1.5\n" + +#: ../json-glib/json-glib-format.c:50 +msgid "Prettify output" +msgstr "美化输出" + +#: ../json-glib/json-glib-format.c:51 +msgid "Indentation spaces" +msgstr "缩进空格" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:77 ../json-glib/json-glib-validate.c:63 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s: %s:打开文件出错:%s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:89 ../json-glib/json-glib-validate.c:75 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s: %s:解析文件出错: %s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:108 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s: %s:写到标准输出出错" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:128 ../json-glib/json-glib-validate.c:87 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s: %s:关闭出错: %s\n" + +#: ../json-glib/json-glib-format.c:157 ../json-glib/json-glib-validate.c:115 +msgid "FILE" +msgstr "文件" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:160 +msgid "Format JSON files." +msgstr "格式化 JSON 文件。" + +#: ../json-glib/json-glib-format.c:161 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format 可以格式化 JSON 资源。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:178 ../json-glib/json-glib-validate.c:136 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "解析命令行选项出错:%s\n" + +#: ../json-glib/json-glib-format.c:180 ../json-glib/json-glib-format.c:194 +#: ../json-glib/json-glib-validate.c:138 ../json-glib/json-glib-validate.c:152 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "请运行“%s --help”了解更多信息。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:192 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "%s: missing files" +msgstr "%s:缺少文件" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:118 +msgid "Validate JSON files." +msgstr "验证 JSON 文件" + +#: ../json-glib/json-glib-validate.c:119 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate 验证给定 URI 的 JSON 数据。" + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "期望一个 JSON 对象,但根节点类型是“%s”" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON 节点中存在异常的类型“%s”" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "在 JSON 数组中缺少用来构成 tuple(元组) 的元素" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "在 GVariant 元组类型中缺少闭合符号“)”" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "在 JSON 数组中存在意外的其他元素" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "字符串值到 GVariant 的转换无效" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant 字典记录期望仅有一个成员的 JSON 对象" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "不支持的 GVariant 类“%c”" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "无效的 GVariant 签名" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON 数据为空" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d:解析错误:%s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON 数据必须是 UTF-8 编码" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "JSONPath 表达式中只允许有一个根节点" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "根节点之后跟随了无效的字符“%c”" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "在字符 . 后面缺少成员名或通配符" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "有错误的 slice 表达式“%*s”" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "无效的 set 定义“%*s”" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "无效的 slice 定义“%*s”" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "无效的数组索引定义“%*s”" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "无效的首字符“%c”" + +#: ../json-glib/json-reader.c:463 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "当前节点的类型是“%s”,应为数组或对象。" + +#: ../json-glib/json-reader.c:475 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "索引“%d”大于当前位置数组的大小。" + +#: ../json-glib/json-reader.c:492 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "索引“%d”大于当前位置对象的大小。" + +#: ../json-glib/json-reader.c:577 ../json-glib/json-reader.c:731 +#: ../json-glib/json-reader.c:782 ../json-glib/json-reader.c:820 +#: ../json-glib/json-reader.c:858 ../json-glib/json-reader.c:896 +#: ../json-glib/json-reader.c:934 ../json-glib/json-reader.c:979 +#: ../json-glib/json-reader.c:1015 ../json-glib/json-reader.c:1041 +msgid "No node available at the current position" +msgstr "当前位置无节点可用" + +#: ../json-glib/json-reader.c:584 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "当前位置是一个“%s”,而不是一个数组" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "当前节点的类型是“%s”,但应为对象。" + +#: ../json-glib/json-reader.c:654 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "成员“%s”没有在当前位置的对象中定义。" + +#: ../json-glib/json-reader.c:738 ../json-glib/json-reader.c:789 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "当前位置是一个“%s”,而不是一个对象" + +#: ../json-glib/json-reader.c:829 ../json-glib/json-reader.c:867 +#: ../json-glib/json-reader.c:905 ../json-glib/json-reader.c:943 +#: ../json-glib/json-reader.c:988 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "当前位置是一个“%s”,不是一个值" + +#: ../json-glib/json-reader.c:951 +msgid "The current position does not hold a string type" +msgstr "当前位置不是一个字符串类型" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "当前位置不是一个整数类型" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "当前位置不是一个浮点数类型" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "当前位置不是一个布尔(boolean)类型" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..24a3dca --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,265 @@ +# Chinese (Hong Kong) translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 14:30+0000\n" +"PO-Revision-Date: 2014-02-02 20:40+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.3\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Prettify 輸出" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "縮排空間" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s:%s:開啟檔案時發生錯誤:%s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s:%s:分析檔案時發生錯誤:%s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s:%s:寫入標準輸出時發生錯誤" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s:%s:關閉時發生錯誤:%s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "檔案" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "格式化 JSON 檔案。" + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format 格式化 JSON 資源。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "分析命令列選項時發生錯誤:%s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "嘗試「%s --help」以獲得更多資訊。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s:缺少檔案" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "驗證 JSON 檔案。" + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate 驗證指定 URI 的 JSON 資料。" + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "預期是 JSON 物件,但根節點卻是類型「%s」" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON 節點中未預期的類型「%s」" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "在 JSON 陣列中缺少確認變數值組" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "在 GVariant 變數值組類型中缺少關閉符號 ')'" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON 陣列中有未預期的額外元素" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "無效的字串數值轉換到 GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant 字典項目預期 JSON 物件只能有一個成員" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant 類別「%c」不支援" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "無效的 GVariant 簽署" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON 資料是空的" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d:解析錯誤:%s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON 資料必須以 UTF-8 編碼" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "在 JSONPath 表示式中不允許一個根節點" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "根節點跟隨在無效的字符「%c」後" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "在 . 字符後缺少成員名稱或萬用字符" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "格式不良的片段表示式「%*s」" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "無效的組定義「%*s」" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "無效的片段定義「%*s」" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "無效的陣列索引定義「%*s」" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "無效的第一個字符「%c」" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "目前的節點類型是「%s」,但預期應為陣列或物件。" + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "索引「%d」大於目前位置的陣列大小。" + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "索引「%d」大於目前位置的物件大小。" + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "目前的位置沒有可用的節點" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "目前的位置持有一個「%s」,並非陣列" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "目前的節點類型是「%s」,但預期應為物件。" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "成員「%s」並未在目前的位置的物件中定義。" + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "目前的位置持有一個「%s」,並非物件" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "目前的位置持有一個「%s」,並非數值" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "目前的位置並未持有字串類型" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "目前的位置並未持有整數類型" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "目前的位置並未持有浮點數類型" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "目前的位置並未持有布林類型" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..860167f --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,265 @@ +# Chinese (Taiwan) translation for json-glib. +# Copyright (C) 2012 json-glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the json-glib package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: json-glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=json-" +"glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-12-19 14:30+0000\n" +"PO-Revision-Date: 2014-02-01 19:05+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Taiwan) \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.3\n" + +#: ../json-glib/json-glib-format.c:41 +msgid "Prettify output" +msgstr "Prettify 輸出" + +#: ../json-glib/json-glib-format.c:42 +msgid "Indentation spaces" +msgstr "縮排空間" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:68 ../json-glib/json-glib-validate.c:61 +#, c-format +msgid "%s: %s: error opening file: %s\n" +msgstr "%s:%s:開啟檔案時發生錯誤:%s\n" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:80 ../json-glib/json-glib-validate.c:73 +#, c-format +msgid "%s: %s: error parsing file: %s\n" +msgstr "%s:%s:分析檔案時發生錯誤:%s\n" + +#. Translators: the first %s is the program name, the +#. * second one is the URI of the file. +#. +#: ../json-glib/json-glib-format.c:99 +#, c-format +msgid "%s: %s: error writing to stdout" +msgstr "%s:%s:寫入標準輸出時發生錯誤" + +#. Translators: the first %s is the program name, the second one +#. * is the URI of the file, the third is the error message. +#. +#: ../json-glib/json-glib-format.c:119 ../json-glib/json-glib-validate.c:85 +#, c-format +msgid "%s: %s: error closing: %s\n" +msgstr "%s:%s:關閉時發生錯誤:%s\n" + +#: ../json-glib/json-glib-format.c:148 ../json-glib/json-glib-validate.c:113 +msgid "FILE" +msgstr "檔案" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-format.c:151 +msgid "Format JSON files." +msgstr "格式化 JSON 檔案。" + +#: ../json-glib/json-glib-format.c:152 +msgid "json-glib-format formats JSON resources." +msgstr "json-glib-format 格式化 JSON 資源。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:169 ../json-glib/json-glib-validate.c:134 +#, c-format +msgid "Error parsing commandline options: %s\n" +msgstr "分析命令列選項時發生錯誤:%s\n" + +#: ../json-glib/json-glib-format.c:171 ../json-glib/json-glib-format.c:185 +#: ../json-glib/json-glib-validate.c:136 ../json-glib/json-glib-validate.c:150 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "嘗試「%s --help」以獲得更多資訊。" + +#. Translators: the %s is the program name. This error message +#. * means the user is calling json-glib-validate without any +#. * argument. +#. +#: ../json-glib/json-glib-format.c:183 ../json-glib/json-glib-validate.c:148 +#, c-format +msgid "%s: missing files" +msgstr "%s:缺少檔案" + +#. Translators: this message will appear after the usage string +#. and before the list of options. +#: ../json-glib/json-glib-validate.c:116 +msgid "Validate JSON files." +msgstr "驗證 JSON 檔案。" + +#: ../json-glib/json-glib-validate.c:117 +msgid "json-glib-validate validates JSON data at the given URI." +msgstr "json-glib-validate 驗證指定 URI 的 JSON 資料。" + +#: ../json-glib/json-gobject.c:917 +#, c-format +msgid "Expecting a JSON object, but the root node is of type `%s'" +msgstr "預期是 JSON 物件,但根節點卻是類型「%s」" + +#: ../json-glib/json-gvariant.c:545 +#, c-format +msgid "Unexpected type '%s' in JSON node" +msgstr "JSON 節點中未預期的類型「%s」" + +#: ../json-glib/json-gvariant.c:615 +msgid "Missing elements in JSON array to conform to a tuple" +msgstr "在 JSON 陣列中缺少確認變數值組" + +#: ../json-glib/json-gvariant.c:643 +msgid "Missing closing symbol ')' in the GVariant tuple type" +msgstr "在 GVariant 變數值組類型中缺少關閉符號 ')'" + +#: ../json-glib/json-gvariant.c:651 +msgid "Unexpected extra elements in JSON array" +msgstr "JSON 陣列中有未預期的額外元素" + +#: ../json-glib/json-gvariant.c:930 +msgid "Invalid string value converting to GVariant" +msgstr "無效的字串數值轉換到 GVariant" + +#: ../json-glib/json-gvariant.c:986 +msgid "" +"A GVariant dictionary entry expects a JSON object with exactly one member" +msgstr "GVariant 字典項目預期 JSON 物件只能有一個成員" + +#: ../json-glib/json-gvariant.c:1266 +#, c-format +msgid "GVariant class '%c' not supported" +msgstr "GVariant 類別「%c」不支援" + +#: ../json-glib/json-gvariant.c:1314 +msgid "Invalid GVariant signature" +msgstr "無效的 GVariant 簽章" + +#: ../json-glib/json-gvariant.c:1362 +msgid "JSON data is empty" +msgstr "JSON 資料是空的" + +#: ../json-glib/json-parser.c:817 +#, c-format +msgid "%s:%d:%d: Parse error: %s" +msgstr "%s:%d:%d:解析錯誤:%s" + +#: ../json-glib/json-parser.c:885 +msgid "JSON data must be UTF-8 encoded" +msgstr "JSON 資料必須以 UTF-8 編碼" + +#: ../json-glib/json-path.c:438 +msgid "Only one root node is allowed in a JSONPath expression" +msgstr "在 JSONPath 表示式中不允許一個根節點" + +#: ../json-glib/json-path.c:447 +#, c-format +msgid "Root node followed by invalid character '%c'" +msgstr "根節點跟隨在無效的字元「%c」後" + +#: ../json-glib/json-path.c:487 +msgid "Missing member name or wildcard after . character" +msgstr "在 . 字元後缺少成員名稱或萬用字元" + +#: ../json-glib/json-path.c:561 +#, c-format +msgid "Malformed slice expression '%*s'" +msgstr "格式不良的片段表示式「%*s」" + +#: ../json-glib/json-path.c:605 +#, c-format +msgid "Invalid set definition '%*s'" +msgstr "無效的組定義「%*s」" + +#: ../json-glib/json-path.c:658 +#, c-format +msgid "Invalid slice definition '%*s'" +msgstr "無效的片段定義「%*s」" + +#: ../json-glib/json-path.c:686 +#, c-format +msgid "Invalid array index definition '%*s'" +msgstr "無效的陣列索引定義「%*s」" + +#: ../json-glib/json-path.c:705 +#, c-format +msgid "Invalid first character '%c'" +msgstr "無效的第一個字元「%c」" + +#: ../json-glib/json-reader.c:457 +#, c-format +msgid "" +"The current node is of type '%s', but an array or an object was expected." +msgstr "目前的節點類型是「%s」,但預期應為陣列或物件。" + +#: ../json-glib/json-reader.c:469 +#, c-format +msgid "" +"The index '%d' is greater than the size of the array at the current position." +msgstr "索引「%d」大於目前位置的陣列大小。" + +#: ../json-glib/json-reader.c:486 +#, c-format +msgid "" +"The index '%d' is greater than the size of the object at the current " +"position." +msgstr "索引「%d」大於目前位置的物件大小。" + +#: ../json-glib/json-reader.c:570 ../json-glib/json-reader.c:723 +#: ../json-glib/json-reader.c:774 ../json-glib/json-reader.c:812 +#: ../json-glib/json-reader.c:850 ../json-glib/json-reader.c:888 +#: ../json-glib/json-reader.c:926 ../json-glib/json-reader.c:971 +#: ../json-glib/json-reader.c:1007 ../json-glib/json-reader.c:1033 +msgid "No node available at the current position" +msgstr "目前的位置沒有可用的節點" + +#: ../json-glib/json-reader.c:577 +#, c-format +msgid "The current position holds a '%s' and not an array" +msgstr "目前的位置持有一個「%s」,並非陣列" + +#: ../json-glib/json-reader.c:640 +#, c-format +msgid "The current node is of type '%s', but an object was expected." +msgstr "目前的節點類型是「%s」,但預期應為物件。" + +#: ../json-glib/json-reader.c:647 +#, c-format +msgid "The member '%s' is not defined in the object at the current position." +msgstr "成員「%s」並未在目前的位置的物件中定義。" + +#: ../json-glib/json-reader.c:730 ../json-glib/json-reader.c:781 +#, c-format +msgid "The current position holds a '%s' and not an object" +msgstr "目前的位置持有一個「%s」,並非物件" + +#: ../json-glib/json-reader.c:821 ../json-glib/json-reader.c:859 +#: ../json-glib/json-reader.c:897 ../json-glib/json-reader.c:935 +#: ../json-glib/json-reader.c:980 +#, c-format +msgid "The current position holds a '%s' and not a value" +msgstr "目前的位置持有一個「%s」,並非數值" + +#: ../json-glib/json-reader.c:943 +msgid "The current position does not hold a string type" +msgstr "目前的位置並未持有字串類型" + +#~ msgid "The current position does not hold an integer type" +#~ msgstr "目前的位置並未持有整數類型" + +#~ msgid "The current position does not hold a floating point type" +#~ msgstr "目前的位置並未持有浮點數類型" + +#~ msgid "The current position does not hold a boolean type" +#~ msgstr "目前的位置並未持有布林類型" diff --git a/tests/Makefile.am b/tests/Makefile.am deleted file mode 100644 index e9a0467..0000000 --- a/tests/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -include $(top_srcdir)/build/autotools/Makefile.am.gtest -include $(top_srcdir)/build/autotools/Makefile.am.silent - -NULL = - -noinst_PROGRAMS = $(TEST_PROGS) - -INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/json-glib -AM_CPPFLAGS = -DJSON_DISABLE_DEPRECATED $(JSON_DEBUG_CFLAGS) $(JSON_CFLAGS) $(MAINTAINER_CFLAGS) -progs_ldadd = $(top_builddir)/json-glib/libjson-glib-1.0.la $(JSON_LIBS) - -TESTS_ENVIRONMENT = srcdir=$(srcdir) - -TEST_PROGS += test-parser -test_parser_SOURCES = test-parser.c -test_parser_LDADD = $(progs_ldadd) - -TEST_PROGS += test-generator -test_generator_SOURCES = test-generator.c -test_generator_LDADD = $(progs_ldadd) - -TEST_PROGS += test-serialize-simple -test_serialize_simple_SOURCES = test-serialize-simple.c -test_serialize_simple_LDADD = $(progs_ldadd) - -TEST_PROGS += test-serialize-complex -test_serialize_complex_SOURCES = test-serialize-complex.c -test_serialize_complex_LDADD = $(progs_ldadd) - -TEST_PROGS += test-serialize-boxed -test_serialize_boxed_SOURCES = test-serialize-boxed.c -test_serialize_boxed_LDADD = $(progs_ldadd) - -TEST_PROGS += test-serialize-full -test_serialize_full_SOURCES = test-serialize-full.c -test_serialize_full_LDADD = $(progs_ldadd) diff --git a/tests/test-generator.c b/tests/test-generator.c deleted file mode 100644 index 864dbb9..0000000 --- a/tests/test-generator.c +++ /dev/null @@ -1,357 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include - -#include - -static const gchar *empty_array = "[ ]"; -static const gchar *empty_object = "{ }"; - -static const gchar *simple_array = "[ true, false, null, 42, \"foo\" ]"; -static const gchar *nested_array = "[ true, [ false, null ], 42 ]"; - -static const gchar *simple_object = "{ \"Bool1\" : true, \"Bool2\" : false, \"Null\" : null, \"Int\" : 42, \"String\" : \"foo\" }"; - -static void -test_empty_array (void) -{ - JsonGenerator *gen = json_generator_new (); - JsonNode *root; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_ARRAY); - json_node_take_array (root, json_array_new ()); - - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - - g_assert_cmpint (len, ==, strlen (empty_array)); - g_assert_cmpstr (data, ==, empty_array); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - -static void -test_empty_object (void) -{ - JsonGenerator *gen = json_generator_new (); - JsonNode *root; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_OBJECT); - json_node_take_object (root, json_object_new ()); - - json_generator_set_root (gen, root); - g_object_set (gen, "pretty", FALSE, NULL); - - data = json_generator_to_data (gen, &len); - - g_assert_cmpint (len, ==, strlen (empty_object)); - g_assert_cmpstr (data, ==, empty_object); - - g_free (data); - json_node_free (root); - g_object_unref (gen); -} - -static void -test_simple_array (void) -{ - JsonGenerator *generator = json_generator_new (); - JsonNode *root, *val; - JsonArray *array; - GValue value = { 0, }; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_ARRAY); - array = json_array_sized_new (6); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, TRUE); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - val = json_node_new (JSON_NODE_VALUE); - json_node_set_boolean (val, FALSE); - json_array_add_element (array, val); - - val = json_node_new (JSON_NODE_NULL); - json_array_add_element (array, val); - - json_array_add_int_element (array, 42); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_STRING); - g_value_set_string (&value, "foo"); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - json_node_take_array (root, array); - json_generator_set_root (generator, root); - - g_object_set (generator, "pretty", FALSE, NULL); - data = json_generator_to_data (generator, &len); - - if (g_test_verbose ()) - g_print ("checking simple array `%s' (expected: %s)\n", - data, - simple_array); - - g_assert_cmpint (len, ==, strlen (simple_array)); - g_assert_cmpstr (data, ==, simple_array); - - g_free (data); - json_node_free (root); - g_object_unref (generator); -} - -static void -test_nested_array (void) -{ - JsonGenerator *generator = json_generator_new (); - JsonNode *root, *val; - JsonArray *array, *nested; - GValue value = { 0, }; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_ARRAY); - array = json_array_sized_new (3); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_BOOLEAN); - g_value_set_boolean (&value, TRUE); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - { - nested = json_array_new (); - - json_array_add_boolean_element (nested, FALSE); - json_array_add_null_element (nested); - - json_array_add_array_element (array, nested); - } - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT64); - g_value_set_int64 (&value, 42); - json_node_set_value (val, &value); - json_array_add_element (array, val); - g_value_unset (&value); - - json_node_take_array (root, array); - json_generator_set_root (generator, root); - - g_object_set (generator, "pretty", FALSE, NULL); - data = json_generator_to_data (generator, &len); - - g_assert_cmpint (len, ==, strlen (nested_array)); - g_assert_cmpstr (data, ==, nested_array); - - g_free (data); - json_node_free (root); - g_object_unref (generator); -} - -static void -test_simple_object (void) -{ - JsonGenerator *generator = json_generator_new (); - JsonNode *root; - JsonObject *object; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_OBJECT); - object = json_object_new (); - - json_object_set_boolean_member (object, "Bool1", TRUE); - json_object_set_boolean_member (object, "Bool2", FALSE); - json_object_set_null_member (object, "Null"); - json_object_set_int_member (object, "Int", 42); - json_object_set_string_member (object, "String", "foo"); - - json_node_take_object (root, object); - json_generator_set_root (generator, root); - - g_object_set (generator, "pretty", FALSE, NULL); - data = json_generator_to_data (generator, &len); - - if (g_test_verbose ()) - g_print ("checking simple object `%s' (expected: %s)\n", - data, - simple_object); - - g_assert_cmpint (len, ==, strlen (simple_object)); - g_assert_cmpstr (data, ==, simple_object); - - /* we cannot compare the strings literal because JsonObject does not - * guarantee any ordering - */ - - g_free (data); - json_node_free (root); - g_object_unref (generator); -} - -#if 0 -/* this is just overkill, but I'll add it commented out, so it - * can be enabled if I feel like running this just to compare - * the length of the strings - */ -static void -test_nested_object (void) -{ - JsonGenerator *generator = json_generator_new (); - JsonNode *root, *val, *nested_val; - JsonObject *object, *nested; - JsonArray *array; - GValue value = { 0, }; - gchar *data; - gsize len; - - root = json_node_new (JSON_NODE_OBJECT); - object = json_object_new (); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_STRING); - g_value_set_string (&value, "View from 15th Floor"); - json_node_set_value (val, &value); - json_object_set_member (object, "Title", val); - g_value_unset (&value); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 800); - json_node_set_value (val, &value); - json_object_set_member (object, "Width", val); - g_value_unset (&value); - - val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 600); - json_node_set_value (val, &value); - json_object_set_member (object, "Height", val); - g_value_unset (&value); - - { - val = json_node_new (JSON_NODE_ARRAY); - array = json_array_new (); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 116); - json_node_set_value (nested_val, &value); - json_array_add_element (array, nested_val); - g_value_unset (&value); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 943); - json_node_set_value (nested_val, &value); - json_array_add_element (array, nested_val); - g_value_unset (&value); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 234); - json_node_set_value (nested_val, &value); - json_array_add_element (array, nested_val); - g_value_unset (&value); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 38793); - json_node_set_value (nested_val, &value); - json_array_add_element (array, nested_val); - g_value_unset (&value); - - json_node_take_array (val, array); - json_object_set_member (object, "IDs", val); - } - - { - val = json_node_new (JSON_NODE_OBJECT); - nested = json_object_new (); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_STRING); - g_value_set_string (&value, "http://www.example.com/image/481989943"); - json_node_set_value (nested_val, &value); - json_object_set_member (nested, "Url", nested_val); - g_value_unset (&value); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 125); - json_node_set_value (nested_val, &value); - json_object_set_member (nested, "Width", nested_val); - g_value_unset (&value); - - nested_val = json_node_new (JSON_NODE_VALUE); - g_value_init (&value, G_TYPE_INT); - g_value_set_int (&value, 100); - json_node_set_value (nested_val, &value); - json_object_set_member (nested, "Height", nested_val); - g_value_unset (&value); - - json_node_take_object (val, nested); - json_object_set_member (object, "Thumbnail", val); - } - - json_node_take_object (root, object); - json_generator_set_root (generator, root); - - g_object_set (generator, "pretty", FALSE, NULL); - data = json_generator_to_data (generator, &len); - - if (g_test_verbose ()) - g_print ("checking nested object `%s' (expected: %s)\n", - data, - nested_object); - - g_assert_cmpint (len, ==, strlen (nested_object)); - - /* we cannot compare the strings literal because JsonObject does not - * guarantee any ordering - */ - - g_free (data); - json_node_free (root); - g_object_unref (generator); -} -#endif - -int -main (int argc, - char *argv[]) -{ - g_type_init (); - g_test_init (&argc, &argv, NULL); - - g_test_add_func ("/generator/empty-array", test_empty_array); - g_test_add_func ("/generator/empty-object", test_empty_object); - g_test_add_func ("/generator/simple-array", test_simple_array); - g_test_add_func ("/generator/nested-array", test_nested_array); - g_test_add_func ("/generator/simple-object", test_simple_object); - - return g_test_run (); -}