Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libcbor/examples/streaming_array.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 <stdlib.h>
9
#include "cbor.h"
10
11
void usage(void) {
12
printf("Usage: streaming_array <N>\n");
13
printf("Prints out serialized array [0, ..., N-1]\n");
14
exit(1);
15
}
16
17
#define BUFFER_SIZE 8
18
unsigned char buffer[BUFFER_SIZE];
19
FILE* out;
20
21
void flush(size_t bytes) {
22
if (bytes == 0) exit(1); // All items should be successfully encoded
23
if (fwrite(buffer, sizeof(unsigned char), bytes, out) != bytes) exit(1);
24
if (fflush(out)) exit(1);
25
}
26
27
/*
28
* Example of using the streaming encoding API to create an array of integers
29
* on the fly. Notice that a partial output is produced with every element.
30
*/
31
int main(int argc, char* argv[]) {
32
if (argc != 2) usage();
33
long n = strtol(argv[1], NULL, 10);
34
out = freopen(NULL, "wb", stdout);
35
if (!out) exit(1);
36
37
// Start an indefinite-length array
38
flush(cbor_encode_indef_array_start(buffer, BUFFER_SIZE));
39
// Write the array items one by one
40
for (size_t i = 0; i < n; i++) {
41
flush(cbor_encode_uint32(i, buffer, BUFFER_SIZE));
42
}
43
// Close the array
44
flush(cbor_encode_break(buffer, BUFFER_SIZE));
45
46
if (fclose(out)) exit(1);
47
}
48
49