Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libcbor/examples/streaming_parser.c
39586 views
1
/*
2
* Copyright (c) 2014-2020 Pavel Kalvoda <[email protected]>
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
#include "cbor.h"
11
12
#ifdef __GNUC__
13
#define UNUSED(x) __attribute__((__unused__)) x
14
#else
15
#define UNUSED(x) x
16
#endif
17
18
void usage(void) {
19
printf("Usage: streaming_parser [input file]\n");
20
exit(1);
21
}
22
23
/*
24
* Illustrates how one might skim through a map (which is assumed to have
25
* string keys and values only), looking for the value of a specific key
26
*
27
* Use the examples/data/map.cbor input to test this.
28
*/
29
30
const char* key = "a secret key";
31
bool key_found = false;
32
33
void find_string(void* UNUSED(_ctx), cbor_data buffer, uint64_t len) {
34
if (key_found) {
35
printf("Found the value: %.*s\n", (int)len, buffer);
36
key_found = false;
37
} else if (len == strlen(key)) {
38
key_found = (memcmp(key, buffer, len) == 0);
39
}
40
}
41
42
int main(int argc, char* argv[]) {
43
if (argc != 2) usage();
44
FILE* f = fopen(argv[1], "rb");
45
if (f == NULL) usage();
46
fseek(f, 0, SEEK_END);
47
size_t length = (size_t)ftell(f);
48
fseek(f, 0, SEEK_SET);
49
unsigned char* buffer = malloc(length);
50
fread(buffer, length, 1, f);
51
52
struct cbor_callbacks callbacks = cbor_empty_callbacks;
53
struct cbor_decoder_result decode_result;
54
size_t bytes_read = 0;
55
callbacks.string = find_string;
56
while (bytes_read < length) {
57
decode_result = cbor_stream_decode(buffer + bytes_read, length - bytes_read,
58
&callbacks, NULL);
59
bytes_read += decode_result.read;
60
}
61
62
free(buffer);
63
fclose(f);
64
}
65
66