1 /*
2 * Copyright (c) 2014-2020 Pavel Kalvoda <me@pavelkalvoda.com>
3 *
4 * libcbor is free software; you can redistribute it and/or modify
5 * it under the terms of the MIT license. See LICENSE for details.
6 */
7
8 #include <stdio.h>
9 #include <string.h>
10
11 #include "cbor.h"
12
write_cbor_sequence(const char * filename)13 void write_cbor_sequence(const char* filename) {
14 FILE* file = fopen(filename, "wb");
15 if (!file) {
16 fprintf(stderr, "Error: Could not open file %s for writing\n", filename);
17 return;
18 }
19
20 // Create example CBOR items
21 cbor_item_t* int_item = cbor_build_uint32(42);
22 cbor_item_t* string_item = cbor_build_string("Hello, CBOR!");
23 cbor_item_t* array_item = cbor_new_definite_array(2);
24 assert(cbor_array_push(array_item, cbor_build_uint8(1)));
25 assert(cbor_array_push(array_item, cbor_build_uint8(2)));
26
27 // Serialize and write items to the file
28 unsigned char* buffer;
29 size_t buffer_size;
30
31 cbor_serialize_alloc(int_item, &buffer, &buffer_size);
32 fwrite(buffer, 1, buffer_size, file);
33 free(buffer);
34 cbor_decref(&int_item);
35
36 cbor_serialize_alloc(string_item, &buffer, &buffer_size);
37 fwrite(buffer, 1, buffer_size, file);
38 free(buffer);
39 cbor_decref(&string_item);
40
41 cbor_serialize_alloc(array_item, &buffer, &buffer_size);
42 fwrite(buffer, 1, buffer_size, file);
43 free(buffer);
44 cbor_decref(&array_item);
45
46 fclose(file);
47 printf("CBOR sequence written to %s\n", filename);
48 }
49
read_cbor_sequence(const char * filename)50 void read_cbor_sequence(const char* filename) {
51 FILE* file = fopen(filename, "rb");
52 if (!file) {
53 fprintf(stderr, "Error: Could not open file %s\n", filename);
54 return;
55 }
56
57 fseek(file, 0, SEEK_END);
58 size_t file_size = ftell(file);
59 fseek(file, 0, SEEK_SET);
60
61 unsigned char* buffer = malloc(file_size);
62 if (!buffer) {
63 fprintf(stderr, "Error: Could not allocate memory\n");
64 fclose(file);
65 return;
66 }
67
68 fread(buffer, 1, file_size, file);
69 fclose(file);
70
71 struct cbor_load_result result;
72 size_t offset = 0;
73
74 while (offset < file_size) {
75 cbor_item_t* item = cbor_load(buffer + offset, file_size - offset, &result);
76 if (result.error.code != CBOR_ERR_NONE) {
77 fprintf(stderr, "Error: Failed to parse CBOR item at offset %zu\n",
78 offset);
79 break;
80 }
81
82 cbor_describe(item, stdout);
83 printf("\n");
84
85 offset += result.read;
86 cbor_decref(&item);
87 }
88
89 free(buffer);
90 }
91
main(int argc,char * argv[])92 int main(int argc, char* argv[]) {
93 if (argc != 3) {
94 fprintf(stderr, "Usage: %s <r|w> <file>\n", argv[0]);
95 return 1;
96 }
97
98 if (strcmp(argv[1], "w") == 0) {
99 write_cbor_sequence(argv[2]);
100 } else if (strcmp(argv[1], "r") == 0) {
101 read_cbor_sequence(argv[2]);
102 } else {
103 fprintf(stderr,
104 "Error: First argument must be 'r' (read) or 'w' (write)\n");
105 return 1;
106 }
107
108 return 0;
109 }
110