Ported messages from gear racing controller
[apps/native/gear-racing-car.git] / src / messages / reader.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/reader.h"
18
19 #include <endian.h>
20 #include <stdint.h>
21 #include <string.h>
22
23 void reader_init_static(reader_t *reader, const char *data, size_t length)
24 {
25         reader->data = data;
26         reader->offset = 0;
27         reader->len = length;
28 }
29
30 void reader_reset(reader_t *reader)
31 {
32         reader->offset = 0;
33 }
34
35 int reader_read_int32(reader_t *reader, int32_t *value)
36 {
37         if (reader->offset + sizeof(*value) > reader->len)
38                 return -1;
39
40         *value = be32toh(*(uint32_t*)&reader->data[reader->offset]);
41
42         reader->offset += sizeof(*value);
43         return 0;
44 }
45
46 int reader_read_int64(reader_t *reader, int64_t *value)
47 {
48         if (reader->offset + sizeof(*value) > reader->len)
49                 return -1;
50
51         *value = be64toh(*(int64_t*)&reader->data[reader->offset]);
52
53         reader->offset += sizeof(*value);
54         return 0;
55 }
56
57 int reader_read_bool(reader_t *reader, bool *value)
58 {
59         char val;
60
61         if (reader_read_char(reader, &val)) {
62                 return -1;
63         }
64
65         *value = val ? true : false;
66         return 0;
67 }
68
69 int reader_read_char(reader_t *reader, char *value)
70 {
71         if (reader->offset + sizeof(*value) > reader->len)
72                 return -1;
73
74         *value = *(char*)&reader->data[reader->offset];
75
76         reader->offset += sizeof(*value);
77         return 0;
78 }
79
80 int reader_read_string(reader_t *reader, char **value)
81 {
82         int32_t len;
83         char *ret;
84
85         if (reader_read_int32(reader, &len)) {
86                 return -1;
87         }
88
89         if (len < 0)
90                 return -1;
91
92         if (len == 0) {
93                 *value = strdup("");
94                 return 0;
95         }
96
97         if (reader->offset + len > reader->len)
98                 return -1;
99
100         ret = (char*)malloc(sizeof(char) * (len + 1));
101         if (!ret) {
102                 return -1;
103         }
104
105         memcpy(ret, &reader->data[reader->offset], len);
106         reader->offset += len;
107
108         ret[len] = '\0';
109         *value = ret;
110         return 0;
111 }