Skip to content

Commit

Permalink
Remove from cborparser.c file the dependency on stdlib header
Browse files Browse the repository at this point in the history
Function _cbor_value_dup_string from cborparser.c is using malloc/free
functions, from sdtlib header, so it is not possible to compile the
cborparser in systems without stdlib support. Move this function to a
different c file in order to remove the dependency on stdlib header from
cborparser.

Signed-off-by: Otavio Pontes <otavio.pontes@intel.com>
Signed-off-by: Thiago Macieira <thiago.macieira@intel.com>
  • Loading branch information
Otavio Pontes authored and thiagomacieira committed Jul 8, 2016
1 parent dbc0129 commit 4ce5669
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 68 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ TINYCBOR_SOURCES = \
src/cborencoder.c \
src/cborencoder_close_container_checked.c \
src/cborparser.c \
src/cborparser_dup_string.c \
src/cborpretty.c \
src/cbortojson.c \
$(if $(open_memstream-pass),,src/open_memstream.c) \
Expand Down
3 changes: 2 additions & 1 deletion Makefile.nmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ TINYCBOR_SOURCES = \
src\cborencoder.c \
src\cborencoder_close_container_checked.c \
src\cborparser.c \
src\cborparser_dup_string.c \
src\cborpretty.c
TINYCBOR_OBJS = \
src\cborerrorstrings.obj \
src\cborencoder.obj \
src\cborencoder_close_container_checked.obj \
src\cborparser.obj \
src\cborparser_dup_string.obj \
src\cborpretty.obj

all: lib\tinycbor.lib
Expand Down
66 changes: 0 additions & 66 deletions src/cborparser.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include "extract_number_p.h"

#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include "assert_p.h" /* Always include last */
Expand Down Expand Up @@ -426,71 +425,6 @@ CborError cbor_value_calculate_string_length(const CborValue *value, size_t *len
return _cbor_value_copy_string(value, NULL, len, NULL);
}

/**
* \fn CborError cbor_value_dup_text_string(const CborValue *value, char **buffer, size_t *buflen, CborValue *next)
*
* Allocates memory for the string pointed by \a value and copies it into this
* buffer. The pointer to the buffer is stored in \a buffer and the number of
* bytes copied is stored in \a len (those variables must not be NULL).
*
* If \c malloc returns a NULL pointer, this function will return error
* condition \ref CborErrorOutOfMemory.
*
* On success, \c{*buffer} will contain a valid pointer that must be freed by
* calling \c{free()}. This is the case even for zero-length strings.
*
* The \a next pointer, if not null, will be updated to point to the next item
* after this string. If \a value points to the last item, then \a next will be
* invalid.
*
* \note This function does not perform UTF-8 validation on the incoming text
* string.
*
* \sa cbor_value_copy_text_string(), cbor_value_dup_byte_string()
*/

/**
* \fn CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer, size_t *buflen, CborValue *next)
*
* Allocates memory for the string pointed by \a value and copies it into this
* buffer. The pointer to the buffer is stored in \a buffer and the number of
* bytes copied is stored in \a len (those variables must not be NULL).
*
* If \c malloc returns a NULL pointer, this function will return error
* condition \ref CborErrorOutOfMemory.
*
* On success, \c{*buffer} will contain a valid pointer that must be freed by
* calling \c{free()}. This is the case even for zero-length strings.
*
* The \a next pointer, if not null, will be updated to point to the next item
* after this string. If \a value points to the last item, then \a next will be
* invalid.
*
* \sa cbor_value_copy_byte_string(), cbor_value_dup_text_string()
*/
CborError _cbor_value_dup_string(const CborValue *value, void **buffer, size_t *buflen, CborValue *next)
{
assert(buffer);
assert(buflen);
*buflen = SIZE_MAX;
CborError err = _cbor_value_copy_string(value, NULL, buflen, NULL);
if (err)
return err;

++*buflen;
*buffer = malloc(*buflen);
if (!*buffer) {
/* out of memory */
return CborErrorOutOfMemory;
}
err = _cbor_value_copy_string(value, *buffer, buflen, next);
if (err) {
free(*buffer);
return err;
}
return CborNoError;
}

