aboutsummaryrefslogtreecommitdiff
path: root/contrib/libcbor/doc/source/using.rst
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libcbor/doc/source/using.rst')
-rw-r--r--contrib/libcbor/doc/source/using.rst174
1 files changed, 174 insertions, 0 deletions
diff --git a/contrib/libcbor/doc/source/using.rst b/contrib/libcbor/doc/source/using.rst
new file mode 100644
index 000000000000..ccb7372f23b6
--- /dev/null
+++ b/contrib/libcbor/doc/source/using.rst
@@ -0,0 +1,174 @@
+Usage & preliminaries
+=======================
+
+Version information
+--------------------
+
+libcbor exports its version using three self-explanatory macros:
+
+ - ``CBOR_MAJOR_VERSION``
+ - ``CBOR_MINOR_VERSION``
+ - ``CBOR_PATCH_VERSION``
+
+The ``CBOR_VERSION`` is a string concatenating these three identifiers into one (e.g. ``0.2.0``).
+
+In order to simplify version comparisons, the version is also exported as
+
+.. code-block:: c
+
+ #define CBOR_HEX_VERSION ((CBOR_MAJOR_VERSION << 16) | (CBOR_MINOR_VERSION << 8) | CBOR_PATCH_VERSION)
+
+Since macros are difficult to work with through FFIs, the same information is also available through three ``uint8_t`` constants,
+namely
+
+ - ``cbor_major_version``
+ - ``cbor_minor_version``
+ - ``cbor_patch_version``
+
+
+Headers to include
+---------------------
+
+The ``cbor.h`` header includes all the symbols. If, for any reason, you don't want to include all the exported symbols,
+feel free to use just some of the ``cbor/*.h`` headers:
+
+ - ``cbor/arrays.h`` - :doc:`api/type_4`
+ - ``cbor/bytestrings.h`` - :doc:`api/type_2`
+ - ``cbor/callbacks.h`` - Callbacks used for :doc:`api/streaming_decoding`
+ - ``cbor/common.h`` - Common utilities - always transitively included
+ - ``cbor/data.h`` - Data types definitions - always transitively included
+ - ``cbor/encoding.h`` - Streaming encoders for :doc:`api/streaming_encoding`
+ - ``cbor/floats_ctrls.h`` - :doc:`api/type_7`
+ - ``cbor/ints.h`` - :doc:`api/type_0_1`
+ - ``cbor/maps.h`` - :doc:`api/type_5`
+ - ``cbor/serialization.h`` - High level serialization such as :func:`cbor_serialize`
+ - ``cbor/streaming.h`` - Home of :func:`cbor_stream_decode`
+ - ``cbor/strings.h`` - :doc:`api/type_3`
+ - ``cbor/tags.h`` - :doc:`api/type_6`
+
+
+Using libcbor
+--------------
+
+If you want to get more familiar with CBOR, we recommend the `cbor.io <http://cbor.io/>`_ website. Once you get the grasp
+of what is it CBOR does, the examples (located in the ``examples`` directory) should give you a good feel of the API. The
+:doc:`API documentation <api>` should then provide with all the information you may need.
+
+
+**Creating and serializing items**
+
+.. code-block:: c
+
+ #include "cbor.h"
+ #include <stdio.h>
+
+ int main(int argc, char * argv[])
+ {
+ /* Preallocate the map structure */
+ cbor_item_t * root = cbor_new_definite_map(2);
+ /* Add the content */
+ cbor_map_add(root, (struct cbor_pair) {
+ .key = cbor_move(cbor_build_string("Is CBOR awesome?")),
+ .value = cbor_move(cbor_build_bool(true))
+ });
+ cbor_map_add(root, (struct cbor_pair) {
+ .key = cbor_move(cbor_build_uint8(42)),
+ .value = cbor_move(cbor_build_string("Is the answer"))
+ });
+ /* Output: `buffer_size` bytes of data in the `buffer` */
+ unsigned char * buffer;
+ size_t buffer_size;
+ cbor_serialize_alloc(root, &buffer, &buffer_size);
+
+ fwrite(buffer, 1, buffer_size, stdout);
+ free(buffer);
+
+ fflush(stdout);
+ cbor_decref(&root);
+ }
+
+
+**Reading serialized data**
+
+.. code-block:: c
+
+ #include "cbor.h"
+ #include <stdio.h>
+
+ /*
+ * Reads data from a file. Example usage:
+ * $ ./examples/readfile examples/data/nested_array.cbor
+ */
+
+ int main(int argc, char * argv[])
+ {
+ FILE * f = fopen(argv[1], "rb");
+ fseek(f, 0, SEEK_END);
+ size_t length = (size_t)ftell(f);
+ fseek(f, 0, SEEK_SET);
+ unsigned char * buffer = malloc(length);
+ fread(buffer, length, 1, f);
+
+ /* Assuming `buffer` contains `info.st_size` bytes of input data */
+ struct cbor_load_result result;
+ cbor_item_t * item = cbor_load(buffer, length, &result);
+ /* Pretty-print the result */
+ cbor_describe(item, stdout);
+ fflush(stdout);
+ /* Deallocate the result */
+ cbor_decref(&item);
+
+ fclose(f);
+ }
+
+
+**Using the streaming parser**
+
+.. code-block:: c
+
+ #include "cbor.h"
+ #include <stdio.h>
+ #include <string.h>
+
+ /*
+ * Illustrates how one might skim through a map (which is assumed to have
+ * string keys and values only), looking for the value of a specific key
+ *
+ * Use the examples/data/map.cbor input to test this.
+ */
+
+ const char * key = "a secret key";
+ bool key_found = false;
+
+ void find_string(void * _ctx, cbor_data buffer, size_t len)
+ {
+ if (key_found) {
+ printf("Found the value: %*s\n", (int) len, buffer);
+ key_found = false;
+ } else if (len == strlen(key)) {
+ key_found = (memcmp(key, buffer, len) == 0);
+ }
+ }
+
+ int main(int argc, char * argv[])
+ {
+ FILE * f = fopen(argv[1], "rb");
+ fseek(f, 0, SEEK_END);
+ size_t length = (size_t)ftell(f);
+ fseek(f, 0, SEEK_SET);
+ unsigned char * buffer = malloc(length);
+ fread(buffer, length, 1, f);
+
+ struct cbor_callbacks callbacks = cbor_empty_callbacks;
+ struct cbor_decoder_result decode_result;
+ size_t bytes_read = 0;
+ callbacks.string = find_string;
+ while (bytes_read < length) {
+ decode_result = cbor_stream_decode(buffer + bytes_read,
+ length - bytes_read,
+ &callbacks, NULL);
+ bytes_read += decode_result.read;
+ }
+
+ fclose(f);
+ }