Stop using strdup for tile-join matching

This commit is contained in:
Eric Fischer 2016-05-03 11:14:09 -07:00
parent 271ec3d154
commit d712edcdc9
3 changed files with 18 additions and 28 deletions

View File

@ -107,7 +107,7 @@ static void quote(std::string *buf, const char *s) {
buf->append(tmp, strlen(tmp));
}
static void aprintf(std::string *buf, const char *format, ...) {
void aprintf(std::string *buf, const char *format, ...) {
va_list ap;
char *tmp;

View File

@ -12,3 +12,5 @@ void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data,
void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, std::vector<std::string> &layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, std::vector<std::set<type_and_string> > &file_keys, int nlayers, int forcetable, const char *attribution);
void mbtiles_close(sqlite3 *outdb, char **argv);
void aprintf(std::string *buf, const char *format, ...);

View File

@ -65,40 +65,30 @@ void handle(std::string message, int z, unsigned x, unsigned y, std::vector<std:
for (int t = 0; t + 1 < feat.tags.size(); t += 2) {
const char *key = layer.keys[feat.tags[t]].c_str();
mvt_value &val = layer.values[feat.tags[t + 1]];
char *value;
std::string value;
int type = -1;
if (val.type == mvt_string) {
value = strdup(val.string_value.c_str());
if (value == NULL) {
perror("Out of memory");
exit(EXIT_FAILURE);
}
value = val.string_value;
type = VT_STRING;
} else if (val.type == mvt_int) {
if (asprintf(&value, "%lld", (long long) val.numeric_value.int_value) >= 0) {
type = VT_NUMBER;
}
aprintf(&value, "%lld", (long long) val.numeric_value.int_value);
type = VT_NUMBER;
} else if (val.type == mvt_double) {
if (asprintf(&value, "%g", val.numeric_value.double_value) >= 0) {
type = VT_NUMBER;
}
aprintf(&value, "%g", val.numeric_value.double_value);
type = VT_NUMBER;
} else if (val.type == mvt_float) {
if (asprintf(&value, "%g", val.numeric_value.float_value) >= 0) {
type = VT_NUMBER;
}
aprintf(&value, "%g", val.numeric_value.float_value);
type = VT_NUMBER;
} else if (val.type == mvt_bool) {
if (asprintf(&value, "%s", val.numeric_value.bool_value ? "true" : "false") >= 0) {
type = VT_BOOLEAN;
}
aprintf(&value, "%s", val.numeric_value.bool_value ? "true" : "false");
type = VT_BOOLEAN;
} else if (val.type == mvt_sint) {
if (asprintf(&value, "%lld", (long long) val.numeric_value.sint_value) >= 0) {
type = VT_NUMBER;
}
aprintf(&value, "%lld", (long long) val.numeric_value.sint_value);
type = VT_NUMBER;
} else if (val.type == mvt_uint) {
if (asprintf(&value, "%llu", (long long) val.numeric_value.uint_value) >= 0) {
type = VT_NUMBER;
}
aprintf(&value, "%llu", (long long) val.numeric_value.uint_value);
type = VT_NUMBER;
} else {
continue;
}
@ -116,7 +106,7 @@ void handle(std::string message, int z, unsigned x, unsigned y, std::vector<std:
}
if (header.size() > 0 && strcmp(key, header[0].c_str()) == 0) {
std::map<std::string, std::vector<std::string> >::iterator ii = mapping.find(std::string(value));
std::map<std::string, std::vector<std::string> >::iterator ii = mapping.find(value);
if (ii != mapping.end()) {
std::vector<std::string> fields = ii->second;
@ -158,8 +148,6 @@ void handle(std::string message, int z, unsigned x, unsigned y, std::vector<std:
}
}
}
free(value);
}
if (matched || !ifmatched) {