Skip to content

Commit

Permalink
C design.
Browse files Browse the repository at this point in the history
  • Loading branch information
eerimoq committed Aug 22, 2019
1 parent d3225e3 commit ac43754
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 98 deletions.
5 changes: 4 additions & 1 deletion tests/Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
all:
gcc files/c_source/int32.c main.c
gcc \
files/c_source/int32.c \
files/c_source/address_book.c \
main.c
./a.out
225 changes: 136 additions & 89 deletions tests/files/c_source/address_book.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct decoder_t {
struct address_book_heap_t *heap_p;
};

static struct address_book_heap_t *heap_init(void *buf_p, size_t size)
static struct address_book_heap_t *heap_new(void *buf_p, size_t size)
{
struct address_book_heap_t *heap_p;

Expand Down Expand Up @@ -344,97 +344,15 @@ static void decoder_read_string(struct decoder_t *self_p,
}
}

void address_book_person_free(struct address_book_person_t *person_p)
{
free(person_p);
}

int address_book_person_phones_alloc(
struct address_book_person_t *person_p,
int length)
{
int res;
int i;
struct address_book_person_phone_number_t *items_p;

items_p = heap_alloc(person_p->heap_p, sizeof(*items_p) * length);

if (items_p != NULL) {
for (i = 0; i < length; i++) {
items_p[i].number_p = "";
items_p[i].type = address_book_person_phone_type_mobile_e;
}

person_p->phones.length = length;
person_p->phones.items_p = items_p;
res = 0;
} else {
res = -1;
}

return (res);
}

struct address_book_address_book_t *address_book_address_book_init(
void *workspace_p,
size_t size)
{
struct address_book_address_book_t *address_book_p;
struct address_book_heap_t *heap_p;

heap_p = heap_init(workspace_p, size);

if (heap_p == NULL) {
return (NULL);
}

address_book_p = heap_alloc(heap_p, sizeof(*address_book_p));

if (address_book_p != NULL) {
address_book_p->heap_p = heap_p;
address_book_p->people.length = 0;
}

return (address_book_p);
}

int address_book_address_book_people_alloc(
struct address_book_address_book_t *address_book_p,
int length)
{
int res;
int i;
struct address_book_person_t *items_p;

items_p = heap_alloc(address_book_p->heap_p, sizeof(*items_p) * length);

if (items_p != NULL) {
for (i = 0; i < length; i++) {
items_p[i].heap_p = address_book_p->heap_p;
items_p[i].name_p = "";
items_p[i].id = 0;
items_p[i].email_p = "";
}

address_book_p->people.length = length;
address_book_p->people.items_p = items_p;
res = 0;
} else {
res = -1;
}

return (res);
}