/* We return uintptr_t so that we can pass memcpy directly as the iteration
* function. The choice is to optimize for memcpy, which is used in the base
* parser API (cbor_value_copy_string), while memcmp is used in convenience API
Expand Down
92 changes: 92 additions & 0 deletions src/cborparser_dup_string.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/****************************************************************************
**
** Copyright (C) 2016 Intel Corporation
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice shall be included in
** all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
** THE SOFTWARE.
**
****************************************************************************/

#define _BSD_SOURCE 1
#include "cbor.h"
#include <stdlib.h>

/**
* \fn CborError cbor_value_dup_text_string(const CborValue *value, char **buffer, size_t *buflen, CborValue *next)
*
* Allocates memory for the string pointed by \a value and copies it into this
* buffer. The pointer to the buffer is stored in \a buffer and the number of
* bytes copied is stored in \a len (those variables must not be NULL).
*
* If \c malloc returns a NULL pointer, this function will return error
* condition \ref CborErrorOutOfMemory.
*
* On success, \c{*buffer} will contain a valid pointer that must be freed by
* calling \c{free()}. This is the case even for zero-length strings.
*
* The \a next pointer, if not null, will be updated to point to the next item
* after this string. If \a value points to the last item, then \a next will be
* invalid.
*
* \note This function does not perform UTF-8 validation on the incoming text
* string.
*
* \sa cbor_value_copy_text_string(), cbor_value_dup_byte_string()
*/

/**
* \fn CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer, size_t *buflen, CborValue *next)
*
* Allocates memory for the string pointed by \a value and copies it into this
* buffer. The pointer to the buffer is stored in \a buffer and the number of
* bytes copied is stored in \a len (those variables must not be NULL).
*
* If \c malloc returns a NULL pointer, this function will return error
* condition \ref CborErrorOutOfMemory.
*
* On success, \c{*buffer} will contain a valid pointer that must be freed by
* calling \c{free()}. This is the case even for zero-length strings.
*
* The \a next pointer, if not null, will be updated to point to the next item
* after this string. If \a value points to the last item, then \a next will be
* invalid.
*
* \sa cbor_value_copy_byte_string(), cbor_value_dup_text_string()
*/
CborError _cbor_value_dup_string(const CborValue *value, void **buffer, size_t *buflen, CborValue *next)
{
assert(buffer);
assert(buflen);
*buflen = SIZE_MAX;
CborError err = _cbor_value_copy_string(value, NULL, buflen, NULL);
if (err)
return err;

++*buflen;
*buffer = malloc(*buflen);
if (!*buffer) {
/* out of memory */
return CborErrorOutOfMemory;
}
err = _cbor_value_copy_string(value, *buffer, buflen, next);
if (err) {
free(*buffer);
return err;
}
return CborNoError;
}
1 change: 1 addition & 0 deletions src/src.pri
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ SOURCES += \
$$PWD/cborencoder_close_container_checked.c \
$$PWD/cborerrorstrings.c \
$$PWD/cborparser.c \
$$PWD/cborparser_dup_string.c \
$$PWD/cborpretty.c \
$$PWD/cbortojson.c \

Expand Down
3 changes: 2 additions & 1 deletion tests/cpp/tst_cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@

#include "../../src/cborencoder.c"
#include "../../src/cborparser.c"
#include "../../src/cborparser_dup_string.c"
#include "../../src/cborerrorstrings.c"

#include <QtTest>

// This is a compilation-only test.
// All it does is verify that the three source files above
// All it does is verify that the four source files above
// compile as C++ without errors.
class tst_Cpp : public QObject
{
Expand Down

0 comments on commit 4ce5669

Please sign in to comment.