#include <stdio.h>
#include <string.h>
#include <math.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
#include "plugin.h"
#include "data.h"
#include "projection.h"
struct map_selection *ms = sel;
struct map_rect_priv *mr;
+ if (!map)
+ return NULL;
mr = calloc(1, sizeof(*mr));
if (!mr)
return mr;
struct map_priv *m;
struct attr *data;
char buf[PATH_MAX];
+ struct stat st;
data=attr_search(attrs, NULL, attr_data);
if (! data)
g_free(m);
return NULL;
}
+ m->conv = NULL;
snprintf(buf, sizeof(buf), "%s.types", m->filename);
- dlog(1, "Looking for types in %s\n", buf);
- m->conv = g2n_conv_load(buf);
+ if (!stat(buf, &st)) {
+ dlog(1, "Loading custom types from %s\n", buf);
+ m->conv = g2n_conv_load(buf);
+ }
if (!m->conv) {
- char *cp;
- strcpy(buf, m->filename);
- cp = strrchr(buf ,'/');
- if (cp) {
- cp ++;
- *cp = '\0';
- strcat(buf, "garmintypes.txt");
- dlog(1, "Looking for types in %s\n", buf);
- m->conv = g2n_conv_load(buf);
- }
+ dlog(1, "Using builtin types\n");
+ m->conv = g2n_default_conv();
}
if (!m->conv) {
dlog(1, "Failed to load map types\n");
--- /dev/null
+/*
+ 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.
+
+*/
+
+/*
+ Street's are routable by:
+ ALL - by all
+ W pedestrian (1<<0)
+ B bycycle (1<<1)
+ M motorcycle (1<<2)
+ C car (1<<3)
+ T truck (1<<4)
+ L largetruck (1<<5)
+File format is:
+
+POINT
+0x0100 = town_label_1e5, Megapolis (10M +)
+0x0200 = town_label_5e4, Megapolis (5-10M)
+...
+0x1e00-0x1e3f = district_label, District, Province, State Name
+...
+POLYLINE
+0x00 = ALL, street_1_land, Road
+0x01 = MCTL, highway_land, Major HWY thick
+0x02 = MCTL, street_4_land, Principal HWY-thick
+0x03 = MCTL, street_2_land, Principal HWY-medium
+....
+POLYGONE
+0x01 = town_poly, City (>200k)
+0x02 = town_poly, City (<200k)
+0x03 = town_poly, Village
+
+ */
+
+#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 unsigned int get_rtmask(char *p)
+{
+ char *cp;
+ unsigned int mask = 0;
+ cp = p;
+ while (*cp) {
+ if (!strcasecmp(cp, "none"))
+ return 0;
+ if (!strcasecmp(cp, "all")) {
+ mask = ~0;
+ break;
+ } if (*cp == 'W')
+ mask |= RT_PEDESTRIAN;
+ else if (*cp == 'B')
+ mask |= RT_BYCYCLE;
+ else if (*cp == 'M')
+ mask |= RT_MOTORCYCLE;
+ else if (*cp == 'C')
+ mask |= RT_CAR;
+ else if (*cp == 'T')
+ mask |= RT_TRUCK;
+ else if (*cp == 'L')
+ mask |= RT_LONGTRUCK;
+ cp++;
+ }
+ return mask;
+}
+
+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];
+ char rtby[4096];
+ FILE *fp;
+ unsigned int minid, maxid, routable;
+ 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;
+ routable = 0;
+ 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;
+ }
+ // assume only lines are routable
+ if (type == 2) {
+ rc = sscanf(buf, "0x%04X = %[^\t, ] , %[^\t, ], %[^\n]",
+ &minid, rtby, 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;
+ }
+ routable = get_rtmask(rtby);
+ } else {
+ rc = sscanf(buf, "0x%04X - 0x%04X = %[^\t , ] , %[^\n]",
+ &minid, &maxid, ntype, descr);
+ if (rc != 4) {
+ maxid = 0;
+ rc = sscanf(buf, "0x%04X = %[^\t, ], %[^\n]",
+ &minid, ntype, descr);
+ if (rc != 3) {
+ 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, %d, %d, %d, \"%s\", \"%s\");\n",
+ type, minid, maxid, routable, 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 0;
+}