// bin.c - Example usage of bin.h flat file block storage #include #include #include #include #include typedef int32_t bin_key_t; #define BIN_IMPLEMENTATION #include "../include/bin.h" #define TEST_LENGTH 10 #define TEST_START -2 struct sample_t { bin_key_t time; double data; }; int main(void) { char const *path = "./test.bin"; FILE *bin = bin_init(path, sizeof(struct sample_t)); if (!bin) { fprintf(stderr, "Failed to initialize binary file\n"); return 1; } bin_key_t half = (bin_key_t)((TEST_START + TEST_LENGTH) / 2.0); // Insert half of the values using bin_insert() for (bin_key_t i = half - 1; i >= TEST_START; i--) { struct sample_t sample = {.time = i, .data = 2.0 * i}; bin_insert(bin, 0, &sample, 1); } // Append half of the values to the end for (bin_key_t i = half; i < TEST_START + TEST_LENGTH; i++) { struct sample_t sample = {.time = i, .data = 2.0 * i}; bin_append(bin, &sample, 1); } uint64_t l = bin_length(bin); (void)bin_block_size(bin); assert(l < 1000000); struct sample_t *x = calloc(l, sizeof(struct sample_t)); if (!x) { fprintf(stderr, "Failed to allocate memory\n"); bin_close(bin); return 1; } bin_read(bin, 0, x, l); // Test that all values are correct for (uint32_t i = 0; i < TEST_LENGTH; i++) { bin_key_t key = TEST_START + (int32_t)i; assert(x[i].time == key); assert(fabs(x[i].data - 2.0 * key) < 1e-9); } free(x); bin_close(bin); remove(path); return 0; }