mirror of
https://github.com/GOSTSec/sgminer
synced 2025-02-05 11:34:16 +00:00
Remove unused components of jansson
This commit is contained in:
parent
b84166e42d
commit
7a32a7b808
@ -1,6 +1,6 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES LICENSE README.rst win32
|
EXTRA_DIST = CHANGES LICENSE README.rst
|
||||||
SUBDIRS = src
|
SUBDIRS = src
|
||||||
|
|
||||||
# "make distcheck" builds the dvi target, so use it to check that the
|
# "make distcheck" builds the dvi target, so use it to check that the
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
EXTRA_DIST = conf.py apiref.rst changes.rst conformance.rst \
|
|
||||||
gettingstarted.rst github_commits.c index.rst portability.rst \
|
|
||||||
tutorial.rst upgrading.rst ext/refcounting.py
|
|
||||||
|
|
||||||
SPHINXBUILD = sphinx-build
|
|
||||||
SPHINXOPTS = -d _build/doctrees $(SPHINXOPTS_EXTRA)
|
|
||||||
|
|
||||||
html-local:
|
|
||||||
$(SPHINXBUILD) -b html $(SPHINXOPTS) $(srcdir) _build/html
|
|
||||||
|
|
||||||
install-html-local: html
|
|
||||||
mkdir -p $(DESTDIR)$(htmldir)
|
|
||||||
cp -r _build/html $(DESTDIR)$(htmldir)
|
|
||||||
|
|
||||||
uninstall-local:
|
|
||||||
rm -rf $(DESTDIR)$(htmldir)
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
rm -rf _build
|
|
||||||
rm -f ext/refcounting.pyc
|
|
@ -1,5 +0,0 @@
|
|||||||
To build the documentation, invoke
|
|
||||||
|
|
||||||
make html
|
|
||||||
|
|
||||||
Then point your browser to _build/html/index.html.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +0,0 @@
|
|||||||
******************
|
|
||||||
Changes in Jansson
|
|
||||||
******************
|
|
||||||
|
|
||||||
.. include:: ../CHANGES
|
|
@ -1,217 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Jansson documentation build configuration file, created by
|
|
||||||
# sphinx-quickstart on Sun Sep 5 21:47:20 2010.
|
|
||||||
#
|
|
||||||
# This file is execfile()d with the current directory set to its containing dir.
|
|
||||||
#
|
|
||||||
# Note that not all possible configuration values are present in this
|
|
||||||
# autogenerated file.
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
import sys, os
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
sys.path.insert(0, os.path.abspath('ext'))
|
|
||||||
|
|
||||||
# -- General configuration -----------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
needs_sphinx = '1.0'
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
|
||||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
|
||||||
extensions = ['refcounting']
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#source_encoding = 'utf-8-sig'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
project = u'Jansson'
|
|
||||||
copyright = u'2009-2013, Petri Lehtinen'
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
|
||||||
version = '2.5'
|
|
||||||
# The full version, including alpha/beta/rc tags.
|
|
||||||
release = version
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
#language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#today = ''
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
exclude_patterns = ['_build']
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
|
||||||
default_role = 'c:func'
|
|
||||||
primary_domain = 'c'
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
#show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
#modindex_common_prefix = []
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ---------------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
||||||
# a list of builtin themes.
|
|
||||||
#html_theme = 'default'
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
#html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
#html_theme_path = []
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
|
||||||
# "<project> v<release> documentation".
|
|
||||||
#html_title = None
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#html_favicon = None
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
#html_static_path = ['_static']
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
#html_last_updated_fmt = '%b %d, %Y'
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
#html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
#html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
#html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
#html_file_suffix = None
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'Janssondoc'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output --------------------------------------------------
|
|
||||||
|
|
||||||
# The paper size ('letter' or 'a4').
|
|
||||||
#latex_paper_size = 'letter'
|
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
#latex_font_size = '10pt'
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
|
||||||
latex_documents = [
|
|
||||||
('index', 'Jansson.tex', u'Jansson Documentation',
|
|
||||||
u'Petri Lehtinen', 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
#latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#latex_show_urls = False
|
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
|
||||||
#latex_preamble = ''
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output --------------------------------------------
|
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
|
||||||
# (source start file, name, description, authors, manual section).
|
|
||||||
man_pages = [
|
|
||||||
('index', 'jansson', u'Jansson Documentation',
|
|
||||||
[u'Petri Lehtinen'], 1)
|
|
||||||
]
|
|
@ -1,114 +0,0 @@
|
|||||||
.. _rfc-conformance:
|
|
||||||
|
|
||||||
***************
|
|
||||||
RFC Conformance
|
|
||||||
***************
|
|
||||||
|
|
||||||
JSON is specified in :rfc:`4627`, *"The application/json Media Type
|
|
||||||
for JavaScript Object Notation (JSON)"*.
|
|
||||||
|
|
||||||
Character Encoding
|
|
||||||
==================
|
|
||||||
|
|
||||||
Jansson only supports UTF-8 encoded JSON texts. It does not support or
|
|
||||||
auto-detect any of the other encodings mentioned in the RFC, namely
|
|
||||||
UTF-16LE, UTF-16BE, UTF-32LE or UTF-32BE. Pure ASCII is supported, as
|
|
||||||
it's a subset of UTF-8.
|
|
||||||
|
|
||||||
Strings
|
|
||||||
=======
|
|
||||||
|
|
||||||
JSON strings are mapped to C-style null-terminated character arrays,
|
|
||||||
and UTF-8 encoding is used internally. Strings may not contain
|
|
||||||
embedded null characters, not even escaped ones.
|
|
||||||
|
|
||||||
For example, trying to decode the following JSON text leads to a parse
|
|
||||||
error::
|
|
||||||
|
|
||||||
["this string contains the null character: \u0000"]
|
|
||||||
|
|
||||||
All other Unicode codepoints U+0001 through U+10FFFF are allowed.
|
|
||||||
|
|
||||||
Unicode normalization or any other transformation is never performed
|
|
||||||
on any strings (string values or object keys). When checking for
|
|
||||||
equivalence of strings or object keys, the comparison is performed
|
|
||||||
byte by byte between the original UTF-8 representations of the
|
|
||||||
strings.
|
|
||||||
|
|
||||||
Numbers
|
|
||||||
=======
|
|
||||||
|
|
||||||
.. _real-vs-integer:
|
|
||||||
|
|
||||||
Real vs. Integer
|
|
||||||
----------------
|
|
||||||
|
|
||||||
JSON makes no distinction between real and integer numbers; Jansson
|
|
||||||
does. Real numbers are mapped to the ``double`` type and integers to
|
|
||||||
the ``json_int_t`` type, which is a typedef of ``long long`` or
|
|
||||||
``long``, depending on whether ``long long`` is supported by your
|
|
||||||
compiler or not.
|
|
||||||
|
|
||||||
A JSON number is considered to be a real number if its lexical
|
|
||||||
representation includes one of ``e``, ``E``, or ``.``; regardless if
|
|
||||||
its actual numeric value is a true integer (e.g., all of ``1E6``,
|
|
||||||
``3.0``, ``400E-2``, and ``3.14E3`` are mathematical integers, but
|
|
||||||
will be treated as real values). With the ``JSON_DECODE_INT_AS_REAL``
|
|
||||||
decoder flag set all numbers are interpreted as real.
|
|
||||||
|
|
||||||
All other JSON numbers are considered integers.
|
|
||||||
|
|
||||||
When encoding to JSON, real values are always represented
|
|
||||||
with a fractional part; e.g., the ``double`` value 3.0 will be
|
|
||||||
represented in JSON as ``3.0``, not ``3``.
|
|
||||||
|
|
||||||
Overflow, Underflow & Precision
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
Real numbers whose absolute values are too small to be represented in
|
|
||||||
a C ``double`` will be silently estimated with 0.0. Thus, depending on
|
|
||||||
platform, JSON numbers very close to zero such as 1E-999 may result in
|
|
||||||
0.0.
|
|
||||||
|
|
||||||
Real numbers whose absolute values are too large to be represented in
|
|
||||||
a C ``double`` will result in an overflow error (a JSON decoding
|
|
||||||
error). Thus, depending on platform, JSON numbers like 1E+999 or
|
|
||||||
-1E+999 may result in a parsing error.
|
|
||||||
|
|
||||||
Likewise, integer numbers whose absolute values are too large to be
|
|
||||||
represented in the ``json_int_t`` type (see above) will result in an
|
|
||||||
overflow error (a JSON decoding error). Thus, depending on platform,
|
|
||||||
JSON numbers like 1000000000000000 may result in parsing error.
|
|
||||||
|
|
||||||
Parsing JSON real numbers may result in a loss of precision. As long
|
|
||||||
as overflow does not occur (i.e. a total loss of precision), the
|
|
||||||
rounded approximate value is silently used. Thus the JSON number
|
|
||||||
1.000000000000000005 may, depending on platform, result in the
|
|
||||||
``double`` value 1.0.
|
|
||||||
|
|
||||||
Signed zeros
|
|
||||||
------------
|
|
||||||
|
|
||||||
JSON makes no statement about what a number means; however Javascript
|
|
||||||
(ECMAscript) does state that +0.0 and -0.0 must be treated as being
|
|
||||||
distinct values, i.e. -0.0 |not-equal| 0.0. Jansson relies on the
|
|
||||||
underlying floating point library in the C environment in which it is
|
|
||||||
compiled. Therefore it is platform-dependent whether 0.0 and -0.0 will
|
|
||||||
be distinct values. Most platforms that use the IEEE 754
|
|
||||||
floating-point standard will support signed zeros.
|
|
||||||
|
|
||||||
Note that this only applies to floating-point; neither JSON, C, or
|
|
||||||
IEEE support the concept of signed integer zeros.
|
|
||||||
|
|
||||||
.. |not-equal| unicode:: U+2260
|
|
||||||
|
|
||||||
Types
|
|
||||||
-----
|
|
||||||
|
|
||||||
No support is provided in Jansson for any C numeric types other than
|
|
||||||
``json_int_t`` and ``double``. This excludes things such as unsigned
|
|
||||||
types, ``long double``, etc. Obviously, shorter types like ``short``,
|
|
||||||
``int``, ``long`` (if ``json_int_t`` is ``long long``) and ``float``
|
|
||||||
are implicitly handled via the ordinary C type coercion rules (subject
|
|
||||||
to overflow semantics). Also, no support or hooks are provided for any
|
|
||||||
supplemental "bignum" type add-on packages.
|
|
@ -1,59 +0,0 @@
|
|||||||
"""
|
|
||||||
refcounting
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
Reference count annotations for C API functions. Has the same
|
|
||||||
result as the sphinx.ext.refcounting extension but works for all
|
|
||||||
functions regardless of the signature, and the reference counting
|
|
||||||
information is written inline with the documentation instead of a
|
|
||||||
separate file.
|
|
||||||
|
|
||||||
Adds a new directive "refcounting". The directive has no content
|
|
||||||
and one required positional parameter:: "new" or "borrow".
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
.. cfunction:: json_t *json_object(void)
|
|
||||||
|
|
||||||
.. refcounting:: new
|
|
||||||
|
|
||||||
<description of the json_object function>
|
|
||||||
|
|
||||||
:copyright: Copyright (c) 2009-2013 Petri Lehtinen <petri@digip.org>
|
|
||||||
:license: MIT, see LICENSE for details.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from docutils import nodes
|
|
||||||
|
|
||||||
class refcounting(nodes.emphasis): pass
|
|
||||||
|
|
||||||
def visit(self, node):
|
|
||||||
self.visit_emphasis(node)
|
|
||||||
|
|
||||||
def depart(self, node):
|
|
||||||
self.depart_emphasis(node)
|
|
||||||
|
|
||||||
def html_visit(self, node):
|
|
||||||
self.body.append(self.starttag(node, 'em', '', CLASS='refcount'))
|
|
||||||
|
|
||||||
def html_depart(self, node):
|
|
||||||
self.body.append('</em>')
|
|
||||||
|
|
||||||
|
|
||||||
def refcounting_directive(name, arguments, options, content, lineno,
|
|
||||||
content_offset, block_text, state, state_machine):
|
|
||||||
if arguments[0] == 'borrow':
|
|
||||||
text = 'Return value: Borrowed reference.'
|
|
||||||
elif arguments[0] == 'new':
|
|
||||||
text = 'Return value: New reference.'
|
|
||||||
else:
|
|
||||||
raise Error('Valid arguments: new, borrow')
|
|
||||||
|
|
||||||
return [refcounting(text, text)]
|
|
||||||
|
|
||||||
def setup(app):
|
|
||||||
app.add_node(refcounting,
|
|
||||||
html=(html_visit, html_depart),
|
|
||||||
latex=(visit, depart),
|
|
||||||
text=(visit, depart))
|
|
||||||
app.add_directive('refcounting', refcounting_directive, 0, (1, 0, 0))
|
|
@ -1,237 +0,0 @@
|
|||||||
***************
|
|
||||||
Getting Started
|
|
||||||
***************
|
|
||||||
|
|
||||||
.. highlight:: c
|
|
||||||
|
|
||||||
Compiling and Installing Jansson
|
|
||||||
================================
|
|
||||||
|
|
||||||
The Jansson source is available at
|
|
||||||
http://www.digip.org/jansson/releases/.
|
|
||||||
|
|
||||||
Unix-like systems (including MinGW)
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
Unpack the source tarball and change to the source directory:
|
|
||||||
|
|
||||||
.. parsed-literal::
|
|
||||||
|
|
||||||
bunzip2 -c jansson-|release|.tar.bz2 | tar xf -
|
|
||||||
cd jansson-|release|
|
|
||||||
|
|
||||||
The source uses GNU Autotools (autoconf_, automake_, libtool_), so
|
|
||||||
compiling and installing is extremely simple::
|
|
||||||
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
make check
|
|
||||||
make install
|
|
||||||
|
|
||||||
To change the destination directory (``/usr/local`` by default), use
|
|
||||||
the ``--prefix=DIR`` argument to ``./configure``. See ``./configure
|
|
||||||
--help`` for the list of all possible installation options. (There are
|
|
||||||
no options to customize the resulting Jansson binary.)
|
|
||||||
|
|
||||||
The command ``make check`` runs the test suite distributed with
|
|
||||||
Jansson. This step is not strictly necessary, but it may find possible
|
|
||||||
problems that Jansson has on your platform. If any problems are found,
|
|
||||||
please report them.
|
|
||||||
|
|
||||||
If you obtained the source from a Git repository (or any other source
|
|
||||||
control system), there's no ``./configure`` script as it's not kept in
|
|
||||||
version control. To create the script, the build system needs to be
|
|
||||||
bootstrapped. There are many ways to do this, but the easiest one is
|
|
||||||
to use ``autoreconf``::
|
|
||||||
|
|
||||||
autoreconf -vi
|
|
||||||
|
|
||||||
This command creates the ``./configure`` script, which can then be
|
|
||||||
used as described above.
|
|
||||||
|
|
||||||
.. _autoconf: http://www.gnu.org/software/autoconf/
|
|
||||||
.. _automake: http://www.gnu.org/software/automake/
|
|
||||||
.. _libtool: http://www.gnu.org/software/libtool/
|
|
||||||
|
|
||||||
|
|
||||||
.. _build-cmake:
|
|
||||||
|
|
||||||
CMake (various platforms, including Windows)
|
|
||||||
--------------------------------------------
|
|
||||||
|
|
||||||
Jansson can be built using CMake_. Create a build directory for an
|
|
||||||
out-of-tree build, change to that directory, and run ``cmake`` (or ``ccmake``,
|
|
||||||
``cmake-gui``, or similar) to configure the project.
|
|
||||||
|
|
||||||
See the examples below for more detailed information.
|
|
||||||
|
|
||||||
.. note:: In the below examples ``..`` is used as an argument for ``cmake``.
|
|
||||||
This is simply the path to the jansson project root directory.
|
|
||||||
In the example it is assumed you've created a sub-directory ``build``
|
|
||||||
and are using that. You could use any path you want.
|
|
||||||
|
|
||||||
.. _build-cmake-unix:
|
|
||||||
|
|
||||||
Unix (Make files)
|
|
||||||
^^^^^^^^^^^^^^^^^
|
|
||||||
Generating make files on unix:
|
|
||||||
|
|
||||||
.. parsed-literal::
|
|
||||||
|
|
||||||
bunzip2 -c jansson-|release|.tar.bz2 | tar xf -
|
|
||||||
cd jansson-|release|
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake .. # or `ccmake ..` for a GUI.
|
|
||||||
|
|
||||||
Then to build::
|
|
||||||
|
|
||||||
make
|
|
||||||
make check
|
|
||||||
make install
|
|
||||||
|
|
||||||
Windows (Visual Studio)
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
Creating Visual Studio project files from the command line:
|
|
||||||
|
|
||||||
.. parsed-literal::
|
|
||||||
|
|
||||||
<unpack>
|
|
||||||
cd jansson-|release|
|
|
||||||
|
|
||||||
md build
|
|
||||||
cd build
|
|
||||||
cmake -G "Visual Studio 10" ..
|
|
||||||
|
|
||||||
You will now have a *Visual Studio Solution* in your build directory.
|
|
||||||
To run the unit tests build the ``RUN_TESTS`` project.
|
|
||||||
|
|
||||||
If you prefer a GUI the ``cmake`` line in the above example can
|
|
||||||
be replaced with::
|
|
||||||
|
|
||||||
cmake-gui ..
|
|
||||||
|
|
||||||
For command line help (including a list of available generators)
|
|
||||||
for CMake_ simply run::
|
|
||||||
|
|
||||||
cmake
|
|
||||||
|
|
||||||
To list available CMake_ settings (and what they are currently set to)
|
|
||||||
for the project, run::
|
|
||||||
|
|
||||||
cmake -LH ..
|
|
||||||
|
|
||||||
Mac OSX (Xcode)
|
|
||||||
^^^^^^^^^^^^^^^
|
|
||||||
If you prefer using Xcode instead of make files on OSX,
|
|
||||||
do the following. (Use the same steps as
|
|
||||||
for :ref:`Unix <build-cmake-unix>`)::
|
|
||||||
|
|
||||||
...
|
|
||||||
cmake -G "Xcode" ..
|
|
||||||
|
|
||||||
Additional CMake settings
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Shared library
|
|
||||||
""""""""""""""
|
|
||||||
By default the CMake_ project will generate build files for building the
|
|
||||||
static library. To build the shared version use::
|
|
||||||
|
|
||||||
...
|
|
||||||
cmake -DBUILD_SHARED=1 ..
|
|
||||||
|
|
||||||
Changing install directory (same as autoconf --prefix)
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
Just as with the autoconf_ project you can change the destination directory
|
|
||||||
for ``make install``. The equivalent for autoconfs ``./configure --prefix``
|
|
||||||
in CMake_ is::
|
|
||||||
|
|
||||||
...
|
|
||||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=/some/other/path ..
|
|
||||||
make install
|
|
||||||
|
|
||||||
.. _CMake: http://www.cmake.org
|
|
||||||
|
|
||||||
Android
|
|
||||||
-------
|
|
||||||
|
|
||||||
Jansson can be built for Android platforms. Android.mk is in the
|
|
||||||
source root directory. The configuration header file is located in the
|
|
||||||
``android`` directory in the source distribution.
|
|
||||||
|
|
||||||
|
|
||||||
Windows
|
|
||||||
-------
|
|
||||||
|
|
||||||
**This method is deprecated**. Using :ref:`CMake <build-cmake>` is now
|
|
||||||
preferred.
|
|
||||||
|
|
||||||
Jansson can be built with Visual Studio 2010 (and probably newer
|
|
||||||
versions, too). The solution and project files are in the
|
|
||||||
``win32/vs2010/`` directory in the source distribution.
|
|
||||||
|
|
||||||
|
|
||||||
Other Systems
|
|
||||||
-------------
|
|
||||||
|
|
||||||
On non Unix-like systems, you may be unable to run the ``./configure``
|
|
||||||
script. In this case, follow these steps. All the files mentioned can
|
|
||||||
be found in the ``src/`` directory.
|
|
||||||
|
|
||||||
1. Create ``jansson_config.h`` (which has some platform-specific
|
|
||||||
parameters that are normally filled in by the ``./configure``
|
|
||||||
script). Edit ``jansson_config.h.in``, replacing all ``@variable@``
|
|
||||||
placeholders, and rename the file to ``jansson_config.h``.
|
|
||||||
|
|
||||||
2. Make ``jansson.h`` and ``jansson_config.h`` available to the
|
|
||||||
compiler, so that they can be found when compiling programs that
|
|
||||||
use Jansson.
|
|
||||||
|
|
||||||
3. Compile all the ``.c`` files (in the ``src/`` directory) into a
|
|
||||||
library file. Make the library available to the compiler, as in
|
|
||||||
step 2.
|
|
||||||
|
|
||||||
|
|
||||||
Building the Documentation
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
(This subsection describes how to build the HTML documentation you are
|
|
||||||
currently reading, so it can be safely skipped.)
|
|
||||||
|
|
||||||
Documentation is in the ``doc/`` subdirectory. It's written in
|
|
||||||
reStructuredText_ with Sphinx_ annotations. To generate the HTML
|
|
||||||
documentation, invoke::
|
|
||||||
|
|
||||||
make html
|
|
||||||
|
|
||||||
and point your browser to ``doc/_build/html/index.html``. Sphinx_ 1.0
|
|
||||||
or newer is required to generate the documentation.
|
|
||||||
|
|
||||||
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
|
|
||||||
.. _Sphinx: http://sphinx.pocoo.org/
|
|
||||||
|
|
||||||
|
|
||||||
Compiling Programs that Use Jansson
|
|
||||||
===================================
|
|
||||||
|
|
||||||
Jansson involves one C header file, :file:`jansson.h`, so it's enough
|
|
||||||
to put the line
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
#include <jansson.h>
|
|
||||||
|
|
||||||
in the beginning of every source file that uses Jansson.
|
|
||||||
|
|
||||||
There's also just one library to link with, ``libjansson``. Compile and
|
|
||||||
link the program as follows::
|
|
||||||
|
|
||||||
cc -o prog prog.c -ljansson
|
|
||||||
|
|
||||||
Starting from version 1.2, there's also support for pkg-config_::
|
|
||||||
|
|
||||||
cc -o prog prog.c `pkg-config --cflags --libs jansson`
|
|
||||||
|
|
||||||
.. _pkg-config: http://pkg-config.freedesktop.org/
|
|
@ -1,192 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009-2013 Petri Lehtinen <petri@digip.org>
|
|
||||||
*
|
|
||||||
* Jansson is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <jansson.h>
|
|
||||||
#include <curl/curl.h>
|
|
||||||
|
|
||||||
#define BUFFER_SIZE (256 * 1024) /* 256 KB */
|
|
||||||
|
|
||||||
#define URL_FORMAT "https://api.github.com/repos/%s/%s/commits"
|
|
||||||
#define URL_SIZE 256
|
|
||||||
|
|
||||||
/* Return the offset of the first newline in text or the length of
|
|
||||||
text if there's no newline */
|
|
||||||
static int newline_offset(const char *text)
|
|
||||||
{
|
|
||||||
const char *newline = strchr(text, '\n');
|
|
||||||
if(!newline)
|
|
||||||
return strlen(text);
|
|
||||||
else
|
|
||||||
return (int)(newline - text);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct write_result
|
|
||||||
{
|
|
||||||
char *data;
|
|
||||||
int pos;
|
|
||||||
};
|
|
||||||
|
|
||||||
static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream)
|
|
||||||
{
|
|
||||||
struct write_result *result = (struct write_result *)stream;
|
|
||||||
|
|
||||||
if(result->pos + size * nmemb >= BUFFER_SIZE - 1)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: too small buffer\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(result->data + result->pos, ptr, size * nmemb);
|
|
||||||
result->pos += size * nmemb;
|
|
||||||
|
|
||||||
return size * nmemb;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *request(const char *url)
|
|
||||||
{
|
|
||||||
CURL *curl = NULL;
|
|
||||||
CURLcode status;
|
|
||||||
char *data = NULL;
|
|
||||||
long code;
|
|
||||||
|
|
||||||
curl_global_init(CURL_GLOBAL_ALL);
|
|
||||||
curl = curl_easy_init();
|
|
||||||
if(!curl)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
data = malloc(BUFFER_SIZE);
|
|
||||||
if(!data)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
struct write_result write_result = {
|
|
||||||
.data = data,
|
|
||||||
.pos = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);
|
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result);
|
|
||||||
|
|
||||||
status = curl_easy_perform(curl);
|
|
||||||
if(status != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: unable to request data from %s:\n", url);
|
|
||||||
fprintf(stderr, "%s\n", curl_easy_strerror(status));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
|
|
||||||
if(code != 200)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: server responded with code %ld\n", code);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
curl_easy_cleanup(curl);
|
|
||||||
curl_global_cleanup();
|
|
||||||
|
|
||||||
/* zero-terminate the result */
|
|
||||||
data[write_result.pos] = '\0';
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
error:
|
|
||||||
if(data)
|
|
||||||
free(data);
|
|
||||||
if(curl)
|
|
||||||
curl_easy_cleanup(curl);
|
|
||||||
curl_global_cleanup();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
char *text;
|
|
||||||
char url[URL_SIZE];
|
|
||||||
|
|
||||||
json_t *root;
|
|
||||||
json_error_t error;
|
|
||||||
|
|
||||||
if(argc != 3)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s USER REPOSITORY\n\n", argv[0]);
|
|
||||||
fprintf(stderr, "List commits at USER's REPOSITORY.\n\n");
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(url, URL_SIZE, URL_FORMAT, argv[1], argv[2]);
|
|
||||||
|
|
||||||
text = request(url);
|
|
||||||
if(!text)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
root = json_loads(text, 0, &error);
|
|
||||||
free(text);
|
|
||||||
|
|
||||||
if(!root)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!json_is_array(root))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: root is not an array\n");
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i = 0; i < json_array_size(root); i++)
|
|
||||||
{
|
|
||||||
json_t *data, *sha, *commit, *message;
|
|
||||||
const char *message_text;
|
|
||||||
|
|
||||||
data = json_array_get(root, i);
|
|
||||||
if(!json_is_object(data))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit data %d is not an object\n", (int)(i + 1));
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sha = json_object_get(data, "sha");
|
|
||||||
if(!json_is_string(sha))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: sha is not a string\n", (int)(i + 1));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
commit = json_object_get(data, "commit");
|
|
||||||
if(!json_is_object(commit))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: commit is not an object\n", (int)(i + 1));
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = json_object_get(commit, "message");
|
|
||||||
if(!json_is_string(message))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: message is not a string\n", (int)(i + 1));
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message_text = json_string_value(message);
|
|
||||||
printf("%.8s %.*s\n",
|
|
||||||
json_string_value(sha),
|
|
||||||
newline_offset(message_text),
|
|
||||||
message_text);
|
|
||||||
}
|
|
||||||
|
|
||||||
json_decref(root);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
Jansson Documentation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
This is the documentation for Jansson_ |release|, last updated |today|.
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
Jansson_ is a C library for encoding, decoding and manipulating JSON
|
|
||||||
data. Its main features and design principles are:
|
|
||||||
|
|
||||||
- Simple and intuitive API and data model
|
|
||||||
|
|
||||||
- Comprehensive documentation
|
|
||||||
|
|
||||||
- No dependencies on other libraries
|
|
||||||
|
|
||||||
- Full Unicode support (UTF-8)
|
|
||||||
|
|
||||||
- Extensive test suite
|
|
||||||
|
|
||||||
Jansson is licensed under the `MIT license`_; see LICENSE in the
|
|
||||||
source distribution for details.
|
|
||||||
|
|
||||||
Jansson is used in production and its API is stable. It works on
|
|
||||||
numerous platforms, including numerous Unix like systems and Windows.
|
|
||||||
It's suitable for use on any system, including desktop, server, and
|
|
||||||
small embedded systems.
|
|
||||||
|
|
||||||
|
|
||||||
.. _`MIT license`: http://www.opensource.org/licenses/mit-license.php
|
|
||||||
.. _Jansson: http://www.digip.org/jansson/
|
|
||||||
|
|
||||||
Contents
|
|
||||||
--------
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
gettingstarted
|
|
||||||
upgrading
|
|
||||||
tutorial
|
|
||||||
conformance
|
|
||||||
portability
|
|
||||||
apiref
|
|
||||||
changes
|
|
||||||
|
|
||||||
|
|
||||||
Indices and Tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`search`
|
|
@ -1,52 +0,0 @@
|
|||||||
***********
|
|
||||||
Portability
|
|
||||||
***********
|
|
||||||
|
|
||||||
Thread safety
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Jansson is thread safe and has no mutable global state. The only
|
|
||||||
exception are the memory allocation functions, that should be set at
|
|
||||||
most once, and only on program startup. See
|
|
||||||
:ref:`apiref-custom-memory-allocation`.
|
|
||||||
|
|
||||||
There's no locking performed inside Jansson's code, so a multithreaded
|
|
||||||
program must perform its own locking if JSON values are shared by
|
|
||||||
multiple threads. Jansson's reference counting semantics may make this
|
|
||||||
a bit harder than it seems, as it's possible to have a reference to a
|
|
||||||
value that's also stored inside a list or object. Modifying the
|
|
||||||
container (adding or removing values) may trigger concurrent access to
|
|
||||||
such values, as containers manage the reference count of their
|
|
||||||
contained values. Bugs involving concurrent incrementing or
|
|
||||||
decrementing of deference counts may be hard to track.
|
|
||||||
|
|
||||||
The encoding functions (:func:`json_dumps()` and friends) track
|
|
||||||
reference loops by modifying the internal state of objects and arrays.
|
|
||||||
For this reason, encoding functions must not be run on the same JSON
|
|
||||||
values in two separate threads at the same time. As already noted
|
|
||||||
above, be especially careful if two arrays or objects share their
|
|
||||||
contained values with another array or object.
|
|
||||||
|
|
||||||
If you want to make sure that two JSON value hierarchies do not
|
|
||||||
contain shared values, use :func:`json_deep_copy()` to make copies.
|
|
||||||
|
|
||||||
Locale
|
|
||||||
------
|
|
||||||
|
|
||||||
Jansson works fine under any locale.
|
|
||||||
|
|
||||||
However, if the host program is multithreaded and uses ``setlocale()``
|
|
||||||
to switch the locale in one thread while Jansson is currently encoding
|
|
||||||
or decoding JSON data in another thread, the result may be wrong or
|
|
||||||
the program may even crash.
|
|
||||||
|
|
||||||
Jansson uses locale specific functions for certain string conversions
|
|
||||||
in the encoder and decoder, and then converts the locale specific
|
|
||||||
values to/from the JSON representation. This fails if the locale
|
|
||||||
changes between the string conversion and the locale-to-JSON
|
|
||||||
conversion. This can only happen in multithreaded programs that use
|
|
||||||
``setlocale()``, because ``setlocale()`` switches the locale for all
|
|
||||||
running threads, not only the thread that calls ``setlocale()``.
|
|
||||||
|
|
||||||
If your program uses ``setlocale()`` as described above, consider
|
|
||||||
using the thread-safe ``uselocale()`` instead.
|
|
@ -1,286 +0,0 @@
|
|||||||
.. _tutorial:
|
|
||||||
|
|
||||||
********
|
|
||||||
Tutorial
|
|
||||||
********
|
|
||||||
|
|
||||||
.. highlight:: c
|
|
||||||
|
|
||||||
In this tutorial, we create a program that fetches the latest commits
|
|
||||||
of a repository in GitHub_ over the web. `GitHub API`_ uses JSON, so
|
|
||||||
the result can be parsed using Jansson.
|
|
||||||
|
|
||||||
To stick to the the scope of this tutorial, we will only cover the the
|
|
||||||
parts of the program related to handling JSON data. For the best user
|
|
||||||
experience, the full source code is available:
|
|
||||||
:download:`github_commits.c`. To compile it (on Unix-like systems with
|
|
||||||
gcc), use the following command::
|
|
||||||
|
|
||||||
gcc -o github_commits github_commits.c -ljansson -lcurl
|
|
||||||
|
|
||||||
libcurl_ is used to communicate over the web, so it is required to
|
|
||||||
compile the program.
|
|
||||||
|
|
||||||
The command line syntax is::
|
|
||||||
|
|
||||||
github_commits USER REPOSITORY
|
|
||||||
|
|
||||||
``USER`` is a GitHub user ID and ``REPOSITORY`` is the repository
|
|
||||||
name. Please note that the GitHub API is rate limited, so if you run
|
|
||||||
the program too many times within a short period of time, the sever
|
|
||||||
starts to respond with an error.
|
|
||||||
|
|
||||||
.. _GitHub: https://github.com/
|
|
||||||
.. _GitHub API: http://developer.github.com/
|
|
||||||
.. _libcurl: http://curl.haxx.se/
|
|
||||||
|
|
||||||
|
|
||||||
.. _tutorial-github-commits-api:
|
|
||||||
|
|
||||||
The GitHub Repo Commits API
|
|
||||||
===========================
|
|
||||||
|
|
||||||
The `GitHub Repo Commits API`_ is used by sending HTTP requests to
|
|
||||||
URLs like ``https://api.github.com/repos/USER/REPOSITORY/commits``,
|
|
||||||
where ``USER`` and ``REPOSITORY`` are the GitHub user ID and the name
|
|
||||||
of the repository whose commits are to be listed, respectively.
|
|
||||||
|
|
||||||
GitHub responds with a JSON array of the following form:
|
|
||||||
|
|
||||||
.. code-block:: none
|
|
||||||
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"sha": "<the commit ID>",
|
|
||||||
"commit": {
|
|
||||||
"message": "<the commit message>",
|
|
||||||
<more fields, not important to this tutorial...>
|
|
||||||
},
|
|
||||||
<more fields...>
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"sha": "<the commit ID>",
|
|
||||||
"commit": {
|
|
||||||
"message": "<the commit message>",
|
|
||||||
<more fields...>
|
|
||||||
},
|
|
||||||
<more fields...>
|
|
||||||
},
|
|
||||||
<more commits...>
|
|
||||||
]
|
|
||||||
|
|
||||||
In our program, the HTTP request is sent using the following
|
|
||||||
function::
|
|
||||||
|
|
||||||
static char *request(const char *url);
|
|
||||||
|
|
||||||
It takes the URL as a parameter, preforms a HTTP GET request, and
|
|
||||||
returns a newly allocated string that contains the response body. If
|
|
||||||
the request fails, an error message is printed to stderr and the
|
|
||||||
return value is *NULL*. For full details, refer to :download:`the code
|
|
||||||
<github_commits.c>`, as the actual implementation is not important
|
|
||||||
here.
|
|
||||||
|
|
||||||
.. _GitHub Repo Commits API: http://developer.github.com/v3/repos/commits/
|
|
||||||
|
|
||||||
.. _tutorial-the-program:
|
|
||||||
|
|
||||||
The Program
|
|
||||||
===========
|
|
||||||
|
|
||||||
First the includes::
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <jansson.h>
|
|
||||||
|
|
||||||
Like all the programs using Jansson, we need to include
|
|
||||||
:file:`jansson.h`.
|
|
||||||
|
|
||||||
The following definitions are used to build the GitHub API request
|
|
||||||
URL::
|
|
||||||
|
|
||||||
#define URL_FORMAT "https://api.github.com/repos/%s/%s/commits"
|
|
||||||
#define URL_SIZE 256
|
|
||||||
|
|
||||||
The following function is used when formatting the result to find the
|
|
||||||
first newline in the commit message::
|
|
||||||
|
|
||||||
/* Return the offset of the first newline in text or the length of
|
|
||||||
text if there's no newline */
|
|
||||||
static int newline_offset(const char *text)
|
|
||||||
{
|
|
||||||
const char *newline = strchr(text, '\n');
|
|
||||||
if(!newline)
|
|
||||||
return strlen(text);
|
|
||||||
else
|
|
||||||
return (int)(newline - text);
|
|
||||||
}
|
|
||||||
|
|
||||||
The main function follows. In the beginning, we first declare a bunch
|
|
||||||
of variables and check the command line parameters::
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
char *text;
|
|
||||||
char url[URL_SIZE];
|
|
||||||
|
|
||||||
json_t *root;
|
|
||||||
json_error_t error;
|
|
||||||
|
|
||||||
if(argc != 3)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s USER REPOSITORY\n\n", argv[0]);
|
|
||||||
fprintf(stderr, "List commits at USER's REPOSITORY.\n\n");
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
Then we build the request URL using the user and repository names
|
|
||||||
given as command line parameters::
|
|
||||||
|
|
||||||
snprintf(url, URL_SIZE, URL_FORMAT, argv[1], argv[2]);
|
|
||||||
|
|
||||||
This uses the ``URL_SIZE`` and ``URL_FORMAT`` constants defined above.
|
|
||||||
Now we're ready to actually request the JSON data over the web::
|
|
||||||
|
|
||||||
text = request(url);
|
|
||||||
if(!text)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
If an error occurs, our function ``request`` prints the error and
|
|
||||||
returns *NULL*, so it's enough to just return 1 from the main
|
|
||||||
function.
|
|
||||||
|
|
||||||
Next we'll call :func:`json_loads()` to decode the JSON text we got
|
|
||||||
as a response::
|
|
||||||
|
|
||||||
root = json_loads(text, 0, &error);
|
|
||||||
free(text);
|
|
||||||
|
|
||||||
if(!root)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
We don't need the JSON text anymore, so we can free the ``text``
|
|
||||||
variable right after decoding it. If :func:`json_loads()` fails, it
|
|
||||||
returns *NULL* and sets error information to the :type:`json_error_t`
|
|
||||||
structure given as the second parameter. In this case, our program
|
|
||||||
prints the error information out and returns 1 from the main function.
|
|
||||||
|
|
||||||
Now we're ready to extract the data out of the decoded JSON response.
|
|
||||||
The structure of the response JSON was explained in section
|
|
||||||
:ref:`tutorial-github-commits-api`.
|
|
||||||
|
|
||||||
We check that the returned value really is an array::
|
|
||||||
|
|
||||||
if(!json_is_array(root))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: root is not an array\n");
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Then we proceed to loop over all the commits in the array::
|
|
||||||
|
|
||||||
for(i = 0; i < json_array_size(root); i++)
|
|
||||||
{
|
|
||||||
json_t *data, *sha, *commit, *message;
|
|
||||||
const char *message_text;
|
|
||||||
|
|
||||||
data = json_array_get(root, i);
|
|
||||||
if(!json_is_object(data))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit data %d is not an object\n", i + 1);
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
...
|
|
||||||
|
|
||||||
The function :func:`json_array_size()` returns the size of a JSON
|
|
||||||
array. First, we again declare some variables and then extract the
|
|
||||||
i'th element of the ``root`` array using :func:`json_array_get()`.
|
|
||||||
We also check that the resulting value is a JSON object.
|
|
||||||
|
|
||||||
Next we'll extract the commit ID (a hexadecimal SHA-1 sum),
|
|
||||||
intermediate commit info object, and the commit message from that
|
|
||||||
object. We also do proper type checks::
|
|
||||||
|
|
||||||
sha = json_object_get(data, "sha");
|
|
||||||
if(!json_is_string(sha))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: sha is not a string\n", i + 1);
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
commit = json_object_get(data, "commit");
|
|
||||||
if(!json_is_object(commit))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: commit is not an object\n", i + 1);
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = json_object_get(commit, "message");
|
|
||||||
if(!json_is_string(message))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error: commit %d: message is not a string\n", i + 1);
|
|
||||||
json_decref(root);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
...
|
|
||||||
|
|
||||||
And finally, we'll print the first 8 characters of the commit ID and
|
|
||||||
the first line of the commit message. A C-style string is extracted
|
|
||||||
from a JSON string using :func:`json_string_value()`::
|
|
||||||
|
|
||||||
message_text = json_string_value(message);
|
|
||||||
printf("%.8s %.*s\n",
|
|
||||||
json_string_value(id),
|
|
||||||
newline_offset(message_text),
|
|
||||||
message_text);
|
|
||||||
}
|
|
||||||
|
|
||||||
After sending the HTTP request, we decoded the JSON text using
|
|
||||||
:func:`json_loads()`, remember? It returns a *new reference* to the
|
|
||||||
JSON value it decodes. When we're finished with the value, we'll need
|
|
||||||
to decrease the reference count using :func:`json_decref()`. This way
|
|
||||||
Jansson can release the resources::
|
|
||||||
|
|
||||||
json_decref(root);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
For a detailed explanation of reference counting in Jansson, see
|
|
||||||
:ref:`apiref-reference-count` in :ref:`apiref`.
|
|
||||||
|
|
||||||
The program's ready, let's test it and view the latest commits in
|
|
||||||
Jansson's repository::
|
|
||||||
|
|
||||||
$ ./github_commits akheron jansson
|
|
||||||
1581f26a Merge branch '2.3'
|
|
||||||
aabfd493 load: Change buffer_pos to be a size_t
|
|
||||||
bd72efbd load: Avoid unexpected behaviour in macro expansion
|
|
||||||
e8fd3e30 Document and tweak json_load_callback()
|
|
||||||
873eddaf Merge pull request #60 from rogerz/contrib
|
|
||||||
bd2c0c73 Ignore the binary test_load_callback
|
|
||||||
17a51a4b Merge branch '2.3'
|
|
||||||
09c39adc Add json_load_callback to the list of exported symbols
|
|
||||||
cbb80baf Merge pull request #57 from rogerz/contrib
|
|
||||||
040bd7b0 Add json_load_callback()
|
|
||||||
2637faa4 Make test stripping locale independent
|
|
||||||
<...>
|
|
||||||
|
|
||||||
|
|
||||||
Conclusion
|
|
||||||
==========
|
|
||||||
|
|
||||||
In this tutorial, we implemented a program that fetches the latest
|
|
||||||
commits of a GitHub repository using the GitHub Repo Commits API.
|
|
||||||
Jansson was used to decode the JSON response and to extract the commit
|
|
||||||
data.
|
|
||||||
|
|
||||||
This tutorial only covered a small part of Jansson. For example, we
|
|
||||||
did not create or manipulate JSON values at all. Proceed to
|
|
||||||
:ref:`apiref` to explore all features of Jansson.
|
|
@ -1,76 +0,0 @@
|
|||||||
.. highlight:: c
|
|
||||||
|
|
||||||
******************
|
|
||||||
Upgrading from 1.x
|
|
||||||
******************
|
|
||||||
|
|
||||||
This chapter lists the backwards incompatible changes introduced in
|
|
||||||
Jansson 2.0, and the steps that are needed for upgrading your code.
|
|
||||||
|
|
||||||
**The incompatibilities are not dramatic.** The biggest change is that
|
|
||||||
all decoding functions now require and extra parameter. Most programs
|
|
||||||
can be modified to work with 2.0 by adding a ``0`` as the second
|
|
||||||
parameter to all calls of :func:`json_loads()`, :func:`json_loadf()`
|
|
||||||
and :func:`json_load_file()`.
|
|
||||||
|
|
||||||
|
|
||||||
Compatibility
|
|
||||||
=============
|
|
||||||
|
|
||||||
Jansson 2.0 is backwards incompatible with the Jansson 1.x releases.
|
|
||||||
It is ABI incompatible, i.e. all programs dynamically linking to the
|
|
||||||
Jansson library need to be recompiled. It's also API incompatible,
|
|
||||||
i.e. the source code of programs using Jansson 1.x may need
|
|
||||||
modifications to make them compile against Jansson 2.0.
|
|
||||||
|
|
||||||
All the 2.x releases are guaranteed to be backwards compatible for
|
|
||||||
both ABI and API, so no recompilation or source changes are needed
|
|
||||||
when upgrading from 2.x to 2.y.
|
|
||||||
|
|
||||||
|
|
||||||
List of Incompatible Changes
|
|
||||||
============================
|
|
||||||
|
|
||||||
**Decoding flags**
|
|
||||||
For future needs, a ``flags`` parameter was added as the second
|
|
||||||
parameter to all decoding functions, i.e. :func:`json_loads()`,
|
|
||||||
:func:`json_loadf()` and :func:`json_load_file()`. All calls to
|
|
||||||
these functions need to be changed by adding a ``0`` as the second
|
|
||||||
argument. For example::
|
|
||||||
|
|
||||||
/* old code */
|
|
||||||
json_loads(input, &error);
|
|
||||||
|
|
||||||
/* new code */
|
|
||||||
json_loads(input, 0, &error);
|
|
||||||
|
|
||||||
|
|
||||||
**Underlying type of JSON integers**
|
|
||||||
The underlying C type of JSON integers has been changed from
|
|
||||||
:type:`int` to the widest available signed integer type, i.e.
|
|
||||||
:type:`long long` or :type:`long`, depending on whether
|
|
||||||
:type:`long long` is supported on your system or not. This makes
|
|
||||||
the whole 64-bit integer range available on most modern systems.
|
|
||||||
|
|
||||||
``jansson.h`` has a typedef :type:`json_int_t` to the underlying
|
|
||||||
integer type. :type:`int` should still be used in most cases when
|
|
||||||
dealing with smallish JSON integers, as the compiler handles
|
|
||||||
implicit type coercion. Only when the full 64-bit range is needed,
|
|
||||||
:type:`json_int_t` should be explicitly used.
|
|
||||||
|
|
||||||
|
|
||||||
**Maximum encoder indentation depth**
|
|
||||||
The maximum argument of the ``JSON_INDENT()`` macro has been
|
|
||||||
changed from 255 to 31, to free up bits from the ``flags``
|
|
||||||
parameter of :func:`json_dumps()`, :func:`json_dumpf()` and
|
|
||||||
:func:`json_dump_file()`. If your code uses a bigger indentation
|
|
||||||
than 31, it needs to be changed.
|
|
||||||
|
|
||||||
|
|
||||||
**Unsigned integers in API functions**
|
|
||||||
Version 2.0 unifies unsigned integer usage in the API. All uses of
|
|
||||||
:type:`unsigned int` and :type:`unsigned long` have been replaced
|
|
||||||
with :type:`size_t`. This includes flags, container sizes, etc.
|
|
||||||
This should not require source code changes, as both
|
|
||||||
:type:`unsigned int` and :type:`unsigned long` are usually
|
|
||||||
compatible with :type:`size_t`.
|
|
@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010-2013 Petri Lehtinen <petri@digip.org>
|
|
||||||
*
|
|
||||||
* Jansson is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This file specifies a part of the site-specific configuration for
|
|
||||||
* Jansson, namely those things that affect the public API in
|
|
||||||
* jansson.h.
|
|
||||||
*
|
|
||||||
* The configure script copies this file to jansson_config.h and
|
|
||||||
* replaces @var@ substitutions by values that fit your system. If you
|
|
||||||
* cannot run the configure script, you can do the value substitution
|
|
||||||
* by hand.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef JANSSON_CONFIG_H
|
|
||||||
#define JANSSON_CONFIG_H
|
|
||||||
|
|
||||||
/* If your compiler supports the inline keyword in C, JSON_INLINE is
|
|
||||||
defined to `inline', otherwise empty. In C++, the inline is always
|
|
||||||
supported. */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define JSON_INLINE inline
|
|
||||||
#else
|
|
||||||
#define JSON_INLINE __inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If your compiler supports the `long long` type and the strtoll()
|
|
||||||
library function, JSON_INTEGER_IS_LONG_LONG is defined to 1,
|
|
||||||
otherwise to 0. */
|
|
||||||
#define JSON_INTEGER_IS_LONG_LONG 1
|
|
||||||
|
|
||||||
/* If locale.h and localeconv() are available, define to 1,
|
|
||||||
otherwise to 0. */
|
|
||||||
#define JSON_HAVE_LOCALECONV 1
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
|
||||||
# Visual C++ Express 2010
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jansson", "jansson.vcxproj", "{76226D20-1972-4789-A595-EDACC7A76DC3}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{76226D20-1972-4789-A595-EDACC7A76DC3}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{76226D20-1972-4789-A595-EDACC7A76DC3}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{76226D20-1972-4789-A595-EDACC7A76DC3}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{76226D20-1972-4789-A595-EDACC7A76DC3}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,108 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\dump.c" />
|
|
||||||
<ClCompile Include="..\..\src\error.c" />
|
|
||||||
<ClCompile Include="..\..\src\hashtable.c" />
|
|
||||||
<ClCompile Include="..\..\src\load.c" />
|
|
||||||
<ClCompile Include="..\..\src\memory.c" />
|
|
||||||
<ClCompile Include="..\..\src\pack_unpack.c" />
|
|
||||||
<ClCompile Include="..\..\src\strbuffer.c" />
|
|
||||||
<ClCompile Include="..\..\src\strconv.c" />
|
|
||||||
<ClCompile Include="..\..\src\utf.c" />
|
|
||||||
<ClCompile Include="..\..\src\value.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\src\hashtable.h" />
|
|
||||||
<ClInclude Include="..\..\src\jansson.h" />
|
|
||||||
<ClInclude Include="..\..\src\jansson_private.h" />
|
|
||||||
<ClInclude Include="..\..\src\strbuffer.h" />
|
|
||||||
<ClInclude Include="..\..\src\utf.h" />
|
|
||||||
<ClInclude Include="..\jansson_config.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{76226D20-1972-4789-A595-EDACC7A76DC3}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>jansson_dll</RootNamespace>
|
|
||||||
<ProjectName>jansson</ProjectName>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
<OutDir>Output\$(Configuration)\</OutDir>
|
|
||||||
<IntDir>Build\$(Configuration)\</IntDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
<OutDir>Output\$(Configuration)\</OutDir>
|
|
||||||
<IntDir>Build\$(Configuration)\</IntDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JANSSON_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>..</AdditionalIncludeDirectories>
|
|
||||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ModuleDefinitionFile>../../src/jansson.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JANSSON_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>..</AdditionalIncludeDirectories>
|
|
||||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<ModuleDefinitionFile>../../src/jansson.def</ModuleDefinitionFile>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\dump.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\error.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\hashtable.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\load.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\memory.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\pack_unpack.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\strbuffer.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\strconv.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\utf.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\value.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\src\hashtable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\jansson.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\jansson_private.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\strbuffer.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\utf.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\jansson_config.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,3 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
</Project>
|
|
Loading…
x
Reference in New Issue
Block a user