22 #include <sys/types.h>
36 if (
t->free_nodes.avail >=
t->free_nodes.alloc) {
39 t->free_nodes.alloc += 100;
40 size =
t->free_nodes.alloc *
sizeof(off_t);
41 t->free_nodes.pos = (off_t *)realloc((
void *)
t->free_nodes.pos, size);
44 t->free_nodes.pos[
t->free_nodes.avail++] = pos;
48 while (
t->nb[level][
t->used[level][i]].pos != pos &&
54 which =
t->used[level][i];
55 t->nb[level][which].pos = -1;
56 t->nb[level][which].dirty = 0;
62 t->nb[level][
t->used[level][i + 1]].pos != -1) {
63 t->used[level][i] =
t->used[level][i + 1];
67 t->used[level][i] = which;
74 if (
t->free_nodes.avail > 0) {
75 t->free_nodes.avail--;
76 return lseek(
t->fd,
t->free_nodes.pos[
t->free_nodes.avail], SEEK_SET);
79 return lseek(
t->fd, 0, SEEK_END);
88 size += read(
t->fd,
b->rect.boundary,
t->rectsize);
100 lseek(
t->fd, nodepos, SEEK_SET);
101 size += read(
t->fd, &(n->
count),
sizeof(
int));
102 size += read(
t->fd, &(n->
level),
sizeof(
int));
104 for (i = 0; i <
MAXCARD; i++) {
117 while (
t->nb[
level][
t->used[
level][i]].pos != nodepos &&
122 which =
t->used[
level][i];
124 if (
t->nb[
level][which].pos != nodepos) {
126 if (
t->nb[
level][which].dirty) {
129 t->nb[
level][which].dirty = 0;
132 t->nb[
level][which].pos = nodepos;
138 t->used[
level][0] = which;
144 t->used[
level][0] = which;
150 return &(
t->nb[
level][which].n);
158 if (write(
t->fd,
b->rect.boundary,
t->rectsize) !=
t->rectsize)
159 G_fatal_error(
"RTreeWriteBranch(): Unable to write (%s)", strerror(errno));
162 G_fatal_error(
"RTreeWriteBranch(): Unable to write (%s)", strerror(errno));
175 if (write(
t->fd, &(n->
count),
sizeof(
int)) !=
sizeof(
int))
176 G_fatal_error(
"RTreeWriteNode(): Unable to write (%s)", strerror(errno));
178 if (write(
t->fd, &(n->
level),
sizeof(
int)) !=
sizeof(int))
179 G_fatal_error(
"RTreeWriteNode(): Unable to write (%s)", strerror(errno));
182 for (i = 0; i <
MAXCARD; i++) {
192 lseek(
t->fd, nodepos, SEEK_SET);
203 while (
t->nb[n->
level][
t->used[n->
level][i]].pos != nodepos &&
210 which =
t->used[n->
level][i];
212 t->nb[n->
level][which].dirty = 1;
218 t->used[n->
level][0] = which;
224 t->used[n->
level][0] = which;
234 for (i = 0; i <=
t->rootlevel; i++) {
236 if (
t->nb[i][j].dirty) {
238 t->nb[i][j].dirty = 0;
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
off_t RTreeGetNodePos(struct RTree *t)
void RTreeNodeChanged(struct RTree_Node *n, off_t nodepos, struct RTree *t)
size_t RTreeWriteBranch(struct RTree_Branch *b, struct RTree *t)
size_t RTreeReadNode(struct RTree_Node *n, off_t nodepos, struct RTree *t)
void RTreeFlushBuffer(struct RTree *t)
size_t RTreeWriteNode(struct RTree_Node *n, struct RTree *t)
size_t RTreeRewriteNode(struct RTree_Node *n, off_t nodepos, struct RTree *t)
void RTreeAddNodePos(off_t pos, int level, struct RTree *t)
struct RTree_Node * RTreeGetNode(off_t nodepos, int level, struct RTree *t)
size_t RTreeReadBranch(struct RTree_Branch *b, struct RTree *t)
#define assert(condition)
struct RTree_Branch * branch