an extract() function. The original implementation used calloc() inside the
extract() routine which forced all clients, including embedded builds, to have a
heap. This was very heavy handed. The new solution is must more flexible.
* If the client want to use the print() functionality, they will have to support
calloc and string safe variable argument length function similar to snprintf.
This seems reasonable because if you can print, then you can typically support
these complex capabilities.
* For clients that don't want to print, but still want to parse the bacpp value
into a string, they can use the new extract() method, which only requires
supports for snprintf. This would require a compile time definition of
BACAPP_SNPRINTF_ENABLED.
* For clients which don't want the overhead of these heavy handed methods, it is
possible to set compile time flags to not inherit either the print() or the
extract() functions.
Renamed Lookup_Routed_Device_Address() as Routed_Device_Address_Lookup(), and replaced it in the routed npdu handler with a function that finds the "next" gateway or routed device, as per the destination address. (Less tied to the specifics of the gw_device.c implementation.)
Fixed a few build warnings (eg, %zu for size_t arguments).
Until we improve the makefile system, I've enabled BAC_ROUTING in config.h
Added new bacapp_decode_application_data_safe function and other *_safe functions that aim to prevent buffer overruns if encoded application message is malformed.
Note: bacstr unit tests currently have one failure.