Preserve non-ASCII characters when making layernames from filenames

This commit is contained in:
Eric Fischer
2018-02-06 17:22:26 -08:00
parent 8726366a4c
commit 7ab94d43c6
4 changed files with 54 additions and 7 deletions
+30 -7
View File
@@ -16,7 +16,7 @@
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <wctype.h>
#include <errno.h>
#include <limits.h>
#include <sqlite3.h>
@@ -31,6 +31,7 @@
#include <set>
#include <map>
#include <cmath>
#include <locale.h>
#ifdef __APPLE__
#include <sys/types.h>
@@ -1169,16 +1170,35 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
}
// Trim out characters that can't be part of selector
std::string out;
for (size_t p = 0; p < trunc.size(); p++) {
if (isalpha(trunc[p]) || isdigit(trunc[p]) || trunc[p] == '_') {
out.append(trunc, p, 1);
wchar_t tmp[trunc.size() + 1];
size_t n = mbstowcs(tmp, trunc.c_str(), trunc.size() + 1);
if (n == (size_t) -1) {
perror("charset conversion");
exit(EXIT_FAILURE);
}
size_t out = 0;
for (size_t p = 0; p < n; p++) {
if (tmp[p] == L'_' || !(iswcntrl(tmp[p]) || iswspace(tmp[p]) || iswpunct(tmp[p]))) {
tmp[out++] = tmp[p];
}
}
sources[l].layer = out;
tmp[out] = L'\0';
char tmp2[(out + 1) * MB_CUR_MAX];
n = wcstombs(tmp2, tmp, (out + 1) * MB_CUR_MAX);
if (n == (size_t) -1) {
perror("charset conversion");
exit(EXIT_FAILURE);
}
sources[l].layer = tmp2;
if (sources[l].layer.size() == 0) {
sources[l].layer = "unknown";
}
if (!quiet) {
fprintf(stderr, "For layer %d, using name \"%s\"\n", (int) l, out.c_str());
fprintf(stderr, "For layer %d, using name \"%s\"\n", (int) l, sources[l].layer.c_str());
}
}
}
@@ -2223,6 +2243,9 @@ int main(int argc, char **argv) {
mtrace();
#endif
setlocale(LC_ALL, "C");
setlocale(LC_CTYPE, "");
init_cpus();
extern int optind;