Blame README.md

Packit ea8578
`json-c`                       {#mainpage}
Packit ea8578
========
Packit ea8578
Packit ea8578
1. [Overview and Build Status](#overview)
Packit ea8578
2. [Building on Unix](#buildunix)
Packit ea8578
3. [Install Prerequisites](#installprereq)
Packit ea8578
4. [Building with partial threading support](#buildthreaded)
Packit ea8578
5. [Linking to libjson-c](#linking)
Packit ea8578
6. [Using json-c](#using)
Packit ea8578
Packit ea8578
JSON-C - A JSON implementation in C 
Packit ea8578
-----------------------------------
Packit ea8578
Packit ea8578
Build Status
Packit ea8578
* [AppVeyor Build](https://ci.appveyor.com/project/hawicz/json-c) ![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/json-c/json-c?branch=master&svg=true)
Packit ea8578
* [Travis Build](https://travis-ci.org/json-c/json-c) ![Travis Build Status](https://travis-ci.org/json-c/json-c.svg?branch=master)
Packit ea8578
Packit ea8578
JSON-C implements a reference counting object model that allows you to easily 
Packit ea8578
construct JSON objects in C, output them as JSON formatted strings and parse 
Packit ea8578
JSON formatted strings back into the C representation of JSON objects.
Packit ea8578
It aims to conform to [RFC 7159](https://tools.ietf.org/html/rfc7159).
Packit ea8578
Packit ea8578
Packit ea8578
Building on Unix with `git`, `gcc` and `autotools` 
Packit ea8578
--------------------------------------------------
Packit ea8578
Packit ea8578
Home page for json-c: https://github.com/json-c/json-c/wiki
Packit ea8578
Packit ea8578
### Prerequisites:
Packit ea8578
Packit ea8578
See also the "Installing prerequisites" section below.
Packit ea8578
Packit ea8578
 - `gcc`, `clang`, or another C compiler
Packit ea8578
 - `libtool>=2.2.6b`
Packit ea8578
Packit ea8578
If you're not using a release tarball, you'll also need:
Packit ea8578
Packit ea8578
 - `autoconf>=2.64` (`autoreconf`)
Packit ea8578
 - `automake>=1.13`
Packit ea8578
Packit ea8578
Make sure you have a complete `libtool` install, including `libtoolize`.
Packit ea8578
Packit ea8578
To generate docs (e.g. as part of make distcheck) you'll also need:
Packit ea8578
 - `doxygen>=1.8.13`
Packit ea8578
Packit ea8578
### Build instructions:
Packit ea8578
Packit ea8578
`json-c` GitHub repo: https://github.com/json-c/json-c
Packit ea8578
Packit ea8578
```sh
Packit ea8578
$ git clone https://github.com/json-c/json-c.git
Packit ea8578
$ cd json-c
Packit ea8578
$ sh autogen.sh
Packit ea8578
```
Packit ea8578
Packit ea8578
followed by
Packit ea8578
Packit ea8578
```sh
Packit ea8578
$ ./configure  # --enable-threading
Packit ea8578
$ make
Packit ea8578
$ make install
Packit ea8578
```
Packit ea8578
Packit ea8578
To build and run the test programs:
Packit ea8578
Packit ea8578
```sh
Packit ea8578
$ make check
Packit ea8578
$ make USE_VALGRIND=0 check   # optionally skip using valgrind
Packit ea8578
```
Packit ea8578
Packit ea8578
Install prerequisites 
Packit ea8578
-----------------------
Packit ea8578
Packit ea8578
If you are on a relatively modern system, you'll likely be able to install
Packit ea8578
the prerequisites using your OS's packaging system.  
Packit ea8578
Packit ea8578
### Install using apt (e.g. Ubuntu 16.04.2 LTS)
Packit ea8578
```sh
Packit ea8578
sudo apt install git
Packit ea8578
sudo apt install autoconf automake libtool
Packit ea8578
sudo apt install valgrind # optional
Packit ea8578
```
Packit ea8578
Packit ea8578
Then start from the "git clone" command, above.
Packit ea8578
Packit ea8578
### Manually install and build autoconf, automake and libtool
Packit ea8578
Packit ea8578
For older OS's that don't have up-to-date version of the packages will
Packit ea8578
require a bit more work. For example, CentOS release 5.11, etc...
Packit ea8578
Packit ea8578
```sh
Packit ea8578
curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
Packit ea8578
curl -O http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
Packit ea8578
curl -O http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz
Packit ea8578
Packit ea8578
tar xzf autoconf-2.69.tar.gz
Packit ea8578
tar xzf automake-1.15.tar.gz
Packit ea8578
tar xzf libtool-2.2.6b.tar.gz
Packit ea8578
Packit ea8578
export PATH=${HOME}/ac_install/bin:$PATH
Packit ea8578
Packit ea8578
(cd autoconf-2.69 && \
Packit ea8578
  ./configure --prefix ${HOME}/ac_install && \
Packit ea8578
  make && \
Packit ea8578
  make install)
Packit ea8578
Packit ea8578
(cd automake-1.15 && \
Packit ea8578
  ./configure --prefix ${HOME}/ac_install && \
Packit ea8578
  make && \
Packit ea8578
  make install)
Packit ea8578
Packit ea8578
(cd libtool-2.2.6b && \
Packit ea8578
  ./configure --prefix ${HOME}/ac_install && \
Packit ea8578
  make && \
Packit ea8578
  make install)
Packit ea8578
```
Packit ea8578
Packit ea8578
Packit ea8578
Building with partial threading support 
Packit ea8578
----------------------------------------
Packit ea8578
Packit ea8578
Although json-c does not support fully multi-threaded access to
Packit ea8578
object trees, it has some code to help make use in threaded programs
Packit ea8578
a bit safer.  Currently, this is limited to using atomic operations for
Packit ea8578
json_object_get() and json_object_put().
Packit ea8578
Packit ea8578
Since this may have a performance impact, of at least 3x slower
Packit ea8578
according to https://stackoverflow.com/a/11609063, it is disabled by
Packit ea8578
default.  You may turn it on by adjusting your configure command with:
Packit ea8578
   --enable-threading
Packit ea8578
Packit ea8578
Separately, the default hash function used for object field keys,
Packit ea8578
lh_char_hash, uses a compare-and-swap operation to ensure the randomly
Packit ea8578
seed is only generated once.  Because this is a one-time operation, it
Packit ea8578
is always compiled in when the compare-and-swap operation is available.
Packit ea8578
Packit ea8578
Packit ea8578
Linking to `libjson-c` 
Packit ea8578
----------------------
Packit ea8578
Packit ea8578
If your system has `pkgconfig`,
Packit ea8578
then you can just add this to your `makefile`:
Packit ea8578
Packit ea8578
```make
Packit ea8578
CFLAGS += $(shell pkg-config --cflags json-c)
Packit ea8578
LDFLAGS += $(shell pkg-config --libs json-c)
Packit ea8578
```
Packit ea8578
Packit ea8578
Without `pkgconfig`, you would do something like this:
Packit ea8578
Packit ea8578
```make
Packit ea8578
JSON_C_DIR=/path/to/json_c/install
Packit ea8578
CFLAGS += -I$(JSON_C_DIR)/include/json-c
Packit ea8578
LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c
Packit ea8578
```
Packit ea8578
Packit ea8578
Packit ea8578
Using json-c 
Packit ea8578
------------
Packit ea8578
Packit ea8578
To use json-c you can either include json.h, or preferrably, one of the
Packit ea8578
following more specific header files:
Packit ea8578
Packit ea8578
* json_object.h  - Core types and methods.
Packit ea8578
* json_tokener.h - Methods for parsing and serializing json-c object trees.
Packit ea8578
* json_pointer.h - JSON Pointer (RFC 6901) implementation for retrieving
Packit ea8578
                   objects from a json-c object tree.
Packit ea8578
* json_object_iterator.h - Methods for iterating over single json_object instances.
Packit ea8578
* json_visit.h   - Methods for walking a tree of json-c objects.
Packit ea8578
* json_util.h    - Miscelleanous utility functions.
Packit ea8578
Packit ea8578
For a full list of headers see [files.html](files.html)
Packit ea8578