void address_book_person_phone_number_encode_inner(
static void address_book_person_phone_number_encode_inner(
struct encoder_t *encoder_p,
struct address_book_person_phone_number_t *phone_number_p)
{
encoder_prepend_varint(encoder_p, 2, phone_number_p->type);
encoder_prepend_string(encoder_p, 1, phone_number_p->number_p);
}

void address_book_person_phone_number_decode_inner(
static void address_book_person_phone_number_decode_inner(
struct decoder_t *decoder_p,
struct address_book_person_phone_number_t *phone_number_p)
{
Expand All @@ -457,7 +375,7 @@ void address_book_person_phone_number_decode_inner(
}
}

void address_book_person_encode_inner(
static void address_book_person_encode_inner(
struct encoder_t *encoder_p,
struct address_book_person_t *person_p)
{
Expand All @@ -479,7 +397,7 @@ void address_book_person_encode_inner(
encoder_prepend_string(encoder_p, 1, person_p->name_p);
}

void address_book_person_decode_inner(
static void address_book_person_decode_inner(
struct decoder_t *decoder_p,
struct address_book_person_t *person_p)
{
Expand Down Expand Up @@ -527,7 +445,7 @@ void address_book_person_decode_inner(
}
}

void address_book_address_book_encode_inner(
static void address_book_address_book_encode_inner(
struct encoder_t *encoder_p,
struct address_book_address_book_t *address_book_p)
{
Expand All @@ -544,7 +462,7 @@ void address_book_address_book_encode_inner(
}
}

void address_book_address_book_decode_inner(
static void address_book_address_book_decode_inner(
struct decoder_t *decoder_p,
struct address_book_address_book_t *address_book_p)
{
Expand All @@ -568,6 +486,135 @@ void address_book_address_book_decode_inner(
}
}

struct address_book_person_t *address_book_person_new(
void *workspace_p,
size_t size)
{
struct address_book_person_t *person_p;
struct address_book_heap_t *heap_p;

heap_p = heap_new(workspace_p, size);

if (heap_p == NULL) {
return (NULL);
}

person_p = heap_alloc(heap_p, sizeof(*person_p));

if (person_p != NULL) {
person_p->heap_p = heap_p;
person_p->name_p = "";
person_p->id = 0;
person_p->email_p = "";
person_p->phones.length = 0;
}

return (person_p);
}

int address_book_person_phones_alloc(
struct address_book_person_t *person_p,
int length)
{
int res;
int i;
struct address_book_person_phone_number_t *items_p;

items_p = heap_alloc(person_p->heap_p, sizeof(*items_p) * length);

if (items_p != NULL) {
for (i = 0; i < length; i++) {
items_p[i].number_p = "";
items_p[i].type = address_book_person_phone_type_mobile_e;
}

person_p->phones.length = length;
person_p->phones.items_p = items_p;
res = 0;
} else {
res = -1;
}

return (res);
}

int address_book_person_encode(
struct address_book_person_t *person_p,
uint8_t *encoded_p,
size_t size)
{
struct encoder_t encoder;

encoder_init(&encoder, encoded_p, size);
address_book_person_encode_inner(&encoder, person_p);

return (encoder_get_result(&encoder));
}

int address_book_person_decode(
struct address_book_person_t *person_p,
const uint8_t *encoded_p,
size_t size)
{
struct decoder_t decoder;

decoder_init(&decoder, encoded_p, size, person_p->heap_p);
address_book_person_decode_inner(&decoder, person_p);

return (decoder_get_result(&decoder));
}

struct address_book_address_book_t *address_book_address_book_new(
void *workspace_p,
size_t size)
{
struct address_book_address_book_t *address_book_p;
struct address_book_heap_t *heap_p;

heap_p = heap_new(workspace_p, size);

if (heap_p == NULL) {
return (NULL);
}

address_book_p = heap_alloc(heap_p, sizeof(*address_book_p));

if (address_book_p != NULL) {
address_book_p->heap_p = heap_p;
address_book_p->people.length = 0;
}

return (address_book_p);
}

int address_book_address_book_people_alloc(
struct address_book_address_book_t *address_book_p,
int length)
{
int res;
int i;
struct address_book_person_t *items_p;

items_p = heap_alloc(address_book_p->heap_p, sizeof(*items_p) * length);

if (items_p != NULL) {
for (i = 0; i < length; i++) {
items_p[i].heap_p = address_book_p->heap_p;
items_p[i].name_p = "";
items_p[i].id = 0;
items_p[i].email_p = "";
}

address_book_p->people.length = length;
address_book_p->people.items_p = items_p;
res = 0;
} else {
res = -1;
}

return (res);
}

int address_book_address_book_encode(
struct address_book_address_book_t *address_book_p,
uint8_t *encoded_p,
Expand Down
44 changes: 42 additions & 2 deletions tests/files/c_source/address_book.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ struct address_book_address_book_t {
} people;
};

/**
* Craete a new person in given workspace.
*
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Initialized address book, or NULL on failure.
*/
struct address_book_person_t *address_book_person_new(
void *workspace_p,
size_t size);

/**
* Allocate given number of phone numbers.
*
Expand All @@ -89,14 +101,42 @@ int address_book_person_phones_alloc(
int length);

/**
* Initialize an address book in given workspace.
* Encode message AddressBook defined in package address_book.
*
* @param[out] dst_p Buffer to encode into.
* @param[in] size Size of dst_p.
* @param[in] src_p Data to encode.
*
* @return Encoded data length or negative error code.
*/
int address_book_person_encode(
struct address_book_person_t *person_p,
uint8_t *encoded_p,
size_t size);

/**
* Decode message AddressBook defined in package address_book.
*
* @param[out] dst_p Decoded data.
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Number of bytes decoded or negative error code.
*/
int address_book_person_decode(
struct address_book_person_t *person_p,
const uint8_t *encoded_p,
size_t size);

/**
* Craete a new address book in given workspace.
*
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Initialized address book, or NULL on failure.
*/
struct address_book_address_book_t *address_book_address_book_init(
struct address_book_address_book_t *address_book_address_book_new(
void *workspace_p,
size_t size);

Expand Down
6 changes: 3 additions & 3 deletions tests/files/c_source/int32.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct decoder_t {
struct int32_heap_t *heap_p;
};

static struct int32_heap_t *heap_init(void *buf_p, size_t size)
static struct int32_heap_t *heap_new(void *buf_p, size_t size)
{
struct int32_heap_t *heap_p;

Expand Down Expand Up @@ -292,14 +292,14 @@ static int32_t decoder_read_int32(struct decoder_t *self_p,
return (0);
}

struct int32_message_t *int32_message_init(
struct int32_message_t *int32_message_new(
void *workspace_p,
size_t size)
{
struct int32_message_t *message_p;
struct int32_heap_t *heap_p;

heap_p = heap_init(workspace_p, size);
heap_p = heap_new(workspace_p, size);

if (heap_p == NULL) {
return (NULL);
Expand Down
4 changes: 2 additions & 2 deletions tests/files/c_source/int32.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ struct int32_message_t {
};

/**
* Initialize a message in given workspace.
* Create a new message in given workspace.
*
* @param[in] src_p Data to decode.
* @param[in] size Size of src_p.
*
* @return Initialized address book, or NULL on failure.
*/
struct int32_message_t *int32_message_init(
struct int32_message_t *int32_message_new(
void *workspace_p,
size_t size);

Expand Down

0 comments on commit ac43754

Please sign in to comment.