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;
}
示例#4
0
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;
}
示例#5
0
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]);
}