Ported messages from gear racing controller
[apps/native/gear-racing-car.git] / src / messages / writer.c
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Flora License, Version 1.1 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "messages/writer.h"
18
19 #include <endian.h>
20 #include <stdint.h>
21 #include <string.h>
22
23 int writer_init_sized(writer_t *writer, size_t length)
24 {
25         writer->data = malloc(length);
26         writer->length = 0;
27         writer->cap = length;
28
29         return writer->data ? 0 : -1;
30 }
31
32 static int _writer_resize_buffer(writer_t *writer, size_t new_size)
33 {
34         writer->data = realloc(writer->data, new_size);
35         writer->cap = new_size;
36
37         return writer->data ? 0 : -1;
38 }
39
40 static int _writer_bytes_append(writer_t *writer, void *buf, size_t len)
41 {
42         if (writer->length + len >= writer->cap)
43                 if (_writer_resize_buffer(writer, writer->cap + len))
44                         return -1;
45
46         memcpy(&writer->data[writer->length], (char*)buf, len);
47         writer->length += len;
48         return 0;
49 }
50
51 void writer_shutdown(writer_t *writer)
52 {
53         free(writer->data);
54 }
55
56 void writer_reset(writer_t *writer, size_t position)
57 {
58         writer->length = position > writer->cap ? writer->cap : position;
59 }
60
61 int writer_write_int32(writer_t *writer, int32_t value)
62 {
63         int32_t converted = htobe32(value);
64         return _writer_bytes_append(writer, &converted, sizeof(converted));
65 }
66
67 int writer_write_int64(writer_t *writer, int64_t value)
68 {
69         int64_t converted = htobe64(value);
70         return _writer_bytes_append(writer, &converted, sizeof(converted));
71 }
72
73 int writer_write_bool(writer_t *writer, bool value)
74 {
75         return writer_write_char(writer, value ? 1 : 0);
76 }
77
78 int writer_write_char(writer_t *writer, char value)
79 {
80         return _writer_bytes_append(writer, &value, sizeof(value));
81 }
82
83 int writer_write_string(writer_t *writer, const char *value)
84 {
85         size_t len = strlen(value);
86         if (writer_write_int32(writer, len)) {
87                 return -1;
88         }
89         return _writer_bytes_append(writer, (void*)value, sizeof(char) * len);
90 }