mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 01:45:41 +02:00
A few more cases to populate the hash in addpool
This commit is contained in:
@@ -1336,7 +1336,8 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
|
|||||||
// To distinguish a null value
|
// To distinguish a null value
|
||||||
{
|
{
|
||||||
struct stringpool p;
|
struct stringpool p;
|
||||||
memfile_write(r->treefile, &p, sizeof(struct stringpool));
|
bool in_memory;
|
||||||
|
memfile_write(r->treefile, &p, sizeof(struct stringpool), in_memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
r->file_bbox[0] = r->file_bbox[1] = UINT_MAX;
|
r->file_bbox[0] = r->file_bbox[1] = UINT_MAX;
|
||||||
|
|||||||
+3
-1
@@ -49,10 +49,11 @@ int memfile_close(struct memfile *file) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memfile_write(struct memfile *file, void *s, long long len) {
|
int memfile_write(struct memfile *file, void *s, long long len, bool &in_memory) {
|
||||||
// If it is full, append to the file.
|
// If it is full, append to the file.
|
||||||
// If it is not full yet, append to the string in memory.
|
// If it is not full yet, append to the string in memory.
|
||||||
|
|
||||||
|
in_memory = false;
|
||||||
if (file->fp != NULL) {
|
if (file->fp != NULL) {
|
||||||
if (fwrite(s, sizeof(char), len, file->fp) != (size_t) len) {
|
if (fwrite(s, sizeof(char), len, file->fp) != (size_t) len) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -61,6 +62,7 @@ int memfile_write(struct memfile *file, void *s, long long len) {
|
|||||||
} else {
|
} else {
|
||||||
file->map.append(std::string((char *) s, len));
|
file->map.append(std::string((char *) s, len));
|
||||||
file->off += len;
|
file->off += len;
|
||||||
|
in_memory = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ struct memfile {
|
|||||||
|
|
||||||
struct memfile *memfile_open(int fd);
|
struct memfile *memfile_open(int fd);
|
||||||
int memfile_close(struct memfile *file);
|
int memfile_close(struct memfile *file);
|
||||||
int memfile_write(struct memfile *file, void *s, long long len);
|
int memfile_write(struct memfile *file, void *s, long long len, bool &in_memory);
|
||||||
void memfile_full(struct memfile *file);
|
void memfile_full(struct memfile *file);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -64,14 +64,20 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
|||||||
// the pool is full yet.
|
// the pool is full yet.
|
||||||
|
|
||||||
long long off = poolfile->off;
|
long long off = poolfile->off;
|
||||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
bool in_memory = false;
|
||||||
|
|
||||||
|
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (in_memory) {
|
||||||
|
dedup[hash_off] = off;
|
||||||
|
}
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,11 +100,12 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
|||||||
// to the newly-added strings.
|
// to the newly-added strings.
|
||||||
|
|
||||||
long long off = poolfile->off;
|
long long off = poolfile->off;
|
||||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
bool in_memory;
|
||||||
|
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
@@ -114,14 +121,18 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
|||||||
}
|
}
|
||||||
|
|
||||||
long long off = poolfile->off;
|
long long off = poolfile->off;
|
||||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
bool in_memory = false;
|
||||||
|
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
|
if (in_memory) {
|
||||||
|
dedup[hash_off] = off;
|
||||||
|
}
|
||||||
|
|
||||||
if (off >= LONG_MAX || treefile->off >= LONG_MAX) {
|
if (off >= LONG_MAX || treefile->off >= LONG_MAX) {
|
||||||
// Tree or pool is bigger than 2GB
|
// Tree or pool is bigger than 2GB
|
||||||
@@ -139,7 +150,7 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
|||||||
tsp.off = off;
|
tsp.off = off;
|
||||||
|
|
||||||
long long p = treefile->off;
|
long long p = treefile->off;
|
||||||
if (memfile_write(treefile, &tsp, sizeof(struct stringpool)) < 0) {
|
if (memfile_write(treefile, &tsp, sizeof(struct stringpool), in_memory) < 0) {
|
||||||
perror("memfile write");
|
perror("memfile write");
|
||||||
exit(EXIT_WRITE);
|
exit(EXIT_WRITE);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user