Any new bugs, requests, or missing features should be reported as Github issues.
- zcbor.py:
- Allow --file-header to accept a path to a file with header contents
- Avoid generated names that are C keywords (capitalize them if present)
- Whenever generated code uses function pointers, add dummy calls using the function pointers, to verify that the arguments have the right type.
- Optimize range checks
- Convert function docs in comments to pep-257 docstrings and add some new docstrings
- C libraries:
- Remove zcbor_simple_*() functions from the header file to discourage their use.
- zcbor_decode: Allow deciding at run-time whether to enforce canonical data (via 'enforce_canonical'), instead of via ZCBOR_CANONICAL.
- zcbor_print.h: Move function implementations into new file zcbor_print.c
- Documentation:
- MIGRATION_GUIDE.md: Add a migration guide file
- README.md: Clarification on n_flags
- ARCHITECTURE.md: Small improvements to bring the document up to date
- zcbor.py:
- Fixes to support code generation on Windows
- Handle when files are on different drives in Windows
- Fix a few bugs in code generation to do with dereferencing
- Fix bug where NINT literals were not given unique names
- Fix a bug where empty groups and lists would give an error
- Fix bstr names based on size
- Don't omit zcbor_union_elem_code() when there is a range check.
- Fix bug where paths to generated files could not be absolute
- Fix a bug where some decoding function were not called
- Fix/improve deeply nested types
- Remove outdated assert statement that caused incorrect assert
- Fix a bug in CDDL parsing to do with nested brackets
- zcbor_decode:
- Fix various things related to constant_state
- Fix a bug with enforce_canonical (ZCBOR_CANONICAL) and floats
- zcbor_encode.c: Fix a length bug in zcbor_bstr_end_decode()
- zcbor_tags.h: Typo fix YANK -> YANG
Not all features outlined in the CDDL specs RFC8610, RFC9090, and RFC9165 are supported by zcbor. The following is a list of limitations and missing features:
- Generated code does not support unordered maps.
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operators
.regexp
,.ne
,.default
, and.within
from RFC8610. - The control operators
.sdnv
,.sdnvseq
, and.oid
from RFC9090. - The control operators
.plus
,.cat
,.det
,.abnf
,.abnfb
, and.feature
from RFC9165. - Generics (
foo<a, b>
). - Using
:
for map keys. - Cuts, either via
^
or implicitly via:
. - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
See also the release notes for 0.8.0 below.
- zcbor.py: Use zcbor_uint_decode() when decoding only positive enums
- zcbor_common.h: Add ZCBOR_VERSION macro
- zcbor_common.h: Add forward declaration for strnlen()
- zcbor.py: Fix conversion of UINT8_MAX to avoid script errors when using e.g. 255 in CDDL
- zcbor_print.h: Fix iterator type and print formats to avoid compiler warnings
Not all features outlined in the CDDL specs RFC8610, RFC9090, and RFC9165 are supported by zcbor. The following is a list of limitations and missing features:
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operators
.regexp
,.ne
,.default
, and.within
from RFC8610. - The control operators
.sdnv
,.sdnvseq
, and.oid
from RFC9090. - The control operators
.plus
,.cat
,.det
,.abnf
,.abnfb
, and.feature
from RFC9165. - Generics (
foo<a, b>
). - Using
:
for map keys. - Cuts, either via
^
or implicitly via:
. - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- C library: Add support for searching for elements in a map.
- Overhaul zcbor logging/printing
- Refactor printing of errors from generated functions
- zcbor_print.h: Improve zcbor_trace() and other tracing
- zcbor_print.h: Move from printk to printf
- Rename zcbor_print() to zcbor_log()
- zcbor_print.h: Move printing code to a new file zcbor_print.h
- zcbor_debug.h: Add function for getting error string and printing it
- Performance improvements
- zcbor.py: Refactor the regex matching to fix label and remove all_types_regex
- zcbor.py: Merge regexes for pure types without values
- zcbor.py: Add a cache for compiled regex patterns
- zcbor.py: Don't regenerate the big list of regexes every call
- zcbor_encode: Simplify value_encode() by using the new zcbor_header_len
- zcbor_decode.c: Streamline value_extract
- zcbor_common: Refactor zcbor_header_len
- zcbor.py: Don't use zcbor_present_encode()
- zcbor_common: Add a zcbor_entry_function helper
- Code generation name improvements:
- zcbor.py: Make generated variable names C-compatible.
- zcbor.py: Change name of generated choice enum members to add a '_c'
- Avoid leading and trailing as well as repeated underscores
- API cleanup/improvements:
- include: Rearrange and improve zcbor_decode.h and zcbor_encode.h
- zcbor_encode: Change zcbor_tag_encode to take a pointer argument
- zcbor_common: Rename ZCBOR_FLAG_TRANSFER_PAYLOAD to ZCBOR_FLAG_KEEP_PAYLOAD
- zcbor_decode: Add _pexpect() functions
- Internal cleanup:
- zcbor_encode, zcbor_decode: Move inline functions from header files
- zcbor_decode.c: Move MAJOR_TYPE() and ADDITIONAL() macros to zcbor_common.h
- src: Abstract float16 conversion and move it to zcbor_common.c
- zcbor_common: Add ZCBOR_FLAG_KEEP_DECODE_STATE to zcbor_process_backup()
- Move zcbor_array_at_end() from zcbor_common to zcbor_decode
- Move from setup.py to pyproject.toml for creation of zcbor packages
- zcbor_decode: Add validation that data follows canonical CBOR rules
- zcbor.py: Change the label regex to accept non-latin characters
- C library: Change usage of strlen to use strnlen
- zcbor.py: Fix range_checks for 'OTHER' type
- zcbor_decode.c: Fix "'num_decode' may be used uninitialized"
- zcbor.py: Generate cmake files with linux paths on Windows
- Remove references to uint_fast32_t
- Use ZCBOR_BIG_ENDIAN instead of CONFIG_BIG_ENDIAN
- zcbor.py: Fix cborhex generation so it generates newlines instead of spaces
- zcbor.py: Adjust the lower bound on negative numbers.
- zcbor_encode, zcbor_decode: fix double promotion warnings
- zcbor_print.h: Add missing errors to zcbor_error_str()
- zcbor_print.h: Fix memcmp expression
- zcbor.py: DataTranslator: fix type checking
Not all features outlined in the CDDL specs RFC8610, RFC9090, and RFC9165 are supported by zcbor. The following is a list of limitations and missing features:
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operators
.regexp
,.ne
,.default
, and.within
from RFC8610. - The control operators
.sdnv
,.sdnvseq
, and.oid
from RFC9090. - The control operators
.plus
,.cat
,.det
,.abnf
,.abnfb
, and.feature
from RFC9165. - Generics (
foo<a, b>
). - Using
:
for map keys. - Cuts, either via
^
or implicitly via:
. - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- Add support for float16 encoding and decoding
- Add support for C++ in generated code
- Use (U)INT(8|16|32|64)_(MIN|MAX) macros in generated code
- Add the --c-code-columns option for adding newlines to c_code
- Refactor CBOR <-> YAML/JSON translation
- Allow adding file headers to generated files, e.g. for copyright.
- Add support for float16 encoding and decoding
- Add helper functions zcbor_compare_strings() and zcbor_header_len()
- Rename prim/primitive to simple
- Add new APIs zcbor_uint_(encode/decode)
- Move tags enum into separate file zcbor_tags.h and add more tags from the IANA list
- When generating cmake files, make all paths relative to the cmake file.
- Use the zcbor_compare_strings() function in str_expect()
- Make the zcbor source files compile with -Wall and -Wconversion
- Refactor zcbor_any_skip()
- Change all uint_fast32_t usage to use size_t instead
- README: Improve docs, particularly to help new users
- Add two samples: a hello world with no code generation, and one with code generation and script usage
- Port decode/encode/unit tests to new ztest API
- Fix fuzz tests
- zcbor.py: Fix 'zcbor --version' so it works again
- zcbor.py: Fix cbor bstrs so they properly check unambiguous values
- zcbor.py: Fix rendering of entry functions when they have no output
- zcbor.py: Don't flag cbor bstrs as unambiguous
Not all features outlined in the CDDL specs RFC8610, RFC9090, and RFC9165 are supported by zcbor. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- C API doesn't support searching through a map.
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operators
.regexp
,.ne
,.default
, and.within
from RFC8610. - The control operators
.sdnv
,.sdnvseq
, and.oid
from RFC9090. - The control operators
.plus
,.cat
,.det
,.abnf
,.abnfb
, and.feature
from RFC9165. - Generics (
foo<a, b>
). - Using
:
for map keys. - Cuts, either via
^
or implicitly via:
. - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- Refactor zcbor CLI to add 'verify' and put all options after keyword
- Make several C++ related improvements in the C library
- Fix Coverity warnings in C library and generated code
- zcbor_decode: Add zcbor_int[32|64]_expect_union
- zcbor_common.h: Add new zcbor_assert_state() macro
- zcbor_common.h: Rename ARRAY_SIZE to ZCBOR_ARRAY_SIZE to avoid #include order problems in Zephyr
- .github: Refactor Github action and add QEMU testing on mps2_an521 (ARM) and qemu_malta_be (MIPS, big-endian)
- zcbor.py: Raise argparse error on insufficient --output-* args
- zcbor_decode.h: Define variables to avoid rvalue address errors
- Add release dates to all RELEASE_NOTES entries
- zcbor.py: Fix bug where the union_int optimization decodes twice
- zcbor_encode.c: Fix error for big-endian architectures
Not all features outlined in the CDDL spec are supported by zcbor. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- C API doesn't support searching through a map.
- 16-bit floating point numbers (float16).
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operator
.regexp
. - The control operator
.ne
. - The control operator
.default
. - Generics (
foo<a, b>
). - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- requirements.txt: Change PyYAML requirement from >6.0.0 to >5.4.1 to be more widely compatible.
- zcbor_encode/zcbor_decode: Add new functions zcbor_int_encode() and zcbor_int_decode() which accept the integer size as an argument.
- zcbor.py: Use zcbor_int_encode() and zcbor_int_decode() when operating directly on _choice enums, since enums can be any size, depending on compiler and project. This removes the restrictions that enums must be 32 bits.
- tests: Fix an error in manifest3.cddl (encode/test1) (naming collision with 'uri')
Not all features outlined in the CDDL spec are supported by zcbor. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- C API doesn't support searching through a map.
- 16-bit floating point numbers (float16).
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operator
.regexp
. - The control operator
.ne
. - The control operator
.default
. - Generics (
foo<a, b>
). - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- Add the --short-names option when generating code, which shortens names in struct definitions.
- Allow --default-max-qty to accept a string label when generating code so that the value can be configured after generation.
- Update versions of dependencies in pip requirements.
- Add const to *ptr argument of cbor_tstr_encode_ptr.
- Make it easier to initialize zcbor_state_t objects: Allow single states as input to zcbor_new_state() and remove return value.
- Make zcbor_list/map_end_encode() more robust to wrong max_num arguments (when ZCBOR_CANONICAL is enabled).
- Add zcbor_peek_error() for reading the error value without clearing it.
- Add zcbor_size_put/encode/decode/expect functions, to allow directly encoding and decoding size_t type variables.
- Test on multiple Python versions
- Add tests for using ranges (< or >) with floats in code generation.
- Add/enable test for signature check of SUIT manifests.
- zcbor.py: Fix missing size check for repeated bstrs with their own type
- zcbor_encode.c: Fix encoding of floats equal to 0.0 (or any with leading 0s)
- zcbor_encode.h: Fix "taking address of rvalue" errors with some compiler configurations, stemming from zcbor_b|tstr_encode_ptr()
- zcbor.py: Add forward declarations to functions in generated code.
- zcbor.py: Fix bug when adding tagged (#6.x) items to larger types, e.g. lists.
- zcbor.py: Fix naming bug for container types with no members.
- zcbor.py: "union_int" optimization: If all union members start with an integer, the optimization does a single int_decode() and identifies the correct union member by the result.
- zcbor.py: Fix a bug preventing the "union_int" optimization from being applied.
- zcbor.py: Expand the "union_uint" optimization to work on all integers, instead of only positive integers.
Not all features outlined in the CDDL spec are supported by zcbor. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- C API doesn't support searching through a map.
- 16-bit floating point numbers (float16).
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operator
.regexp
. - The control operator
.ne
. - The control operator
.default
. - Generics (
foo<a, b>
). - Most of the "Extended Diagnostic Notation" is unsupported.
cddl-gen has been renamed to zcbor!
Any new bugs, requests, or missing features should be reported as Github issues.
- Add support for 32-bit and 64-bit floating point numbers.
- Add support for
undefined
in CDDL. - Add the CDDL prelude (from RFC 8610 Appendix D) to all builds (unless excluded with
--no-prelude
) - Add support for more complex
.cbor
and.cborseq
expressions.
- Rename script/module to zcbor.
- Better 64-bit support:
- New argument:
--default-bit-size
which controls the assumed size of integers. See zcbor code--help
for more information.
- New argument:
- Add the
--include-prefix
option for path prefix to generated h files. - Allow using both
--encode
and--decode
together to generate both at the same time. - Make changes to generated code to build with
-Wpedantic
and-Wconversion
.
- All public function names have been prefixed with
zcbor_
. - Many function names have also been changed slightly.
- Better API docs.
- Add error value to state, which is populated when a function fails (returns
false
).- Add a
stop_on_error
feature that makes functions abort when an error has occurred (to avoid checking the output of all functions).
- Add a
- Add support for 32-bit and 64-bit floating point numbers.
- Better 64-bit support:
- New 64-bit integer decoding and encoding functions (in addition to existing 32-bit functions).
uint32_t
usage has been largely transitioned tosize_t
oruint_fast32_t
which are typically the same size as the architecture (32 or 64 bits).- This means that list/map/string sizes can be 64 bits on 64-bit architectures. Note that having 64-bit sizes on 32-bit architectures rarely make sense since they won't fit in the address space.
- New helper macros for instantiating state variables:
ZCBOR_STATE_D()
andZCBOR_STATE_E()
for decoding and encoding respectively. - Add support for decoding payloads split over multiple memory chunks.
- There are new APIs in zcbor_common.h and zcbor_decode.h to handle this. Look for
zcbor_update_state()
and various functions withfragment
in the name. - Strings can be split between chunks, there is a new type
struct zcbor_string_fragment
for this purpose. - Data headers can not be split.
- Backups to previous chunks cannot be restored.
- There are new APIs in zcbor_common.h and zcbor_decode.h to handle this. Look for
- Split
zcbor_multi_encode()
intozcbor_multi_encode()
andzcbor_multi_encode_minmax()
. The former is more useful for manual use, while the latter is for generated code. - Remove
zcbor_any_encode()
since it was just an alias forzcbor_nil_put()
. - Rename
zcbor_string_type_t
tostruct zcbor_string
. - Rename
zcbor_state_backups_t
tostruct zcbor_state_constant
. - Add support for decoding and encoding
undefined
CBOR values. zcbor_any_decode()
:- Rename to
zcbor_any_skip()
- Add support for indeterminate-length arrays.
- Have
zcbor_any_skip()
consume any tags that are present.
- Rename to
- Introduce
zcbor_bstr_expect_ptr()
,zcbor_bstr_put_ptr()
,zcbor_tstr_expect_ptr()
, andzcbor_tstr_put_ptr()
- zcbor_common.h: Add an enum (
zcbor_rfc8949_tag
) with some tag values. - Move CBOR intro text from zcbor_decode.h to README.
- Control asserts separately from verbose (add ZCBOR_ASSERT option)
- Introduce
zcbor_list_map_end_force_encode()
andzcbor_list_map_end_force_decode()
.
- decode: Remove test4 since it hasn't been used or updated.
- New unit test directory and project. Tests:
- 64-bit vs 32-bit integers.
- 64-bit vs 32-bit strings.
- String encoding and decoding macros (
_lit()
,_arr()
,_term()
). - Payload chunks and string fragments.
- Collect boilerplate Cmake code for tests into a new file test_template.cmake.
- Add tests for draft-ietf-suit-manifest-16.
- Rename "strange" tests to "corner_cases"
- Build tests with
-Wpedantic
and-Wconversion
- zcbor.py: Avoid #include-ing the full path of the type file.
- zcbor.py: Avoid creating functions with "None" result type.
- src: Fix code so it builds correctly with asserts enabled.
- zcbor_decode.c: Fix
list_map_start_decode()
to handle elem_count correctly - zcbor_decode.c: Fix
zcbor_any_skip()
so it reverts the state correctly on fail. - zcbor.py: Fix regex for ints/floats to ignore names with hyphens (-)
- zcbor.py: Fix error in 'convert' where a bstr dict value was incorrectly translated
- setup.py: Fix windows install
- zcbor.py: Add suffix for literal values larger than 32-bits.
- src: Fix code to build with
-Wpedantic
and-Wconversion
. - zcbor.py: Fix some code generation bugs to do with range checking (min/max size) of ints and CBOR-encoded bstrs.
- zcbor.py: Fix bug where indirection for ints with range checks was wrong.
- zcbor.py: Fix bugs in range checks in
bstr
s with.cbor
statements.
Not all features outlined in the CDDL spec are supported by zcbor. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- C API doesn't support searching through a map.
- 16-bit floating point numbers (float16).
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operator
.regexp
. - The control operator
.ne
. - The control operator
.default
. - Generics (
foo<a, b>
). - Most of the "Extended Diagnostic Notation" is unsupported.
Any new bugs, requests, or missing features should be reported as Github issues.
- Add more support for hexadecimal/octal/binary numbers in CDDL. E.g. in size ranges or value limits
- Add support for ranges with three dots in CDDL files
- Change CDDL quantifier syntax from
x**y
tox*y
- Add support for
$$
and$
- Add support for the
.bits
operator.
- Change command line name from
cddl_gen
tocddl-gen
- Add
--dq
as a shorthand for--default-max-qty
- Allow passing multiple cddl files via command line
- Allow adding the current git sha to generated file headers.
- Various changes to the logic for naming in code generation
- This can give different names of e.g. struct members compared with previous versions of cddl-gen
- Generate a cmake file when generating code.
- The
target_cddl_source()
Cmake function has been removed. - See README.md for more info.
- The
- Improve tags support in DataTranslator
- Improve decoding of cbor bstrs in DataTranslator
- Provide the raw string along with the decoded object.
- Refactor cbor_common.c
- Add support for indefinite length arrays in cbor_decode.c.
- Move all cddl files into tests/cases
- Run tests with twister instead of custom bash scripts
- Add tests for draft-ietf-suit-manifest-14
- cbor_encode.h: Add missing
.
intstrx_put
andtstrx_put_term
- cbor_encode.c: Fix
get_result_len
and add big-endian support - cddl_gen.py: Fix bug where range checks were dropped
- cbor_decode.c: Fix bug where a
nil
could be interpreted astrue
- cddl_gen.py: Fix parsing of ranges with no max (
n*
orn**
) - cbor_encode.c: Fix bug where minimum quantity restrictions were ignored
- cddl_gen: Fix generation of map-within-map
- cbor_decode.c: Add overflow checks and fix assert in
any_decode()
.
Not all features outlined in the CDDL spec are supported by cddl-gen. The following is a list of limitations and missing features:
- Map elements in data must appear in the same order as they appear in the CDDL.
- Floating point numbers.
- Using
&()
to turn groups into choices (unions).&()
is supported when used with.bits
. - Representation Types (
#x.y
), except for tags (#6.y(foo)
) which are supported. - Unwrapping (
~
) - The control operator
.regexp
. - The control operator
.ne
. - The control operator
.default
. - Generics (
foo<a, b>
). - Not all types from the "standard prelude" are supported.
- Most of the "Extended Diagnostic Notation" is unsupported.