bool address_dictionary_write(FILE *f) { if (address_dict == NULL || f == NULL) return false; if (!file_write_uint32(f, ADDRESS_DICTIONARY_SIGNATURE)) { return false; } uint32_t canonical_str_len = (uint32_t) cstring_array_used(address_dict->canonical); if (!file_write_uint32(f, canonical_str_len)) { return false; } if (!file_write_chars(f, address_dict->canonical->str->a, canonical_str_len)) { return false; } uint32_t num_values = (uint32_t) address_dict->values->n; if (!file_write_uint32(f, num_values)) { return false; } for (size_t i = 0; i < num_values; i++) { address_expansion_value_t *value = address_dict->values->a[i]; if (!address_expansion_value_write(value, f)) { return false; } } if (!trie_write(address_dict->trie, f)) { return false; } return true; }
static bool address_expansion_write(address_expansion_t expansion, FILE *f) { if (f == NULL) return false; uint32_t language_len = (uint32_t)strlen(expansion.language) + 1; if (!file_write_uint32(f, (uint32_t)expansion.canonical_index) || !file_write_uint32(f, language_len) || !file_write_chars(f, expansion.language, language_len) || !file_write_uint32(f, expansion.num_dictionaries) ) { return false; } for (size_t i = 0; i < expansion.num_dictionaries; i++) { if (!file_write_uint16(f, expansion.dictionary_ids[i])) { return false; } } if (!file_write_uint32(f, expansion.address_components)) { return false; } if (!file_write_uint8(f, expansion.separable)) { return false; } return true; }
static bool address_expansion_value_write(address_expansion_value_t *value, FILE *f) { if (value == NULL || value->expansions == NULL || f == NULL) return false; if (!file_write_uint32(f, value->components)) { return false; } uint32_t num_expansions = value->expansions->n; if (!file_write_uint32(f, num_expansions)) { return false; } for (size_t i = 0; i < num_expansions; i++) { address_expansion_t expansion = value->expansions->a[i]; if (!address_expansion_write(expansion, f)) { return false; } } return true; }
bool graph_write(graph_t *self, FILE *f) { if (self == NULL || self->indptr == NULL || self->indices == NULL) { return false; } if (!file_write_uint32(f, self->m) || !file_write_uint32(f, self->n) || !file_write_uint8(f, (uint8_t)self->fixed_rows)) { return false; } uint64_t len_indptr = (uint64_t)self->indptr->n; if (!file_write_uint64(f, len_indptr)) { return false; } for (int i = 0; i < len_indptr; i++) { if (!file_write_uint32(f, self->indptr->a[i])) { return false; } } uint64_t len_indices = (uint64_t)self->indices->n; if (!file_write_uint64(f, len_indices)) { return false; } for (int i = 0; i < len_indices; i++) { if (!file_write_uint32(f, self->indices->a[i])) { return false; } } return true; }
void ai_save_navmesh(FileHandle file, const NavMesh* navmesh) { assert(file); assert(navmesh); assert(navmesh->n_nodes > 3); file_write_uint32(file, navmesh->n_nodes); size_t n = navmesh->n_nodes; for(uint i = 0; i < n; ++i) { file_write_float(file, navmesh->navpoints[i].x); file_write_float(file, navmesh->navpoints[i].y); } uint n_neighbours = 0; for(uint i = 0; i < n; ++i) { file_write_uint32(file, navmesh->neighbour_count[i]); n_neighbours += navmesh->neighbour_count[i]; } for(uint i = 0; i < n_neighbours; ++i) file_write_uint32(file, navmesh->neighbours[i]); for(uint i = 0; i < n*n; ++i) file_write_float(file, navmesh->distance[i]); for(uint i = 0; i < n; ++i) file_write_float(file, navmesh->radius[i]); uint n_nn_grid_nodes = 0; for(uint i = 0; i < nn_grid_cells; ++i) { file_write_uint32(file, navmesh->nn_grid_count[i]); n_nn_grid_nodes += navmesh->nn_grid_count[i]; } for(uint i = 0; i < n_nn_grid_nodes; ++i) file_write_uint32(file, navmesh->nn_grid[i]); for(uint i = 0; i < vis_bitmap_size; ++i) file_write_uint32(file, navmesh->vis_bitmap[i]); }