mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-04-24 13:05:55 +00:00
Improve error reporting
This commit is contained in:
parent
41447a4678
commit
bda20fe8a6
68
geojson.c
68
geojson.c
@ -134,37 +134,37 @@ int indexcmp(const void *v1, const void *v2) {
|
||||
}
|
||||
}
|
||||
|
||||
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream) {
|
||||
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, char *fname, json_pull *source) {
|
||||
size_t w = fwrite(ptr, size, nitems, stream);
|
||||
if (w != nitems) {
|
||||
fprintf(stderr, "Write failed: %s\n", strerror(errno));
|
||||
fprintf(stderr, "%s:%d: Write to temporary file failed: %s\n", fname, source->line, strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
void serialize_int(FILE *out, int n, long long *fpos) {
|
||||
fwrite_check(&n, sizeof(int), 1, out);
|
||||
void serialize_int(FILE *out, int n, long long *fpos, char *fname, json_pull *source) {
|
||||
fwrite_check(&n, sizeof(int), 1, out, fname, source);
|
||||
*fpos += sizeof(int);
|
||||
}
|
||||
|
||||
void serialize_uint(FILE *out, unsigned n, long long *fpos) {
|
||||
fwrite_check(&n, sizeof(unsigned), 1, out);
|
||||
void serialize_uint(FILE *out, unsigned n, long long *fpos, char *fname, json_pull *source) {
|
||||
fwrite_check(&n, sizeof(unsigned), 1, out, fname, source);
|
||||
*fpos += sizeof(unsigned);
|
||||
}
|
||||
|
||||
void serialize_string(FILE *out, char *s, long long *fpos) {
|
||||
void serialize_string(FILE *out, char *s, long long *fpos, char *fname, json_pull *source) {
|
||||
int len = strlen(s);
|
||||
|
||||
serialize_int(out, len + 1, fpos);
|
||||
fwrite_check(s, sizeof(char), len, out);
|
||||
fwrite_check("", sizeof(char), 1, out);
|
||||
serialize_int(out, len + 1, fpos, fname, source);
|
||||
fwrite_check(s, sizeof(char), len, out, fname, source);
|
||||
fwrite_check("", sizeof(char), 1, out, fname, source);
|
||||
*fpos += len + 1;
|
||||
}
|
||||
|
||||
void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE *out, int op) {
|
||||
void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE *out, int op, char *fname, json_pull *source) {
|
||||
if (j == NULL || j->type != JSON_ARRAY) {
|
||||
fprintf(stderr, "expected array for type %d\n", t);
|
||||
fprintf(stderr, "%s:%d: expected array for type %d\n", fname, source->line, t);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -180,7 +180,7 @@ void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE
|
||||
}
|
||||
}
|
||||
|
||||
parse_geometry(within, j->array[i], bbox, fpos, out, op);
|
||||
parse_geometry(within, j->array[i], bbox, fpos, out, op, fname, source);
|
||||
}
|
||||
} else {
|
||||
if (j->length == 2 && j->array[0]->type == JSON_NUMBER && j->array[1]->type == JSON_NUMBER) {
|
||||
@ -204,16 +204,16 @@ void parse_geometry(int t, json_object *j, unsigned *bbox, long long *fpos, FILE
|
||||
}
|
||||
}
|
||||
|
||||
serialize_int(out, op, fpos);
|
||||
serialize_uint(out, x, fpos);
|
||||
serialize_uint(out, y, fpos);
|
||||
serialize_int(out, op, fpos, fname, source);
|
||||
serialize_uint(out, x, fpos, fname, source);
|
||||
serialize_uint(out, y, fpos, fname, source);
|
||||
} else {
|
||||
fprintf(stderr, "malformed point");
|
||||
fprintf(stderr, "%s:%d: malformed point", fname, source->line);
|
||||
}
|
||||
}
|
||||
|
||||
if (mb_geometry[t] == GEOM_POLYGON) {
|
||||
serialize_int(out, VT_CLOSEPATH, fpos);
|
||||
serialize_int(out, VT_CLOSEPATH, fpos, fname, source);
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,7 +306,7 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
json_object *j = json_read(jp);
|
||||
if (j == NULL) {
|
||||
if (jp->error != NULL) {
|
||||
fprintf(stderr, "%d: %s\n", jp->line, jp->error);
|
||||
fprintf(stderr, "%s:%d: %s\n", fname, jp->line, jp->error);
|
||||
}
|
||||
|
||||
json_free(jp->root);
|
||||
@ -320,25 +320,25 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
|
||||
json_object *geometry = json_hash_get(j, "geometry");
|
||||
if (geometry == NULL) {
|
||||
fprintf(stderr, "%d: feature with no geometry\n", jp->line);
|
||||
fprintf(stderr, "%s:%d: feature with no geometry\n", fname, jp->line);
|
||||
goto next_feature;
|
||||
}
|
||||
|
||||
json_object *geometry_type = json_hash_get(geometry, "type");
|
||||
if (geometry_type == NULL || geometry_type->type != JSON_STRING) {
|
||||
fprintf(stderr, "%d: geometry without type string\n", jp->line);
|
||||
fprintf(stderr, "%s:%d: geometry without type string\n", fname, jp->line);
|
||||
goto next_feature;
|
||||
}
|
||||
|
||||
json_object *properties = json_hash_get(j, "properties");
|
||||
if (properties == NULL || properties->type != JSON_HASH) {
|
||||
fprintf(stderr, "%d: feature without properties hash\n", jp->line);
|
||||
fprintf(stderr, "%s:%d: feature without properties hash\n", fname, jp->line);
|
||||
goto next_feature;
|
||||
}
|
||||
|
||||
json_object *coordinates = json_hash_get(geometry, "coordinates");
|
||||
if (coordinates == NULL || coordinates->type != JSON_ARRAY) {
|
||||
fprintf(stderr, "%d: feature without coordinates array\n", jp->line);
|
||||
fprintf(stderr, "%s:%d: feature without coordinates array\n", fname, jp->line);
|
||||
goto next_feature;
|
||||
}
|
||||
|
||||
@ -349,7 +349,7 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
}
|
||||
}
|
||||
if (t >= GEOM_TYPES) {
|
||||
fprintf(stderr, "%d: Can't handle geometry type %s\n", jp->line, geometry_type->string);
|
||||
fprintf(stderr, "%s:%d: Can't handle geometry type %s\n", fname, jp->line, geometry_type->string);
|
||||
goto next_feature;
|
||||
}
|
||||
|
||||
@ -358,9 +358,9 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
|
||||
unsigned bbox[] = { UINT_MAX, UINT_MAX, 0, 0 };
|
||||
|
||||
serialize_int(metafile, mb_geometry[t], &fpos);
|
||||
parse_geometry(t, coordinates, bbox, &fpos, metafile, VT_MOVETO);
|
||||
serialize_int(metafile, VT_END, &fpos);
|
||||
serialize_int(metafile, mb_geometry[t], &fpos, fname, jp);
|
||||
parse_geometry(t, coordinates, bbox, &fpos, metafile, VT_MOVETO, fname, jp);
|
||||
serialize_int(metafile, VT_END, &fpos, fname, jp);
|
||||
|
||||
char *metakey[properties->length];
|
||||
char *metaval[properties->length];
|
||||
@ -389,17 +389,17 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
metaval[m] = properties->values[i]->string;
|
||||
m++;
|
||||
} else {
|
||||
fprintf(stderr, "%d: Unsupported metafile type\n", jp->line);
|
||||
fprintf(stderr, "%s:%d: Unsupported property type for %s\n", fname, jp->line, properties->keys[i]->string);
|
||||
goto next_feature;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serialize_int(metafile, m, &fpos);
|
||||
serialize_int(metafile, m, &fpos, fname, jp);
|
||||
for (i = 0; i < m; i++) {
|
||||
serialize_int(metafile, metatype[i], &fpos);
|
||||
serialize_string(metafile, metakey[i], &fpos);
|
||||
serialize_string(metafile, metaval[i], &fpos);
|
||||
serialize_int(metafile, metatype[i], &fpos, fname, jp);
|
||||
serialize_string(metafile, metakey[i], &fpos, fname, jp);
|
||||
serialize_string(metafile, metaval[i], &fpos, fname, jp);
|
||||
}
|
||||
|
||||
int z = 14;
|
||||
@ -412,7 +412,7 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
struct index ix;
|
||||
ix.index = encode(cx, cy);
|
||||
ix.fpos = start;
|
||||
fwrite_check(&ix, sizeof(struct index), 1, indexfile);
|
||||
fwrite_check(&ix, sizeof(struct index), 1, indexfile, fname, jp);
|
||||
} else {
|
||||
unsigned x, y;
|
||||
for (x = bbox[0] >> (32 - z); x <= bbox[2] >> (32 - z); x++) {
|
||||
@ -425,7 +425,7 @@ void read_json(FILE *f, char *fname, char *layername, int maxzoom, int minzoom,
|
||||
ix.index = encode(x << (32 - z), y << (32 - z));
|
||||
}
|
||||
ix.fpos = start;
|
||||
fwrite_check(&ix, sizeof(struct index), 1, indexfile);
|
||||
fwrite_check(&ix, sizeof(struct index), 1, indexfile, fname, jp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user