mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 18:05:42 +02:00
Yet another temp file, for the tree of pointers into the string pool
This commit is contained in:
@@ -403,22 +403,22 @@ struct stringpool {
|
|||||||
};
|
};
|
||||||
long long pooltree = 0;
|
long long pooltree = 0;
|
||||||
|
|
||||||
long long addpool(struct memfile *poolfile, char *s, char type) {
|
long long addpool(struct memfile *poolfile, struct memfile *treefile, char *s, char type) {
|
||||||
long long *sp = &pooltree;
|
long long *sp = &pooltree;
|
||||||
|
|
||||||
while (*sp != 0) {
|
while (*sp != 0) {
|
||||||
int cmp = strcmp(s, poolfile->map + ((struct stringpool *) (poolfile->map + *sp))->off + 1);
|
int cmp = strcmp(s, poolfile->map + ((struct stringpool *) (treefile->map + *sp))->off + 1);
|
||||||
|
|
||||||
if (cmp == 0) {
|
if (cmp == 0) {
|
||||||
cmp = type - (poolfile->map + ((struct stringpool *) (poolfile->map + *sp))->off)[0];
|
cmp = type - (poolfile->map + ((struct stringpool *) (treefile->map + *sp))->off)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmp < 0) {
|
if (cmp < 0) {
|
||||||
sp = &(((struct stringpool *) (poolfile->map + *sp))->left);
|
sp = &(((struct stringpool *) (treefile->map + *sp))->left);
|
||||||
} else if (cmp > 0) {
|
} else if (cmp > 0) {
|
||||||
sp = &(((struct stringpool *) (poolfile->map + *sp))->right);
|
sp = &(((struct stringpool *) (treefile->map + *sp))->right);
|
||||||
} else {
|
} else {
|
||||||
return ((struct stringpool *) (poolfile->map + *sp))->off;
|
return ((struct stringpool *) (treefile->map + *sp))->off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -427,7 +427,7 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
|
|||||||
if (sp == &pooltree) {
|
if (sp == &pooltree) {
|
||||||
ssp = -1;
|
ssp = -1;
|
||||||
} else {
|
} else {
|
||||||
ssp = ((char *) sp) - poolfile->map;
|
ssp = ((char *) sp) - treefile->map;
|
||||||
}
|
}
|
||||||
|
|
||||||
long long off = poolfile->off;
|
long long off = poolfile->off;
|
||||||
@@ -445,13 +445,8 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
|
|||||||
tsp.right = 0;
|
tsp.right = 0;
|
||||||
tsp.off = off;
|
tsp.off = off;
|
||||||
|
|
||||||
// alignment
|
long long p = treefile->off;
|
||||||
while (poolfile->off % sizeof(long long) != 0) {
|
if (memfile_write(treefile, &tsp, sizeof(struct stringpool)) < 0) {
|
||||||
memfile_write(poolfile, "", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
long long p = poolfile->off;
|
|
||||||
if (memfile_write(poolfile, &tsp, sizeof(struct stringpool)) < 0) {
|
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@@ -459,7 +454,7 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
|
|||||||
if (ssp == -1) {
|
if (ssp == -1) {
|
||||||
pooltree = p;
|
pooltree = p;
|
||||||
} else {
|
} else {
|
||||||
*((long long *) (poolfile->map + ssp)) = p;
|
*((long long *) (treefile->map + ssp)) = p;
|
||||||
}
|
}
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
@@ -469,11 +464,13 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
|
|
||||||
char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1];
|
char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1];
|
||||||
char poolname[strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1];
|
char poolname[strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1];
|
||||||
|
char treename[strlen(tmpdir) + strlen("/tree.XXXXXXXX") + 1];
|
||||||
char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1];
|
char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1];
|
||||||
char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1];
|
char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1];
|
||||||
|
|
||||||
sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX");
|
sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX");
|
||||||
sprintf(poolname, "%s%s", tmpdir, "/pool.XXXXXXXX");
|
sprintf(poolname, "%s%s", tmpdir, "/pool.XXXXXXXX");
|
||||||
|
sprintf(treename, "%s%s", tmpdir, "/tree.XXXXXXXX");
|
||||||
sprintf(geomname, "%s%s", tmpdir, "/geom.XXXXXXXX");
|
sprintf(geomname, "%s%s", tmpdir, "/geom.XXXXXXXX");
|
||||||
sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX");
|
sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX");
|
||||||
|
|
||||||
@@ -487,6 +484,11 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
perror(poolname);
|
perror(poolname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
int treefd = mkstemp(treename);
|
||||||
|
if (treefd < 0) {
|
||||||
|
perror(treename);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
int geomfd = mkstemp(geomname);
|
int geomfd = mkstemp(geomname);
|
||||||
if (geomfd < 0) {
|
if (geomfd < 0) {
|
||||||
perror(geomname);
|
perror(geomname);
|
||||||
@@ -508,6 +510,11 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
perror(poolname);
|
perror(poolname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
struct memfile *treefile = memfile_open(treefd);
|
||||||
|
if (treefile == NULL) {
|
||||||
|
perror(treename);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
FILE *geomfile = fopen(geomname, "wb");
|
FILE *geomfile = fopen(geomname, "wb");
|
||||||
if (geomfile == NULL) {
|
if (geomfile == NULL) {
|
||||||
perror(geomname);
|
perror(geomname);
|
||||||
@@ -524,11 +531,15 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
|
|
||||||
unlink(metaname);
|
unlink(metaname);
|
||||||
unlink(poolname);
|
unlink(poolname);
|
||||||
|
unlink(treename);
|
||||||
unlink(geomname);
|
unlink(geomname);
|
||||||
unlink(indexname);
|
unlink(indexname);
|
||||||
|
|
||||||
// To distinguish a null value
|
// To distinguish a null value
|
||||||
memfile_write(poolfile, "", 1);
|
{
|
||||||
|
struct stringpool p;
|
||||||
|
memfile_write(treefile, &p, sizeof(struct stringpool));
|
||||||
|
}
|
||||||
|
|
||||||
unsigned file_bbox[] = {UINT_MAX, UINT_MAX, 0, 0};
|
unsigned file_bbox[] = {UINT_MAX, UINT_MAX, 0, 0};
|
||||||
unsigned midx = 0, midy = 0;
|
unsigned midx = 0, midy = 0;
|
||||||
@@ -690,8 +701,8 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
|
|
||||||
serialize_int(metafile, m, &metapos, fname);
|
serialize_int(metafile, m, &metapos, fname);
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
serialize_long_long(metafile, addpool(poolfile, metakey[i], VT_STRING), &metapos, fname);
|
serialize_long_long(metafile, addpool(poolfile, treefile, metakey[i], VT_STRING), &metapos, fname);
|
||||||
serialize_long_long(metafile, addpool(poolfile, metaval[i], metatype[i]), &metapos, fname);
|
serialize_long_long(metafile, addpool(poolfile, treefile, metaval[i], metatype[i]), &metapos, fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
long long geomstart = geompos;
|
long long geomstart = geompos;
|
||||||
@@ -768,6 +779,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
|
|||||||
fclose(metafile);
|
fclose(metafile);
|
||||||
fclose(geomfile);
|
fclose(geomfile);
|
||||||
fclose(indexfile);
|
fclose(indexfile);
|
||||||
|
memfile_close(treefile);
|
||||||
|
|
||||||
struct stat geomst;
|
struct stat geomst;
|
||||||
struct stat metast;
|
struct stat metast;
|
||||||
|
|||||||
Reference in New Issue
Block a user