graph_t *graph_read(FILE *f) { graph_t *g = malloc(sizeof(graph_t)); if (g == NULL) return NULL; g->indptr = NULL; g->indices = NULL; if (!file_read_uint32(f, &g->m) || !file_read_uint32(f, &g->n) || !file_read_uint8(f, (uint8_t *)&g->fixed_rows)) { goto exit_graph_allocated; } uint64_t len_indptr; if (!file_read_uint64(f, &len_indptr)) { goto exit_graph_allocated; } uint32_array *indptr = uint32_array_new_size(len_indptr); if (indptr == NULL) { goto exit_graph_allocated; } for (int i = 0; i < len_indptr; i++) { if (!file_read_uint32(f, indptr->a + i)) { goto exit_graph_allocated; } } indptr->n = (size_t)len_indptr; g->indptr = indptr; uint64_t len_indices; if (!file_read_uint64(f, &len_indices)) { goto exit_graph_allocated; } uint32_array *indices = uint32_array_new_size(len_indices); if (indices == NULL) { goto exit_graph_allocated; } for (int i = 0; i < len_indices; i++) { if (!file_read_uint32(f, indices->a + i)) { goto exit_graph_allocated; } } indices->n = (size_t)len_indices; g->indices = indices; return g; exit_graph_allocated: graph_destroy(g); return NULL; }
static bool address_expansion_read(FILE *f, address_expansion_t *expansion) { if (f == NULL) return false; if (!file_read_uint32(f, (uint32_t *)&expansion->canonical_index)) { return false; } uint32_t language_len; if (!file_read_uint32(f, &language_len)) { return false; } if (!file_read_chars(f, expansion->language, language_len)) { return false; } if (!file_read_uint32(f, (uint32_t *)&expansion->num_dictionaries)) { return false; } for (size_t i = 0; i < expansion->num_dictionaries; i++) { if (!file_read_uint16(f, (uint16_t *)expansion->dictionary_ids + i)) { return false; } } if (!file_read_uint32(f, &expansion->address_components)) { return false; } if (!file_read_uint8(f, (uint8_t *)&expansion->separable)) { return false; } return true; }