blob: 0612ba44ae8216407a6109d3aafbd4ea732b9efa [file] [log] [blame]
Thiago Macieira54a0e102015-05-05 21:25:06 -07001#include "../src/cbor.h"
2
3#include <sys/stat.h>
4#include <assert.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <unistd.h>
8
Thiago Macieiraddd99e42016-04-12 10:30:30 -07009static uint8_t *readfile(const char *fname, size_t *size)
Thiago Macieira54a0e102015-05-05 21:25:06 -070010{
11 struct stat st;
12 FILE *f = fopen(fname, "rb");
13 if (!f)
14 return NULL;
15 if (fstat(fileno(f), &st) == -1)
16 return NULL;
Thiago Macieiraddd99e42016-04-12 10:30:30 -070017 uint8_t *buf = malloc(st.st_size);
Mahavir Jain7c349db2021-02-24 11:00:43 +053018 if (buf == NULL)
19 return NULL;
Svyatoslav Phirsov2b267842018-10-13 22:06:15 +030020 *size = fread(buf, st.st_size, 1, f) == 1 ? st.st_size : 0;
Thiago Macieira54a0e102015-05-05 21:25:06 -070021 fclose(f);
22 return buf;
23}
24
25static void indent(int nestingLevel)
26{
27 while (nestingLevel--)
Svyatoslav Phirsov722f6492020-02-09 17:49:31 +030028 printf(" ");
Thiago Macieira54a0e102015-05-05 21:25:06 -070029}
30
Thiago Macieiraddd99e42016-04-12 10:30:30 -070031static void dumpbytes(const uint8_t *buf, size_t len)
Thiago Macieira54a0e102015-05-05 21:25:06 -070032{
Svyatoslav Phirsov8acb09f2020-02-09 17:40:39 +030033 printf("\"");
Thiago Macieira54a0e102015-05-05 21:25:06 -070034 while (len--)
Svyatoslav Phirsov8acb09f2020-02-09 17:40:39 +030035 printf("\\x%02X", *buf++);
36 printf("\"");
Thiago Macieira54a0e102015-05-05 21:25:06 -070037}
38
Svyatoslav Phirsov1db99f92018-10-23 15:10:17 +030039static CborError dumprecursive(CborValue *it, int nestingLevel)
Thiago Macieira54a0e102015-05-05 21:25:06 -070040{
41 while (!cbor_value_at_end(it)) {
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -070042 CborError err;
Thiago Macieira54a0e102015-05-05 21:25:06 -070043 CborType type = cbor_value_get_type(it);
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -070044
45 indent(nestingLevel);
Thiago Macieira54a0e102015-05-05 21:25:06 -070046 switch (type) {
47 case CborArrayType:
48 case CborMapType: {
49 // recursive type
50 CborValue recursed;
Thiago Macieira2312efd2015-05-06 16:07:48 -070051 assert(cbor_value_is_container(it));
Thiago Macieira54a0e102015-05-05 21:25:06 -070052 puts(type == CborArrayType ? "Array[" : "Map[");
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -070053 err = cbor_value_enter_container(it, &recursed);
54 if (err)
55 return err; // parse error
56 err = dumprecursive(&recursed, nestingLevel + 1);
57 if (err)
58 return err; // parse error
59 err = cbor_value_leave_container(it, &recursed);
60 if (err)
61 return err; // parse error
Thiago Macieira54a0e102015-05-05 21:25:06 -070062 indent(nestingLevel);
63 puts("]");
64 continue;
65 }
66
67 case CborIntegerType: {
68 int64_t val;
69 cbor_value_get_int64(it, &val); // can't fail
70 printf("%lld\n", (long long)val);
71 break;
72 }
73
Thiago Macieiraddd99e42016-04-12 10:30:30 -070074 case CborByteStringType: {
75 uint8_t *buf;
76 size_t n;
77 err = cbor_value_dup_byte_string(it, &buf, &n, it);
78 if (err)
79 return err; // parse error
80 dumpbytes(buf, n);
81 puts("");
82 free(buf);
83 continue;
84 }
85
Thiago Macieira54a0e102015-05-05 21:25:06 -070086 case CborTextStringType: {
87 char *buf;
Thiago Macieira2312efd2015-05-06 16:07:48 -070088 size_t n;
Thiago Macieiraddd99e42016-04-12 10:30:30 -070089 err = cbor_value_dup_text_string(it, &buf, &n, it);
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -070090 if (err)
91 return err; // parse error
Svyatoslav Phirsov1a43b452020-02-09 17:52:42 +030092 printf("\"%s\"\n", buf);
Thiago Macieira54a0e102015-05-05 21:25:06 -070093 free(buf);
94 continue;
95 }
96
97 case CborTagType: {
98 CborTag tag;
99 cbor_value_get_tag(it, &tag); // can't fail
100 printf("Tag(%lld)\n", (long long)tag);
101 break;
102 }
103
104 case CborSimpleType: {
105 uint8_t type;
106 cbor_value_get_simple_type(it, &type); // can't fail
107 printf("simple(%u)\n", type);
108 break;
109 }
110
111 case CborNullType:
112 puts("null");
113 break;
114
115 case CborUndefinedType:
116 puts("undefined");
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -0700117 break;
Thiago Macieira54a0e102015-05-05 21:25:06 -0700118
119 case CborBooleanType: {
120 bool val;
121 cbor_value_get_boolean(it, &val); // can't fail
122 puts(val ? "true" : "false");
123 break;
124 }
125
126 case CborDoubleType: {
127 double val;
128 if (false) {
129 float f;
130 case CborFloatType:
131 cbor_value_get_float(it, &f);
132 val = f;
133 } else {
134 cbor_value_get_double(it, &val);
135 }
136 printf("%g\n", val);
137 break;
138 }
139 case CborHalfFloatType: {
140 uint16_t val;
141 cbor_value_get_half_float(it, &val);
142 printf("__f16(%04x)\n", val);
143 break;
144 }
145
146 case CborInvalidType:
147 assert(false); // can't happen
148 break;
149 }
150
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -0700151 err = cbor_value_advance_fixed(it);
152 if (err)
153 return err;
Thiago Macieira54a0e102015-05-05 21:25:06 -0700154 }
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -0700155 return CborNoError;
Thiago Macieira54a0e102015-05-05 21:25:06 -0700156}
157
158int main(int argc, char **argv)
159{
Svyatoslav Phirsov467b0eb2020-02-09 17:30:20 +0300160 if (argc != 2) {
Thiago Macieira54a0e102015-05-05 21:25:06 -0700161 puts("simplereader <filename>");
Svyatoslav Phirsov467b0eb2020-02-09 17:30:20 +0300162 return 1;
Thiago Macieira54a0e102015-05-05 21:25:06 -0700163 }
164
165 size_t length;
Thiago Macieiraddd99e42016-04-12 10:30:30 -0700166 uint8_t *buf = readfile(argv[1], &length);
Thiago Macieira54a0e102015-05-05 21:25:06 -0700167 if (!buf) {
168 perror("readfile");
169 return 1;
170 }
171
172 CborParser parser;
173 CborValue it;
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -0700174 CborError err = cbor_parser_init(buf, length, 0, &parser, &it);
175 if (!err)
176 err = dumprecursive(&it, 0);
Thiago Macieira54a0e102015-05-05 21:25:06 -0700177 free(buf);
178
Thiago Macieira54a0e102015-05-05 21:25:06 -0700179 if (err) {
180 fprintf(stderr, "CBOR parsing failure at offset %ld: %s\n",
Thiago Macieiraa43a4ef2015-05-06 20:25:18 -0700181 it.ptr - buf, cbor_error_string(err));
Thiago Macieira54a0e102015-05-05 21:25:06 -0700182 return 1;
183 }
184 return 0;
185}