summaryrefslogtreecommitdiff
path: root/map/garmin/gentypes.c
diff options
context:
space:
mode:
Diffstat (limited to 'map/garmin/gentypes.c')
-rw-r--r--map/garmin/gentypes.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/map/garmin/gentypes.c b/map/garmin/gentypes.c
new file mode 100644
index 00000000..16682a55
--- /dev/null
+++ b/map/garmin/gentypes.c
@@ -0,0 +1,148 @@
+/*
+ Copyright (C) 2007 Alexander Atanasov <aatanasov@gmail.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301 USA
+
+ Garmin and MapSource are registered trademarks or trademarks
+ of Garmin Ltd. or one of its subsidiaries.
+
+*/
+
+/*
+File format is:
+
+POINT
+GROUP,0x0100 = town_label_1e5, Megapolis (10M +)
+GROUP,0x0200 = town_label_5e4, Megapolis (5-10M)
+...
+GROUP,0x1e00-0x1e3f = district_label, District, Province, State Name
+...
+POLYLINE
+GROUP,0x00 = street_1_land, Road
+GROUP,0x01 = highway_land, Major HWY thick
+GROUP,0x02 = street_4_land, Principal HWY-thick
+GROUP,0x03 = street_2_land, Principal HWY-medium
+....
+POLYGONE
+GROUP,0x01 = town_poly, City (>200k)
+GROUP,0x02 = town_poly, City (<200k)
+GROUP,0x03 = town_poly, Village
+
+GROUP is
+0 - good old garmin types in RGN1
+1 - NT types in RGN2-4 5 is completely unknown yet
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include <unistd.h>
+#include "item.h"
+#include "gar2navit.h"
+
+#define dlog(x, y...) fprintf(stderr, ## y)
+/*
+static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid,
+ unsigned short maxid, unsigned int routable, char *ntype,
+ char *descr)
+*/
+
+static void print_header(FILE *fp)
+{
+ fprintf(fp, "// This is autogenerated file -- DO NOT EDIT\n");
+ fprintf(fp, "struct gar2nav_conv *g2n_default_conv(void)\n"
+ "{\n"
+ "\tstruct gar2nav_conv *conv;\n"
+ "\n"
+ "\tconv = calloc(1, sizeof(*conv));\n"
+ "\tif (!conv)\n"
+ "\t\treturn conv;\n");
+}
+
+static int load_types_file(char *file, char *out)
+{
+ char buf[4096];
+ char descr[4096];
+ char ntype[4096];
+ FILE *fp;
+ unsigned int minid, maxid, group;
+ int rc;
+ int type = -1;
+ FILE *fpout = stdout;
+
+ fp = fopen(file, "r");
+ if (!fp)
+ return -1;
+ if (out) {
+ fpout = fopen(out, "w");
+ if (!fpout)
+ return -1;
+ }
+ print_header(fpout);
+ while (fgets(buf, sizeof(buf), fp)) {
+ if (*buf == '#' || *buf == '\n')
+ continue;
+ if (!strncasecmp(buf, "POINT", 5)) {
+ type = 1;
+ continue;
+ } else if (!strncasecmp(buf, "POI", 3)) {
+ type = 1;
+ continue;
+ } else if (!strncasecmp(buf, "POLYLINE", 8)) {
+ type = 2;
+ continue;
+ } else if (!strncasecmp(buf, "POLYGONE", 8)) {
+ type = 3;
+ continue;
+ }
+
+ rc = sscanf(buf, "%d, 0x%04X - 0x%04X = %[^\t , ] , %[^\n]",
+ &group, &minid, &maxid, ntype, descr);
+ if (rc != 5) {
+ maxid = 0;
+ rc = sscanf(buf, "%d, 0x%04X = %[^\t, ], %[^\n]",
+ &group,&minid, ntype, descr);
+ if (rc != 4) {
+ dlog(1, "Invalid line rc=%d:[%s]\n",rc, buf);
+ dlog(1, "minid=%04X ntype=[%s] des=[%s]\n",
+ minid, ntype, descr);
+ continue;
+ }
+ }
+
+ fprintf(fpout, "\tadd_def(conv, %d, %#.04x, %#.04x, %d, \"%s\", \"%s\");\n",
+ type, minid, maxid, group, ntype, descr);
+ }
+ fprintf(fpout, "\treturn conv;\n");
+ fprintf(fpout, "}\n");
+ fclose(fp);
+ if (out)
+ fclose(fpout);
+ return 1;
+}
+
+int main(int argc, char **argv)
+{
+ if (argc!=3) {
+ fprintf(stderr, "Usage: %s garmintypes.txt outfile.c\n",
+ argv[0]);
+ return -1;
+ }
+ if (load_types_file(argv[1], argv[2]) < 0) {
+ unlink(argv[2]);
+ return -1;
+ }
+ return 0;
+}